- 實際環境中,咱們每每會開啓不少個goods-service的集羣。此時咱們獲取的服務列表中就會有多個,到底該訪問哪個呢
- 如何從多臺服務器當中, 均衡的調用
- Spring Cloud Ribbon是基於Netflix Ribbon實現的一套客戶端負載均衡的工具。
- Ribbon是Netflix發佈的開源項目,主要功能是提供客戶端的軟件負載均衡算法,將Netflix的中間層服務鏈接在一塊兒。
- Ribbon是Netflix發佈的負載均衡器,Ribbon默認爲咱們提供了不少負載均衡算法,
- 例如輪詢、隨機等。固然,咱們也可爲Ribbon實現自定義的負載均衡算法。 在Spring
- Cloud中,當Ribbon與Eureka配合使用時,Ribbon可自動從Eureka Server獲取服務提供者地址列表,
- 並基於負載均衡算法,請求其中一個服務提供者實例。展現了Ribbon與Eureka配合使用時的架構。
- 隨機
- 輪詢
- hash:根據ip地址進行hash,經過ip值模於服務的數量,從而肯定訪問認證
- 最少訪問
這些算法, 都不須要要咱們去寫, 直接使用一個Robbin進行操做java
IRule是是Ribbon對於負載均衡策略實現的接口web
默認實現IRule接口的類:算法
- RoundRobinRule:輪詢
- RandomRule:隨機
- AvailabilityFilteringRule:會先過濾因爲屢次訪問故障處於斷路器跳閘狀態 的服務,還有併發的鏈接數據超過閾值的服務,而後對剩餘的服務列表按照輪詢策略進行選取
- WeightedResponseTimeRule:根據平均響應時間計算全部服務的權重,響應時間越快權重越大,剛啓動時若是統計信息不足,則使用RoundRobinRule策略,等統計信息足夠時後,會切換到WeightedResponseTieRule
- RetryRule:先按照RoundRobinRule的策略獲取服務,若是獲取服務失敗,則在制定時間內會重試,再獲取不到, 則放棄
- BestAvailableRule:會先過濾掉因爲屢次訪問故障,而處於斷路器跳閘的服務,而後選擇一個併發量最小的服務
- ZoneAvoidanceRule:默認規則,符合判斷Server所在區域的性能和server的可用性選擇服務器
IRule配置:在啓動類添加
spring
@Bean public IRule Irule(){ return new RandomRule();//隨機 }
步驟:服務器
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--Eureka的客戶端--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies>
@Configuration public class goodsConfig { @Bean public IRule goods(){ return new RoundRobinRule(); } }
orderconfig:架構
@Configuration public class OrderConfig { @Bean public IRule order(){ return new RandomRule(); } }
概述:併發
直接使用RestTemplate存在問題:在請求接口時,
路徑仍存在問題,只解決了服務名稱,沒有解決服務後,功能路徑問題,由於有多是別人開發的, 你不知道後面功能路徑是什麼app
- Feign是一個聲明式WebService客戶端。 Feign旨在使編寫Java Http客戶端變得更容易。
- Feign在RestTemplate基礎上作了進一步封裝,由他來幫助咱們定義和實現依賴服務接口的定義
- Feign能夠把請求進行隱藏,你不用再本身拼接url,拼接參數等等操做,一切都交給Feign去作。
- 調用時,使用的負載均衡,是當前客戶端配置的負載均衡規則
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
@FeignClient(name= "client-goods") public interface goodsFeignClient { @RequestMapping("/getGoods.do") public Object getGoods(); }
@Autowired goodsFeignClient goodsFeignClient; @RequestMapping("/getGoods.do") public ResponseResult getGoods(){ return ResponseResult.success("操做成功", goodsFeignClient.getGoods()); }