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. 商品服务(随机)

    • 商品查询请求可能集中在热门商品
    • 使用随机策略避免热点问题
    • 更好的负载分散
  3. 库存服务(轮询)

    • 库存操作需要顺序处理
    • 使用轮询策略保证公平

验证策略配置

测试不同策略:

  1. 启动多个服务实例
  2. 配置不同策略
  3. 多次调用服务
  4. 观察请求分发模式
# 测试用户服务(轮询策略) # 应该看到请求按顺序分发:实例1 → 实例2 → 实例1 → 实例2 # 测试商品服务(随机策略) # 应该看到请求随机分发,没有固定模式

策略选择建议

选择原则

策略选择原则:

  • 实例性能相近:使用轮询或随机策略
  • 实例性能差异大:使用响应时间权重策略
  • 长连接场景:使用最少连接策略
  • 特殊需求:使用自定义策略

商城项目建议

商城项目中的策略选择建议:

服务推荐策略原因
user-service轮询用户请求相对均匀,实例性能相近
product-service随机避免热门商品请求集中,分散负载
order-service轮询订单处理需要公平分配
inventory-service轮询库存操作需要顺序处理
payment-service轮询支付处理需要公平分配

官方资源

本节小结

在本节中,我们学习了:

第一个是轮询策略。 按顺序依次选择服务实例。

第二个是随机策略。 随机选择服务实例。

第三个是最少连接策略。 选择连接数最少的实例。

第四个是响应时间权重策略。 根据响应时间分配权重。

第五个是自定义策略。 如何实现自定义负载均衡策略。

这就是负载均衡策略。选择合适的策略可以提高系统的性能和可用性。

在下一节,我们将学习 RestTemplate + LoadBalancer。