1 概述
- LoadBalancer: 被包含於spring cloud commons下用來替換以前的ribbon元件,一個客戶端負載均衡器。不僅支援RestTemplate,還支援WebClient(Spring Web Flux中提供的功能,可以實現響應式非同步請求)。
- 客戶端負載均衡和服務端負載均衡有什麼區別
- 服務端負載均衡:負載均衡在伺服器上實現
- 客戶端負載均衡:呼叫微服務介面的時候,會在註冊中心獲取註冊資訊服務列表之後快取到JVM本地,從而在本地實現RPC遠端服務技術
2 Windows環境下Consul配置持久化
-
根路徑下新增儲存配置的資料夾 如
/mydata
-
根路徑下建立一個指令碼檔案
consul_start.bat
@echo.服務啟動...... @echo off @sc create Consul binpath= "F:\consul_1.19.0_windows_386\consul.exe agent -server -ui -bind=127.0.0.1 -client=0.0.0.0 -bootstrap-expect 1 -data-dir F:\consul_1.19.0_windows_386\mydata " @net start Consul @sc config Consul start= AUTO @echo.Consul start is OK......success @pause
-
之後啟動consul就雙擊指令碼檔案啟動即可,然後登入
localhost:8500
編寫配置即可持久化
3 客戶端服務呼叫負載均衡
- 引入負載均衡的依賴
<!--loadbalancer-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
-
修改consumer的controller,新增一個呼叫微服務的介面,例如下述程式碼
@GetMapping("/consumer/pay/get/info") public ResultData getConfigInfo(){ return restTemplate.getForObject(PaymentSrv_URL+"/pay/get/info",ResultData.class); }
-
訪問測試
4 負載均衡演算法
實際上使用預設的輪詢就已經足夠了
-
輪詢 RoundRobinLoadBalancer implements ReactorServiceInstanceLoadBalancer
- 負載均衡演算法:rest介面第幾次請求數 % 伺服器叢集總數量 = 實際呼叫伺服器位置下標 ,每次服務重啟動後rest介面計數從1開始。
-
隨機 RandomLoadBalancer implements ReactorServiceInstanceLoadBalancer
切換演算法:
@Configuration
@LoadBalancerClient(
//下面的value值大小寫一定要和consul裡面的名字一樣,必須一樣
value = "cloud-payment-service",configuration = RestTemplateConfig.class)
public class RestTemplateConfig
{
@Bean
@LoadBalanced //使用@LoadBalanced註解賦予RestTemplate負載均衡的能力
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Bean
ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
LoadBalancerClientFactory loadBalancerClientFactory) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
}
}