負載均衡Ribbon
負載均衡概述
- 實際環境中,我們往往會開啟很多個goods-service的集群。此時我們獲取的服務列表中就會有多個,到底該訪問哪一個呢
- 如何從多台服務器當中, 均衡的調用
Spring Cloud Ribbon
- Spring Cloud Ribbon是基於Netflix Ribbon實現的一套客戶端負載均衡的工具。
- Ribbon是Netflix發布的開源項目,主要功能是提供客戶端的軟件負載均衡算法,將Netflix的中間層服務連接在一起。
- Ribbon是Netflix發布的負載均衡器,Ribbon默認為我們提供了很多負載均衡算法,
- 例如輪詢、隨機等。當然,我們也可為Ribbon實現自定義的負載均衡算法。 在Spring
- Cloud中,當Ribbon與Eureka配合使用時,Ribbon可自動從Eureka Server獲取服務提供者地址列表,
- 並基於負載均衡算法,請求其中一個服務提供者實例。展示了Ribbon與Eureka配合使用時的架構。
Ribbon負載均衡配置
- 在Eureka當中已經包換了Ribbon,所以我們不需要單獨添加依賴
- 在RestTemplatet的Bean上再添加一個注解@LoadBalanced
- 在控制器當中定義要調用服務的實例名稱
默認是輪詢
負載均衡算法
- 隨機
- 輪詢
- hash:根據ip地址進行hash,通過ip值模於服務的數量,從而確定訪問認證
- 最少訪問
這些算法, 都不需要要我們去寫, 直接使用一個Robbin進行操作
核心組件IRule
IRule是是Ribbon對於負載均衡策略實現的接口
默認實現IRule接口的類:
- RoundRobinRule:輪詢
- RandomRule:隨機
- AvailabilityFilteringRule:會先過濾由於多次訪問故障處於斷路器跳閘狀態 的服務,還有並發的連接數據超過閾值的服務,然后對剩余的服務列表按照輪詢策略進行選取
- WeightedResponseTimeRule:根據平均響應時間計算所有服務的權重,響應時間越快權重越大,剛啟動時如果統計信息不足,則使用RoundRobinRule策略,等統計信息足夠時后,會切換到WeightedResponseTieRule
- RetryRule:先按照RoundRobinRule的策略獲取服務,如果獲取服務失敗,則在制定時間內會重試,再獲取不到, 則放棄
- BestAvailableRule:會先過濾掉由於多次訪問故障,而處於斷路器跳閘的服務,然后選擇一個並發量最小的服務
- ZoneAvoidanceRule:默認規則,符合判斷Server所在區域的性能和server的可用性選擇服務器
IRule配置:在啟動類添加
@Bean
public IRule Irule(){
return new RandomRule();//隨機
}
不同服務設置不同的策略
步驟:
- 新建兩個order和order1的子模塊
- 添加依賴
<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>
- 復制goods的文件到order,order1並修改名稱
- 修改配置文件
- 創建config包,寫goods和order的負載均衡配置
goodsconfig:
@Configuration
public class goodsConfig {
@Bean
public IRule goods(){
return new RoundRobinRule();
}
}
orderconfig:
@Configuration
public class OrderConfig {
@Bean
public IRule order(){
return new RandomRule();
}
}
- 啟動類添加
刪除:
Feigen
概述:
直接使用RestTemplate存在問題:在請求接口時,
路徑仍存在問題,只解決了服務名稱,沒有解決服務后,功能路徑問題,因為有可能是別人開發的, 你不知道后面功能路徑是什么
- 什么是Feign?
- Feign是一個聲明式WebService客戶端。 Feign旨在使編寫Java Http客戶端變得更容易。
- Feign在RestTemplate基礎上做了進一步封裝,由他來幫助我們定義和實現依賴服務接口的定義
- Feign可以把請求進行隱藏,你不用再自己拼接url,拼接參數等等操作,一切都交給Feign去做。
- 調用時,使用的負載均衡,是當前客戶端配置的負載均衡規則
使用步驟:
- 在客戶端引入依賴:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 在啟動類上面加上注解:@EnableFeignClients
- 創建服務FeignClient,創建一個service文件夾,在該文件下創建一個接口,在接口加上添加@FeignClient()注解 參數就是你的微服務名字
@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());
}
- 啟動訪問localhost:5000/getGoods.do