微服務負載均衡器 LoadBalancer

HuDu發表於2022-08-01

一、什麼是 SpringCloud LoadBalancer

Spring Cloud LoadBalance 是 Spring Cloud 官方自己提供的客戶端負載均衡器,用來替代 Ribbon, 
Spring官方提供了兩種負載均衡的客戶端:

RestTemplate

RestTemplate 是 Spring 提供的用於訪問 Rest 服務的客戶端,RestTemplate 提供 了多種便捷訪問遠端 Http 服務的方法,能夠大大提高客戶端的編寫效率。預設情況下,RestTemplate 預設依賴 jdk 的 HTTP 連線工具。

WebClient

WebClient 是 從Spring WebFlux 5.0 版本開始提供的一個非阻塞的基於響應式程式設計的進行 Http 請求的客戶端工具。它的響應式程式設計的基於 Reactor 的。WebClient 中提供了標準 Http 請求方式對應的 get、post、put、delete等方法, 可以用來發起相應的請求。

二、建立專案

<dependencies>
    <!-- nacos 服務註冊與發現 移除 ribbon 支援  -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <!--新增 load balance 依賴,需要新增 spring-cloud 依賴,在父工程以及引入-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>
</dependencies>

在 yml 檔案中禁用 ribbon

spring:
  application:
    name: order-server
  cloud:
    nacos:
      server-addr: 192.168.33.62:8847
    # 不使用 ribbon
    loadbalancer:
      ribbon:
        enabled: false

專案目錄結構如下

微服務負載均衡器 LoadBalancer

再次啟動專案stock-nacos以及order-loadbalancer,訪問http://localhost:8031/order/add,發現實現了隨機負載均衡的效果。

三、自定義負載均衡策略

Loadbalancer 預設實現瞭如下兩種負載均衡策略:

  • RandomLoadBalancer - 隨機分配策略
  • (預設) RoundRobinLoadBalancer - 輪詢分配策略

3.1、建立配置類

如果想要修改預設的負載均衡策略,比如採用隨機分配策略。則可以如下建立配置類,不需要新增Configuration註解


public class LoadBalancerConfig {
    @Bean
    public ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory){
        String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
        return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
    }
}

3.2、修改主啟動類

@SpringBootApplication
@LoadBalancerClient(name = "PAYMENT-SERVER", configuration = LoadBalancerConfig.class)
public class MainApplication {
    public static void main(String[] args) {
        SpringApplication.run(MainApplication .class, args);
    }
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章