SpringCloud入門 - 微服務架構搭建(註冊中心、服務提供者、服務消費者)
前言:以maven多模組化的方法搭建 【專案原始碼我放文章最後了哦~】
一、SpringCloud入門 - 搭建環境
1.建立maven專案:
2.匯入依賴:
<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring-cloud.version>Finchley.SR1</spring-cloud.version> <springboot.version>2.0.5.RELEASE</springboot.version> </properties> <!--管理springboot和springcloud的版本--> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${springboot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
SpringCloud入門 - Eureka註冊中心
1.建立普通maven專案:
2.匯入依賴:
<dependencies> <!--springboot支援--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <!--Eureka服務端支援--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> </dependencies>
3.配置:
4.啟動入庫類:
二、SpringCloud入門 - 服務提供者
1.公共程式碼 - domain,query,介面,util ...
2.服務提供者
3.匯入依賴:
<dependencies>
<!--公共程式碼依賴-->
<dependency>
<groupId>com.zhengqing</groupId>
<artifactId>User_interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--springboot支援-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--eureka客戶端支援 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
4.配置
5.啟動類 - 入口:
6.編寫業務程式碼:
7.啟動測試:http://127.0.0.1:8001/provider/user/1
重新整理Eureka註冊中心 - 可稱為Eureka的服務端 --> 可看到剛註冊的提供者
注意事項: 自我保護引發的錯誤 - Eureka自我保護機制導致,不影響使用.
如何顯示ip地址: --> 客服端實現
三、SpringCloud入門 - 服務消費者-基礎
注意:這裡與註冊中心無關
1.建立一個普通maven專案
2.匯入依賴:
<dependencies>
<!--公共程式碼依賴-->
<dependency>
<groupId>com.zhengqing</groupId>
<artifactId>User_interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--springboot支援-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
3.配置
4.編寫業務:
5.啟動類:
6.啟動測試: http://127.0.0.1:9001/comsumer/user/1
四、SpringCloud入門加強 - 註冊中心叢集
為什麼需要叢集? --> 如果只有一個註冊中心伺服器,會存在單點故障所以要叢集
操作: 拷貝一份
搭建叢集:
1.配置對映hosts
2.配置 :
①EurekaServer_7001中
②EurekaServer_7002中
③User_provider_8001中
3.重新啟動測試:
7001中可看見7002
7002中可看見7001
8001中測試正常
再回到7001或7002中重新整理,有8001提供者 --> 配置正確!
五、SpringCloud入門加強 - 服務消費者(負載均衡)
為什麼需要負載均衡?
為了提供併發量,有時同一個服務提供者可以部署多個。這個客戶端在呼叫時要根據一定的負責均衡策略完成負載呼叫。
Spring cloud中常見負載均衡實現技術
1. Ribbon
2. Feign
Ribbon負載均衡
Ribbon是Netflix釋出的雲中間層服務開源專案,主要功能是提供客戶端負載均衡演算法。Ribbon客戶端元件提供一系列完善的配置項,如,連線超時,重試等。簡單的說,Ribbon是一個客戶端負載均衡器,我們可以在配置檔案中列出load Balancer後面所有的機器,Ribbon會自動的幫助你基於某種規則(如簡單輪詢,隨機連線等)去連線這些機器,我們也很容易使用Ribbon實現自定義的負載均衡演算法。
整合原理:
- I -> 單服務提供者操作
1.建立普通maven專案:
2.匯入依賴:
<dependencies>
<!--公共程式碼依賴-->
<dependency>
<groupId>com.zhengqing</groupId>
<artifactId>User_interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--springboot支援-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--服務呼叫-->
<!--eureka客戶端支援 - 服務消費者也要從註冊中心獲取可用服務列表 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- 客服端負載均衡實現-ribbon -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
</dependencies>
3. 配置 :
4.啟動類:
5.編寫業務程式碼:
- I -> 多服務提供者負載高階操作
1.拷貝一份
2.pom依賴:
<dependencies>
<!--公共程式碼依賴-->
<dependency>
<groupId>com.zhengqing</groupId>
<artifactId>User_interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--springboot支援-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--eureka客戶端支援 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
3.配置:
4.編寫程式碼:
5.啟動類:
6.測試: - 啟動2個provider: 即和
啟動consumer測試:http://127.0.0.1:9002/comsumer/user/1重新整理會發現name資料會變化
負載均衡策略:
① IRule:通過配置不同IRule的子類,可以選擇不同負載均衡策略,也就是從服務列表以特定策略選擇一個服務來完成呼叫。當然也可以自定義。所以負載均衡策略可以分為內建和自定義。
② 內建負載均衡策略
內建負載均衡規則類
規則描述
RoundRobinRule(預設)
簡單輪詢服務列表來選擇伺服器。它是Ribbon預設的負載均衡規則。
AvailabilityFilteringRule
對以下兩種伺服器進行忽略:
(1)在預設情況下,這臺伺服器如果3次連線失敗,這臺伺服器就會被設定為“短路”狀態。短路狀態將持續30秒,如果再次連線失敗,短路的持續時間就會幾何級地增加。
注意:可以通過修改配置loadbalancer.<clientName>.connectionFailureCountThreshold來修改連線失敗多少次之後被設定為短路狀態。預設是3次。
(2)併發數過高的伺服器。如果一個伺服器的併發連線數過高,配置了AvailabilityFilteringRule規則的客戶端也會將其忽略。併發連線數的上線,可以由客戶端的<clientName>.<clientConfigNameSpace>.ActiveConnectionsLimit屬性進行配置。
WeightedResponseTimeRule
為每一個伺服器賦予一個權重值。伺服器響應時間越長,這個伺服器的權重就越小。這個規則會隨機選擇伺服器,這個權重值會影響伺服器的選擇。
ZoneAvoidanceRule
以區域可用的伺服器為基礎進行伺服器的選擇。使用Zone對伺服器進行分類,這個Zone可以理解為一個機房、一個機架等。
BestAvailableRule
忽略哪些短路的伺服器,並選擇併發數較低的伺服器。
RandomRule
隨機選擇一個可用的伺服器。
Retry
重試機制的選擇邏輯
測試:在 中
Feign負載均衡
注意:從這個開始寫程式碼的時候 之前類和配置檔案 中的USER_PROVIDER都要換成USER-PROVIDER
ex:9002中,8001中需要換一下
為什麼呢?? 因為要報錯,不允許使用下劃線!!!!!!!!!!!!!!!!!!!!
溫馨小提示:前面的可以發現當我們通過RestTemplate呼叫其它服務的API時,所需要的引數須在請求的URL中進行拼接,如果引數少的話或許我們還可以忍受,一旦有多個引數的話,這時拼接請求字串就會效率低下,並且顯得好傻。
Feign是一個宣告式的Web Service客戶端,它的目的就是讓Web Service呼叫更加簡單。Feign提供了HTTP請求的模板,通過編寫簡單的介面和插入註解,就可以定義好HTTP請求的引數、格式、地址等資訊。而Feign則會完全代理HTTP請求,我們只需要像呼叫方法一樣呼叫它就可以完成服務請求及相關處理。Feign整合了Ribbon和Hystrix(關於Hystrix我們後面再講),可以讓我們不再需要顯式地使用這兩個元件。
總起來說,Feign具有如下特性:
①可插拔的註解支援,包括Feign註解和JAX-RS註解;
②支援可插拔的HTTP編碼器和解碼器;
③支援Hystrix和它的Fallback;
④支援Ribbon的負載均衡;
⑤支援HTTP請求和響應的壓縮。
這看起來有點像我們springmvc模式的Controller層的RequestMapping對映。這種模式是我們非常喜歡的。Feign是用@FeignClient來對映服務的。Feign是以介面方式進行呼叫,而不是通過RestTemplate來呼叫,feign底層還是ribbo,它進行了封裝,讓我們呼叫起來更加happy.
操作:
1.建立一個普通maven專案:
2.匯入依賴:
<dependencies>
<!--公共程式碼依賴-->
<dependency>
<groupId>com.zhengqing</groupId>
<artifactId>User_interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!--springboot支援-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<!--服務呼叫-->
<!--eureka客戶端支援 - 服務消費者也要從註冊中心獲取可用服務列表 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- feign的支援-可不加,因為有存在的 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
3.配置:
4.編寫程式碼:
①公共程式碼部分:
匯入依賴:
<dependencies> <!--springboot支援--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <!-- feign的支援-可不加,因為有存在的 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> </dependencies>
程式碼:
注意:要和服務提供者裡面訪問地址和引數等保持一致!
② 程式碼:
5.啟動類:
6.測試:- 啟動註冊中心 - 啟動服務提供者 -啟動服務消費者 http://127.0.0.1:9003/comsumer/user/1
我們也可以控制檯列印了...
最後小結: 當對同一個服務部署多個時,就要涉及負載均衡呼叫了 --> 可以選擇Ribbon和Feign 【一般使用Feign 因為通常使用介面類!!】