一、什麼是 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
專案目錄結構如下
再次啟動專案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 協議》,轉載必須註明作者和本文連結