以下是针对 Spring Cloud Gateway 配置具体负载均衡策略(如加权轮询、最小连接数等)的详细指南,结合最新技术文档和最佳实践:
一、基础配置与依赖
1. 引入依赖
确保项目中已包含 Spring Cloud Gateway 和负载均衡器(Spring Cloud LoadBalancer)的依赖:
1<dependency> 2 <groupId>org.springframework.cloud</groupId> 3 <artifactId>spring-cloud-starter-gateway</artifactId> 4</dependency> 5<dependency> 6 <groupId>org.springframework.cloud</groupId> 7 <artifactId>spring-cloud-starter-loadbalancer</artifactId> 8</dependency> 9
若需集成服务发现(如 Nacos/Eureka),还需添加对应依赖 。
2. 启用负载均衡
在路由配置中使用 lb://service-id格式的 URI,Gateway 会自动启用负载均衡:
1spring: 2 cloud: 3 gateway: 4 routes: 5 - id: user-service 6 uri: lb://user-service # 启用负载均衡 7 predicates: 8 - Path=/api/user/** 9
二、配置内置负载均衡策略
Spring Cloud LoadBalancer 默认支持以下策略,可通过配置或代码自定义:
1. 轮询策略(默认)
无需额外配置,默认按顺序分配请求到服务实例 。
2. 加权轮询
通过服务实例的元数据(Metadata)设置权重,动态调整流量分配:
- 步骤1:在服务注册时添加权重元数据(以 Nacos 为例):
1spring: 2 cloud: 3 nacos: 4 discovery: 5 metadata: 6 weight: "3" # 权重值(数值越大分配流量越多)
- 步骤2:在 Gateway 中配置加权响应时间策略:
1@Configuration 2public class WeightedLoadBalancerConfig { 3 @Bean 4 public ReactorLoadBalancer<ServiceInstance> weightedLoadBalancer( 5 Environment env, LoadBalancerClientFactory factory) { 6 String serviceId = env.getProperty("loadbalancer.client.name"); 7 return new WeightedResponseTimeLoadBalancer( 8 factory.getLazyProvider(serviceId, ServiceInstanceListSupplier.class), 9 serviceId); 10 } 11}
需配合 @LoadBalancerClient(name = "user-service", configuration = WeightedLoadBalancerConfig.class)注解使用 。
3. 随机策略
自定义随机选择实例的负载均衡器:
1@Bean 2public ReactorLoadBalancer<ServiceInstance> randomLoadBalancer( 3 Environment env, LoadBalancerClientFactory factory) { 4 String serviceId = env.getProperty("loadbalancer.client.name"); 5 return new RandomLoadBalancer( 6 factory.getLazyProvider(serviceId, ServiceInstanceListSupplier.class), 7 serviceId); 8} 9
注册方式同加权轮询 。
三、高级自定义策略
1. 最小连接数策略
需自行实现 ReactorServiceInstanceLoadBalancer接口,通过监控实例活跃请求数选择负载最低的实例:
1public class LeastConnectionsLoadBalancer implements ReactorServiceInstanceLoadBalancer { 2 private final ConcurrentHashMap<String, AtomicInteger> connectionCounts = new ConcurrentHashMap<>(); 3 4 @Override 5 public Mono<Response<ServiceInstance>> choose(Request request) { 6 return supplier.get().next().map(instances -> { 7 ServiceInstance selected = instances.stream() 8 .min(Comparator.comparingInt(instance -> 9 connectionCounts.getOrDefault(instance.getInstanceId(), new AtomicInteger(0)).get())) 10 .orElseThrow(); 11 connectionCounts.computeIfAbsent(selected.getInstanceId(), k -> new AtomicInteger(0)).incrementAndGet(); 12 return new Response<>(selected); 13 }); 14 } 15} 16
注册为 Bean 后通过 @LoadBalancerClient指定服务 。
2. 一致性哈希策略
适用于需要会话粘性(Sticky Session)的场景:
1public class HashLoadBalancer implements ReactorServiceInstanceLoadBalancer { 2 @Override 3 public Mono<Response<ServiceInstance>> choose(Request request) { 4 String clientIp = request.getHeaders().getFirst("X-Forwarded-For"); 5 int hash = Objects.hashCode(clientIp); 6 return supplier.get().next().map(instances -> { 7 int index = hash % instances.size(); 8 return new Response<>(instances.get(Math.abs(index))); 9 }); 10 } 11} 12
通过请求头或客户端 IP 哈希固定路由到同一实例 。
四、动态策略调整与监控
1. 结合配置中心
通过 Nacos/Apollo 动态更新负载均衡策略参数(如权重),无需重启服务 。
2. 监控与调试
- 启用 Actuator 端点:
1management: 2 endpoints: 3 web: 4 exposure: 5 include: gateway,loadbalancer
访问 /actuator/loadbalancer/stats查看负载均衡统计信息 。
- Prometheus 集成:监控各实例的请求分布和性能指标 。
五、生产建议
- 策略选择:
- 加权轮询:适合实例性能差异明显的场景(如混合部署新旧硬件)。
- 最小连接数:适用于长连接或处理耗时差异大的服务(如文件上传)。
- 一致性哈希:需要会话保持的遗留系统迁移 。
- 性能优化:避免在自定义策略中嵌入复杂计算,优先使用内置策略 + 元数据控制 。
通过以上配置,可灵活适配不同业务场景的负载均衡需求。

