一、什么是 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);
}
}