day03-loadbalancer

yuqiu2004發表於2024-07-09

1 概述

  1. LoadBalancer: 被包含於spring cloud commons下用來替換以前的ribbon元件,一個客戶端負載均衡器。不僅支援RestTemplate,還支援WebClient(Spring Web Flux中提供的功能,可以實現響應式非同步請求)。
  2. 客戶端負載均衡和服務端負載均衡有什麼區別
    • 服務端負載均衡:負載均衡在伺服器上實現
    • 客戶端負載均衡:呼叫微服務介面的時候,會在註冊中心獲取註冊資訊服務列表之後快取到JVM本地,從而在本地實現RPC遠端服務技術

2 Windows環境下Consul配置持久化

  1. 根路徑下新增儲存配置的資料夾 如/mydata

  2. 根路徑下建立一個指令碼檔案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
    
  3. 之後啟動consul就雙擊指令碼檔案啟動即可,然後登入localhost:8500編寫配置即可持久化

3 客戶端服務呼叫負載均衡

  1. 引入負載均衡的依賴
<!--loadbalancer-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
  1. 修改consumer的controller,新增一個呼叫微服務的介面,例如下述程式碼

        @GetMapping("/consumer/pay/get/info")
        public ResultData getConfigInfo(){
            return restTemplate.getForObject(PaymentSrv_URL+"/pay/get/info",ResultData.class);
        }
    
  2. 訪問測試

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);
    }
}