javascript
SpringCloud入门(一)
1. 系統(tǒng)架構(gòu)演變概述
#mermaid-svg-F8dvnEDl6rEgSP97 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-F8dvnEDl6rEgSP97 .label text{fill:#333}#mermaid-svg-F8dvnEDl6rEgSP97 .node rect,#mermaid-svg-F8dvnEDl6rEgSP97 .node circle,#mermaid-svg-F8dvnEDl6rEgSP97 .node ellipse,#mermaid-svg-F8dvnEDl6rEgSP97 .node polygon,#mermaid-svg-F8dvnEDl6rEgSP97 .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-F8dvnEDl6rEgSP97 .node .label{text-align:center;fill:#333}#mermaid-svg-F8dvnEDl6rEgSP97 .node.clickable{cursor:pointer}#mermaid-svg-F8dvnEDl6rEgSP97 .arrowheadPath{fill:#333}#mermaid-svg-F8dvnEDl6rEgSP97 .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-F8dvnEDl6rEgSP97 .flowchart-link{stroke:#333;fill:none}#mermaid-svg-F8dvnEDl6rEgSP97 .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-F8dvnEDl6rEgSP97 .edgeLabel rect{opacity:0.9}#mermaid-svg-F8dvnEDl6rEgSP97 .edgeLabel span{color:#333}#mermaid-svg-F8dvnEDl6rEgSP97 .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-F8dvnEDl6rEgSP97 .cluster text{fill:#333}#mermaid-svg-F8dvnEDl6rEgSP97 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-F8dvnEDl6rEgSP97 .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-F8dvnEDl6rEgSP97 text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-F8dvnEDl6rEgSP97 .actor-line{stroke:grey}#mermaid-svg-F8dvnEDl6rEgSP97 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-F8dvnEDl6rEgSP97 .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-F8dvnEDl6rEgSP97 #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-F8dvnEDl6rEgSP97 .sequenceNumber{fill:#fff}#mermaid-svg-F8dvnEDl6rEgSP97 #sequencenumber{fill:#333}#mermaid-svg-F8dvnEDl6rEgSP97 #crosshead path{fill:#333;stroke:#333}#mermaid-svg-F8dvnEDl6rEgSP97 .messageText{fill:#333;stroke:#333}#mermaid-svg-F8dvnEDl6rEgSP97 .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-F8dvnEDl6rEgSP97 .labelText,#mermaid-svg-F8dvnEDl6rEgSP97 .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-F8dvnEDl6rEgSP97 .loopText,#mermaid-svg-F8dvnEDl6rEgSP97 .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-F8dvnEDl6rEgSP97 .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-F8dvnEDl6rEgSP97 .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-F8dvnEDl6rEgSP97 .noteText,#mermaid-svg-F8dvnEDl6rEgSP97 .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-F8dvnEDl6rEgSP97 .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-F8dvnEDl6rEgSP97 .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-F8dvnEDl6rEgSP97 .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-F8dvnEDl6rEgSP97 .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-F8dvnEDl6rEgSP97 .section{stroke:none;opacity:0.2}#mermaid-svg-F8dvnEDl6rEgSP97 .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-F8dvnEDl6rEgSP97 .section2{fill:#fff400}#mermaid-svg-F8dvnEDl6rEgSP97 .section1,#mermaid-svg-F8dvnEDl6rEgSP97 .section3{fill:#fff;opacity:0.2}#mermaid-svg-F8dvnEDl6rEgSP97 .sectionTitle0{fill:#333}#mermaid-svg-F8dvnEDl6rEgSP97 .sectionTitle1{fill:#333}#mermaid-svg-F8dvnEDl6rEgSP97 .sectionTitle2{fill:#333}#mermaid-svg-F8dvnEDl6rEgSP97 .sectionTitle3{fill:#333}#mermaid-svg-F8dvnEDl6rEgSP97 .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-F8dvnEDl6rEgSP97 .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-F8dvnEDl6rEgSP97 .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-F8dvnEDl6rEgSP97 .grid path{stroke-width:0}#mermaid-svg-F8dvnEDl6rEgSP97 .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-F8dvnEDl6rEgSP97 .task{stroke-width:2}#mermaid-svg-F8dvnEDl6rEgSP97 .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-F8dvnEDl6rEgSP97 .taskText:not([font-size]){font-size:11px}#mermaid-svg-F8dvnEDl6rEgSP97 .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-F8dvnEDl6rEgSP97 .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-F8dvnEDl6rEgSP97 .task.clickable{cursor:pointer}#mermaid-svg-F8dvnEDl6rEgSP97 .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-F8dvnEDl6rEgSP97 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-F8dvnEDl6rEgSP97 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-F8dvnEDl6rEgSP97 .taskText0,#mermaid-svg-F8dvnEDl6rEgSP97 .taskText1,#mermaid-svg-F8dvnEDl6rEgSP97 .taskText2,#mermaid-svg-F8dvnEDl6rEgSP97 .taskText3{fill:#fff}#mermaid-svg-F8dvnEDl6rEgSP97 .task0,#mermaid-svg-F8dvnEDl6rEgSP97 .task1,#mermaid-svg-F8dvnEDl6rEgSP97 .task2,#mermaid-svg-F8dvnEDl6rEgSP97 .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-F8dvnEDl6rEgSP97 .taskTextOutside0,#mermaid-svg-F8dvnEDl6rEgSP97 .taskTextOutside2{fill:#000}#mermaid-svg-F8dvnEDl6rEgSP97 .taskTextOutside1,#mermaid-svg-F8dvnEDl6rEgSP97 .taskTextOutside3{fill:#000}#mermaid-svg-F8dvnEDl6rEgSP97 .active0,#mermaid-svg-F8dvnEDl6rEgSP97 .active1,#mermaid-svg-F8dvnEDl6rEgSP97 .active2,#mermaid-svg-F8dvnEDl6rEgSP97 .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-F8dvnEDl6rEgSP97 .activeText0,#mermaid-svg-F8dvnEDl6rEgSP97 .activeText1,#mermaid-svg-F8dvnEDl6rEgSP97 .activeText2,#mermaid-svg-F8dvnEDl6rEgSP97 .activeText3{fill:#000 !important}#mermaid-svg-F8dvnEDl6rEgSP97 .done0,#mermaid-svg-F8dvnEDl6rEgSP97 .done1,#mermaid-svg-F8dvnEDl6rEgSP97 .done2,#mermaid-svg-F8dvnEDl6rEgSP97 .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-F8dvnEDl6rEgSP97 .doneText0,#mermaid-svg-F8dvnEDl6rEgSP97 .doneText1,#mermaid-svg-F8dvnEDl6rEgSP97 .doneText2,#mermaid-svg-F8dvnEDl6rEgSP97 .doneText3{fill:#000 !important}#mermaid-svg-F8dvnEDl6rEgSP97 .crit0,#mermaid-svg-F8dvnEDl6rEgSP97 .crit1,#mermaid-svg-F8dvnEDl6rEgSP97 .crit2,#mermaid-svg-F8dvnEDl6rEgSP97 .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-F8dvnEDl6rEgSP97 .activeCrit0,#mermaid-svg-F8dvnEDl6rEgSP97 .activeCrit1,#mermaid-svg-F8dvnEDl6rEgSP97 .activeCrit2,#mermaid-svg-F8dvnEDl6rEgSP97 .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-F8dvnEDl6rEgSP97 .doneCrit0,#mermaid-svg-F8dvnEDl6rEgSP97 .doneCrit1,#mermaid-svg-F8dvnEDl6rEgSP97 .doneCrit2,#mermaid-svg-F8dvnEDl6rEgSP97 .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-F8dvnEDl6rEgSP97 .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-F8dvnEDl6rEgSP97 .milestoneText{font-style:italic}#mermaid-svg-F8dvnEDl6rEgSP97 .doneCritText0,#mermaid-svg-F8dvnEDl6rEgSP97 .doneCritText1,#mermaid-svg-F8dvnEDl6rEgSP97 .doneCritText2,#mermaid-svg-F8dvnEDl6rEgSP97 .doneCritText3{fill:#000 !important}#mermaid-svg-F8dvnEDl6rEgSP97 .activeCritText0,#mermaid-svg-F8dvnEDl6rEgSP97 .activeCritText1,#mermaid-svg-F8dvnEDl6rEgSP97 .activeCritText2,#mermaid-svg-F8dvnEDl6rEgSP97 .activeCritText3{fill:#000 !important}#mermaid-svg-F8dvnEDl6rEgSP97 .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-F8dvnEDl6rEgSP97 g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-F8dvnEDl6rEgSP97 g.classGroup text .title{font-weight:bolder}#mermaid-svg-F8dvnEDl6rEgSP97 g.clickable{cursor:pointer}#mermaid-svg-F8dvnEDl6rEgSP97 g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-F8dvnEDl6rEgSP97 g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-F8dvnEDl6rEgSP97 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-F8dvnEDl6rEgSP97 .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-F8dvnEDl6rEgSP97 .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-F8dvnEDl6rEgSP97 .dashed-line{stroke-dasharray:3}#mermaid-svg-F8dvnEDl6rEgSP97 #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-F8dvnEDl6rEgSP97 #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-F8dvnEDl6rEgSP97 #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-F8dvnEDl6rEgSP97 #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-F8dvnEDl6rEgSP97 #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-F8dvnEDl6rEgSP97 #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-F8dvnEDl6rEgSP97 #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-F8dvnEDl6rEgSP97 #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-F8dvnEDl6rEgSP97 .commit-id,#mermaid-svg-F8dvnEDl6rEgSP97 .commit-msg,#mermaid-svg-F8dvnEDl6rEgSP97 .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-F8dvnEDl6rEgSP97 .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-F8dvnEDl6rEgSP97 .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-F8dvnEDl6rEgSP97 g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-F8dvnEDl6rEgSP97 g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-F8dvnEDl6rEgSP97 g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-F8dvnEDl6rEgSP97 g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-F8dvnEDl6rEgSP97 g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-F8dvnEDl6rEgSP97 g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-F8dvnEDl6rEgSP97 .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-F8dvnEDl6rEgSP97 .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-F8dvnEDl6rEgSP97 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-F8dvnEDl6rEgSP97 .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-F8dvnEDl6rEgSP97 .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-F8dvnEDl6rEgSP97 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-F8dvnEDl6rEgSP97 .edgeLabel text{fill:#333}#mermaid-svg-F8dvnEDl6rEgSP97 .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-F8dvnEDl6rEgSP97 .node circle.state-start{fill:black;stroke:black}#mermaid-svg-F8dvnEDl6rEgSP97 .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-F8dvnEDl6rEgSP97 #statediagram-barbEnd{fill:#9370db}#mermaid-svg-F8dvnEDl6rEgSP97 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-F8dvnEDl6rEgSP97 .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-F8dvnEDl6rEgSP97 .statediagram-state .divider{stroke:#9370db}#mermaid-svg-F8dvnEDl6rEgSP97 .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-F8dvnEDl6rEgSP97 .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-F8dvnEDl6rEgSP97 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-F8dvnEDl6rEgSP97 .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-F8dvnEDl6rEgSP97 .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-F8dvnEDl6rEgSP97 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-F8dvnEDl6rEgSP97 .note-edge{stroke-dasharray:5}#mermaid-svg-F8dvnEDl6rEgSP97 .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-F8dvnEDl6rEgSP97 .error-icon{fill:#522}#mermaid-svg-F8dvnEDl6rEgSP97 .error-text{fill:#522;stroke:#522}#mermaid-svg-F8dvnEDl6rEgSP97 .edge-thickness-normal{stroke-width:2px}#mermaid-svg-F8dvnEDl6rEgSP97 .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-F8dvnEDl6rEgSP97 .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-F8dvnEDl6rEgSP97 .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-F8dvnEDl6rEgSP97 .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-F8dvnEDl6rEgSP97 .marker{fill:#333}#mermaid-svg-F8dvnEDl6rEgSP97 .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-F8dvnEDl6rEgSP97 {color: rgba(0, 0, 0, 0.75);font: ;}集中式架構(gòu)垂直拆分分布式服務(wù)SOA面向服務(wù)架構(gòu)微服務(wù)架構(gòu)2. 微服務(wù)架構(gòu)說明
SOA使用了ESB組件的面向服務(wù)架構(gòu):ESB自身實(shí)現(xiàn)復(fù)雜;應(yīng)用服務(wù)粒度較大,所有服務(wù)之間的通信都經(jīng)過ESB會降低通信速度;部署、測試ESB比較麻煩。
微服務(wù)架構(gòu):是一套使用小服務(wù)或者單一業(yè)務(wù)來開發(fā)單個(gè)應(yīng)用的方式或途徑。
微服務(wù)架構(gòu)特點(diǎn):
- 單一職責(zé)
- 服務(wù)粒度小
- 面向服務(wù)(對外暴露REST api)
- 服務(wù)之間相互獨(dú)立
與使用ESB的SOA架構(gòu)的區(qū)別:微服務(wù)架構(gòu)沒有使用ESB,有服務(wù)治理注冊中心;業(yè)務(wù)粒度小。
3. 服務(wù)調(diào)用方式說明
- RPC:基于socket,速度快,效率高;webservice、dubbo
- HTTP:基于TCP,封裝比較臃腫;對服務(wù)和調(diào)用方?jīng)]有任何技術(shù)、語言的限定,自由靈活;RESTful,Spring Cloud
4. Spring RestTemplate示例工程導(dǎo)入
一般情況下有如下三種http客戶端工具類包都可以方便的進(jìn)行http服務(wù)調(diào)用:
- httpClient
- okHttp
- JDK原生URLConnection
spring 提供了RestTemplate的工具類對上述的3種http客戶端工具類進(jìn)行了封裝,可在spring項(xiàng)目中使用RestTemplate進(jìn)行服務(wù)調(diào)用。
@RunWith(SpringRunner.class) @SpringBootTest public class RestTemplateTest {@Autowiredprivate RestTemplate restTemplate;@Testpublic void test(){String url = "http://localhost/user/8";//restTemplate可以對json格式字符串進(jìn)行反序列化User user = restTemplate.getForObject(url, User.class);System.out.println(user);} }5. Spring Cloud概述
- 整合的組件可以有很多組件;常見的組件有:eureka注冊中心,Gateway網(wǎng)關(guān),Ribbon負(fù)載均衡,Feign服務(wù)調(diào)用,Hystrix熔斷器。在有需要的時(shí)候項(xiàng)目添加對于的啟動器依賴即可。
- 版本特征:以英文單詞命名(倫敦地鐵站名)
6. 創(chuàng)建微服務(wù)工程
需求:查詢數(shù)據(jù)庫中的用戶數(shù)據(jù)并輸出到瀏覽器
- 父工程heima-springcloud:添加spring boot父坐標(biāo)和管理其它組件的依賴
- 用戶服務(wù)工程user-service:整合mybatis查詢數(shù)據(jù)庫中用戶數(shù)據(jù);提供查詢用戶服務(wù)
- 服務(wù)消費(fèi)工程consumer-demo:利用查詢用戶服務(wù)獲取用戶數(shù)據(jù)并輸出到瀏覽器
小結(jié):
<!-- springCloud --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency>通過 scope 的import可以繼承 spring-cloud-dependencies 工程中的依賴
7. 搭建配置user-service工程
需求:可以訪問http://localhost:9091/user/8輸出用戶數(shù)據(jù)
實(shí)現(xiàn)步驟:
- 添加啟動器依賴
- 編寫配置文件
8. 搭建配置consumer-demo工程
目標(biāo):編寫測試類使用restTemplate訪問user-service的路徑根據(jù)id查詢用戶
分析:
需求:訪問http://localhost:8080/consumer/8 使用RestTemplate獲取http://localhost:9091/user/8的數(shù)據(jù)
實(shí)現(xiàn)步驟:
- 服務(wù)管理
如何自動注冊和發(fā)現(xiàn)
如何實(shí)現(xiàn)狀態(tài)監(jiān)管
如何實(shí)現(xiàn)動態(tài)路由 - 服務(wù)如何實(shí)現(xiàn)負(fù)載均衡
- 服務(wù)如何解決容災(zāi)問題
- 服務(wù)如何實(shí)現(xiàn)統(tǒng)一配置
上述的問題都可以通過Spring Cloud的各種組件解決。
9. Eureka注冊中心說明
Eureka的主要功能是進(jìn)行服務(wù)管理,定期檢查服務(wù)狀態(tài),返回服務(wù)地址列表。
10. 搭建eureka-server工程
Eureka是服務(wù)注冊中心,只做服務(wù)注冊;自身并不提供服務(wù)也不消費(fèi)服務(wù)。可以搭建web工程使用Eureka,可以使用Spring Boot方式搭建。
搭建步驟:
小結(jié):
- 啟動器依賴
- 配置文件
11. 服務(wù)注冊與發(fā)現(xiàn)
- 服務(wù)注冊:在服務(wù)提供工程user-service上添加Eureka客戶端依賴;自動將服務(wù)注冊到EurekaServer服務(wù)地址列表。
- 添加依賴;
- 改造啟動引導(dǎo)類;添加開啟Eureka客戶端發(fā)現(xiàn)的注解;
- 修改配置文件;設(shè)置Eureka 服務(wù)地址
- 服務(wù)發(fā)現(xiàn):在服務(wù)消費(fèi)工程consumer-demo上添加Eureka客戶端依賴;可以使用工具類根據(jù)服務(wù)名稱獲取對應(yīng)的服務(wù)地址列表。
- 添加依賴;
- 改造啟動引導(dǎo)類;添加開啟Eureka客戶端發(fā)現(xiàn)的注解;
- 修改配置文件;設(shè)置Eureka 服務(wù)地址;
- 改造處理器類ConsumerController,可以使用工具類DiscoveryClient根據(jù)服務(wù)名稱獲取對應(yīng)服務(wù)地址列表。
添加依賴
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>修改配置文件
eureka:client:service-url:defaultZone: http://127.0.0.1:10086/eureka服務(wù)注冊
@SpringBootApplication @MapperScan("com.gogo.mapper") @EnableDiscoveryClient public class Application {public static void main(String[] args) {SpringApplication.run(Application.class,args);} }服務(wù)發(fā)現(xiàn)
@RestController @RequestMapping("/consumer") public class ConsumerController {@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate DiscoveryClient discoveryClient;@GetMapping("/{id}")public User get(@PathVariable long id){List<ServiceInstance> instances = discoveryClient.getInstances("user-service");ServiceInstance serviceInstance = instances.get(0);return restTemplate.getForObject("http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/user/"+id, User.class);}}12. Eureka Server高可用配置
分析:
Eureka Server是一個(gè)web應(yīng)用,可以啟動多個(gè)實(shí)例(配置不同端口)保證Eureka Server的高可用。
高可用配置:將Eureka Server作為一個(gè)服務(wù)注冊到其它Eureka Server,這樣多個(gè)Eureka Server之間就能夠互相發(fā)現(xiàn)對方,同步服務(wù),實(shí)現(xiàn)Eureka Server集群。
13. Eureka客戶端與服務(wù)端配置
配置eureka客戶端user-service的注冊、續(xù)約等配置項(xiàng),配置eureka客戶端consumer-demo的獲取服務(wù)間隔時(shí)間;了解失效剔除和自我保護(hù)
- Eureka客戶端工程
- user-service 服務(wù)提供
- 服務(wù)地址使用ip方式
- 續(xù)約
- consumer-demo 服務(wù)消費(fèi)
- 獲取服務(wù)地址的頻率
- user-service 服務(wù)提供
- Eureka服務(wù)端工程 eureka-server
- 失效剔除
- 自我保護(hù)
- user-service
- consumer-demo
- eureka-server
15. Ribbon負(fù)載均衡應(yīng)用
分析:
需求:可以使用RestTemplate訪問http://user-service/user/8獲取服務(wù)數(shù)據(jù)。
可以使用Ribbon負(fù)載均衡:在執(zhí)行RestTemplate發(fā)送服務(wù)地址請求的時(shí)候,使用負(fù)載均衡攔截器攔截,根據(jù)服務(wù)名獲取服務(wù)地址列表,使用Ribbon負(fù)載均衡算法從服務(wù)地址列表中選擇一個(gè)服務(wù)地址,訪問該地址獲取服務(wù)數(shù)據(jù)。
實(shí)現(xiàn)步驟:
小結(jié):
在實(shí)例化RestTemplate的時(shí)候使用@LoadBalanced,服務(wù)地址直接可以使用服務(wù)名。
16. 熔斷器Hystrix簡介
目標(biāo):了解熔斷器Hystrix的作用
小結(jié):
Hystrix是一個(gè)延遲和容錯庫,用于隔離訪問遠(yuǎn)程服務(wù),防止出現(xiàn)級聯(lián)失敗。
17. 線程隔離&服務(wù)降級
Hystrix解決雪崩效應(yīng):
-
線程隔離:用戶請求不直接訪問服務(wù),而是使用線程池中空閑的線程訪問服務(wù),加速失敗判斷時(shí)間。
-
服務(wù)降級:及時(shí)返回服務(wù)調(diào)用失敗的結(jié)果,讓線程不因?yàn)榈却?wù)而阻塞。
-
consumer-demo中添加依賴
- 開啟熔斷
- 降級邏輯
- 修改超時(shí)配置
18. 服務(wù)熔斷演示
@RestController @RequestMapping("/consumer") @Slf4j @DefaultProperties(defaultFallback = "defaultFall") public class ConsumerController {@Autowiredprivate RestTemplate restTemplate;@GetMapping("/{id}") /* @HystrixCommand(fallbackMethod = "fall")*/@HystrixCommandpublic String get(@PathVariable long id){ if(id==1) throw new RuntimeException("不行的");return restTemplate.getForObject("http://"+"user-service"+"/user/"+id, String.class);}public String fall(long id){log.error("查詢{}失敗",id);return "網(wǎng)絡(luò)太差了";}public String defaultFall(){return "默認(rèn)網(wǎng)絡(luò)太差了";}} hystrix:command:default:execution:isolation:thread:timeoutInMilliseconds: 2000circuitBreaker:errorThresholdPercentage: 50 # 觸發(fā)熔斷錯誤比例閾值,默認(rèn)值50%sleepWindowInMilliseconds: 10000 # 熔斷后休眠時(shí)長,默認(rèn)值5秒requestVolumeThreshold: 10 # 熔斷觸發(fā)最小請求次數(shù),默認(rèn)值是20總結(jié)
以上是生活随笔為你收集整理的SpringCloud入门(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode 1052. 爱生气的书
- 下一篇: 晚上做梦梦到梳子是什么意思