下面为您详细讲解“springcloud集成nacos 使用lb 无效问题解决方案”的攻略:
问题描述
在使用SpringCloud集成Nacos并使用LoadBalance时,发现无法实现负载均衡,即便使用了@NacosInjected注解自动注入了LoadBalancer对象,对该对象进行调用时仍然只会调用到一个服务提供者。
解决方案
- 解决办法一
在使用@LoadBalanced注解时,需要制定负载均衡的类型。否则,默认使用的是RoundRobin负载均衡策略,而Nacos中并没有实现该策略,因此会出现负载均衡无效的情况。我们可以使用Nacos自带的负载均衡策略来解决这个问题。
1.1. 在pom.xml文件中导入相关依赖:
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
1.2. application.yml文件中添加以下配置:
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848
loadbalancer:
type: weighted_round_robin
1.3. 注入LoadBalancer对象,并尝试调用到所有服务提供者
@NacosInjected
private LoadBalancer loadBalancer;
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/service")
public String getService() {
List<ServiceInstance> instances = discoveryClient.getInstances("service-provider");
ServiceInstance instance = loadBalancer.choose("service-provider");
return instance.getHost() +":"+instance.getPort();
}
- 解决办法二
如果想使用自定义的负载均衡策略,可以通过手动编写负载均衡器的方式来解决问题。
2.1. 新建一个LoadBalancerConfig类,并使用@Bean注解将对象纳入Spring容器管理。
@Configuration
public class LoadBalancerConfig {
@Bean
public LoadBalancer myLoadBalancer(ServiceInstanceChooser serviceInstanceChooser) {
return new MyLoadBalancer(serviceInstanceChooser);
}
}
2.2. 创建一个自定义的LoadBalancer,并注入ServiceInstanceChooser对象。
public class MyLoadBalancer extends AbstractLoadBalancer {
public MyLoadBalancer(ServiceInstanceChooser serviceInstanceChooser) {
this.serviceInstanceChooser = serviceInstanceChooser;
}
@Override
protected ServiceInstance doChoose(List<ServiceInstance> instances) {
return serviceInstanceChooser.choose(instances);
}
private final ServiceInstanceChooser serviceInstanceChooser;
}
2.3. 在使用LoadBalancer时使用自定义的LoadBalancer替换掉默认的LoadBalancer。
@Autowired
@LoadBalanced(lb = "myLoadBalancer")
private RestTemplate restTemplate;
以上就是关于“springcloud集成nacos 使用lb 无效问题解决方案”的攻略了。
示例说明:
- 示例一:使用WeightedRoundRobin策略
比如在一台机器上启动了两个服务提供者,分别为192.168.0.1:8080、192.168.0.1:8081。在客户端注入了LoadBancncer对象,并调用loadBalancer.choose("service-provider")
方法时,将会以WeightedRoundRobin策略从两个服务提供者中选择一个。
- 示例二:使用自定义的负载均衡策略
比如,自定义了一个MyLoadBalancer类,使用一种新的负载均衡策略。在客户端使用@LoadBalanced(lb = "myLoadBalancer")注解自动注入RestTemplate对象,并调用远程服务时将会使用自定义的负载均衡策略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springcloud集成nacos 使用lb 无效问题解决方案 - Python技术站