8.3、负载均衡策略
分类: Spring Cloud LoadBalancer
负载均衡策略
LoadBalancer 支持多种负载均衡策略。本节将学习负载均衡策略。
本节将学习:轮询策略、随机策略、最少连接策略、响应时间权重策略,以及自定义策略。
轮询策略(Round Robin)
策略说明
轮询策略:
- 按顺序依次选择服务实例
- 每个实例轮流处理请求
- 公平分配请求
- 适用于实例性能相近的场景
在商城项目中配置
文件路径: mall-microservices/order-service/src/main/resources/application.yml
spring: cloud: loadbalancer: configurations: round-robin # 全局配置:所有服务使用轮询策略 # 或者为特定服务配置 # configurations: # user-service: round-robin # product-service: random
使用示例
@Configuration public class LoadBalancerConfig { @Bean public ReactorLoadBalancer<ServiceInstance> reactorLoadBalancer( Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) { String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); return new RoundRobinLoadBalancer( loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name ); } }
随机策略(Random)
策略说明
随机策略:
- 随机选择服务实例
- 每个实例被选中的概率相等
- 适用于实例性能相近的场景
- 避免请求集中在某个实例
在商城项目中配置
文件路径: mall-microservices/order-service/src/main/resources/application.yml
spring: cloud: loadbalancer: configurations: random # 全局使用随机策略 # 或者为特定服务配置 # configurations: # user-service: round-robin # product-service: random
使用示例
@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 ); }
最少连接策略
策略说明
最少连接策略:
- 选择当前连接数最少的实例
- 需要跟踪每个实例的连接数
- 适用于长连接场景
- 平衡实例负载
实现方式
@Bean public ReactorLoadBalancer<ServiceInstance> leastConnectionLoadBalancer( Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) { String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); return new LeastConnectionLoadBalancer( loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name ); }
响应时间权重策略
策略说明
响应时间权重策略:
- 根据实例的响应时间分配权重
- 响应时间短的实例获得更多请求
- 动态调整权重
- 适用于实例性能差异较大的场景
实现方式
@Bean public ReactorLoadBalancer<ServiceInstance> responseTimeWeightLoadBalancer( Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) { String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); return new ResponseTimeWeightLoadBalancer( loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name ); }
自定义策略
策略实现
public class CustomLoadBalancer implements ReactorLoadBalancer<ServiceInstance> { private final ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider; private final String serviceId; public CustomLoadBalancer( ObjectProvider<ServiceInstanceListSupplier> serviceInstanceListSupplierProvider, String serviceId) { this.serviceInstanceListSupplierProvider = serviceInstanceListSupplierProvider; this.serviceId = serviceId; } @Override public Mono<Response<ServiceInstance>> choose(Request request) { ServiceInstanceListSupplier supplier = serviceInstanceListSupplierProvider .getIfAvailable(NoopServiceInstanceListSupplier::new); return supplier.get(request).next() .map(serviceInstances -> { // 自定义选择逻辑 ServiceInstance instance = selectInstance(serviceInstances); return new DefaultResponse(instance); }); } private ServiceInstance selectInstance(List<ServiceInstance> instances) { // 自定义选择算法 return instances.get(0); } }
配置自定义策略
@Configuration public class CustomLoadBalancerConfig { @Bean public ReactorLoadBalancer<ServiceInstance> customLoadBalancer( Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) { String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); return new CustomLoadBalancer( loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name ); } }
在商城项目中的策略配置
为不同服务配置不同策略
文件路径: mall-microservices/order-service/src/main/resources/application.yml
spring: cloud: loadbalancer: # 为不同服务配置不同的负载均衡策略 configurations: user-service: round-robin # 用户服务使用轮询 product-service: random # 商品服务使用随机 inventory-service: round-robin # 库存服务使用轮询
配置说明
为什么为不同服务配置不同策略:
-
用户服务(轮询):
- 用户查询请求相对均匀
- 实例性能相近
- 使用轮询策略公平分配
-
商品服务(随机):
- 商品查询请求可能集中在热门商品
- 使用随机策略避免热点问题
- 更好的负载分散
-
库存服务(轮询):
- 库存操作需要顺序处理
- 使用轮询策略保证公平
验证策略配置
测试不同策略:
- 启动多个服务实例
- 配置不同策略
- 多次调用服务
- 观察请求分发模式
# 测试用户服务(轮询策略) # 应该看到请求按顺序分发:实例1 → 实例2 → 实例1 → 实例2 # 测试商品服务(随机策略) # 应该看到请求随机分发,没有固定模式
策略选择建议
选择原则
策略选择原则:
- 实例性能相近:使用轮询或随机策略
- 实例性能差异大:使用响应时间权重策略
- 长连接场景:使用最少连接策略
- 特殊需求:使用自定义策略
商城项目建议
商城项目中的策略选择建议:
| 服务 | 推荐策略 | 原因 |
|---|---|---|
| user-service | 轮询 | 用户请求相对均匀,实例性能相近 |
| product-service | 随机 | 避免热门商品请求集中,分散负载 |
| order-service | 轮询 | 订单处理需要公平分配 |
| inventory-service | 轮询 | 库存操作需要顺序处理 |
| payment-service | 轮询 | 支付处理需要公平分配 |
官方资源
- Spring Cloud LoadBalancer 官方文档:https://spring.io/projects/spring-cloud-loadbalancer
本节小结
在本节中,我们学习了:
第一个是轮询策略。 按顺序依次选择服务实例。
第二个是随机策略。 随机选择服务实例。
第三个是最少连接策略。 选择连接数最少的实例。
第四个是响应时间权重策略。 根据响应时间分配权重。
第五个是自定义策略。 如何实现自定义负载均衡策略。
这就是负载均衡策略。选择合适的策略可以提高系统的性能和可用性。
在下一节,我们将学习 RestTemplate + LoadBalancer。