Spring Boot 3.1.2网关如何切换为加权响应时间服务端负载均衡算法
解决方案
你需要创建配置类来实现加权响应时间负载均衡算法的切换,因为当前Spring Cloud LoadBalancer并未提供直接通过application.properties配置就能启用该算法的选项,必须通过自定义配置类来完成服务端负载均衡的配置(网关作为服务入口,负载均衡逻辑在网关侧实现,即符合你要求的服务端负载均衡方案)。
具体操作步骤
1. 创建负载均衡配置类
在Gateway服务中新建配置类,注入WeightedResponseTimeLoadBalancer实例以覆盖默认负载均衡器:
import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer; import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier; import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; @Configuration public class WeightedResponseTimeLBConfig { @Bean public ReactorLoadBalancer<ServiceInstance> weightedResponseTimeLoadBalancer(Environment env, LoadBalancerClientFactory clientFactory) { String serviceName = env.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); return new org.springframework.cloud.loadbalancer.core.WeightedResponseTimeLoadBalancer( clientFactory.getLazyProvider(serviceName, ServiceInstanceListSupplier.class), serviceName); } }
2. 绑定配置到目标服务
如果仅需对MRRANDOM服务生效,在Gateway的启动类上添加@LoadBalancerClient注解:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient; @SpringBootApplication @EnableDiscoveryClient @LoadBalancerClient(name = "MRRANDOM", configuration = WeightedResponseTimeLBConfig.class) public class GatewayApplication { public static void main(String[] args) { SpringApplication.run(GatewayApplication.class, args); } }
若要对所有服务生效,替换为@LoadBalancerClients(defaultConfiguration = WeightedResponseTimeLBConfig.class)即可。
3. 验证配置
启动Eureka、多个实例的Microservice random和Gateway,通过访问Gateway路由,观察请求是否按照加权响应时间策略分发到不同服务实例。
为什么不能只用配置文件?
当前Spring Cloud LoadBalancer的设计中,没有提供直接切换负载均衡算法的配置项(如spring.cloud.loadbalancer.algorithm=weighted-response-time),所有非默认的负载均衡逻辑都需要通过自定义配置类注入对应的ReactorLoadBalancer Bean,以此覆盖默认实现。
内容的提问来源于stack exchange,提问作者sertineitor
相关产品推荐
相关产品推荐

