1、服务发现失败问题
最近在搞Nacos的时候发现一个问题,以前低版本的时候用@LoadBalanced注解就可以负载均衡
但是在新版本(这里用的是2021.0.1.0版本)发现服务会失败,报一个UnknowHost的错误。
后来查了下,因为在Hoxton.M2 Released版本之后Ribbon被剔除了,之后使用的是Spring Cloud Loadbalancer
Spring Cloud Loadbalancer依赖引入
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
<version>${loadbalancer.version}</version>
</dependency>
2、负载均衡无法调到NacosRule
最终解决方案在最后
但是遇到一个问题就是我的负载均衡策略想要调到NacosRule(优先选择同集群实例),用查到的一些方法。比如说:
@LoadBalancerClient(value = "service", configuration = NacosLoadBalancerClientConfiguration.class)
// 或者参照NacosLoadBalancerClientConfiguration去写一个新的配置
不知道是不是版本问题,负载均衡策略没有调到NacosRule
最后在com.alibaba.cloud.nacos.loadbalancer包中找到了一个LoadBalancerNacosAutoConfiguration类,应该是NacosRule规则的一个自动配置类
wait! 这是个自动配置类?所以?(/斜眼笑)可以搞一搞配置,扒下源码。
从这个注解不难看出,大概能分为三种。
@ConditionalOnLoadBalancerNacos --NacosRule负载均衡策略
@ConditionalOnNacosDiscoveryEnabled --Nacos服务发现
@LoadBalancerClients --这个应该是调用NacosRule这个方法
扒了下源码后发现spring.cloud.loadbalancer.nacos.enabled这个配置默认值为false,也就是说我在配置中调NacosLoadBalancerClientConfiguration类的时候可能是起不到作用的。
于是我试了下将这个配置改为true,不用注解,直接使用@LoadBalanced注解就可以。
解决方案:application文件中加入
spring:
cloud:
loadbalancer:
nacos:
enabled: true