ribbon.EnableZoneAffinity配置失效问题

我们都知道ribbon.EnableZoneAffinity属性用来过滤出和zone相关的服务器,即:只留下指定zone下的Server们,但是当我设置ribbon.EnableZoneAffinity=false,经过测试发现此配置并不生效。只有指定单个 serviceId.ribbon.EnableZoneAffinity属性时才生效,无法做到全局的一个默认配置,那为什么失效呢?本文接下来会对其进行探讨。


因为本文中整合了eureka,在eureka中发现对EnableZoneAffinity进行了初始化设置。具体见EurekaRibbonClientConfiguration

ribbon.EnableZoneAffinity配置失效问题

ribbon.EnableZoneAffinity配置失效问题

ribbon.EnableZoneAffinity配置失效问题  

因为Ribbon组件默认的初始化方式为懒加载,只有当该服务第一次请求进来的时候(假设该服务serviceId为A)才会去执这个被@PostConstruct注解标注的方法,可以看到initializeRibbonDefaults方法会对服务A的EnableZoneAffinity属性进行了一个初始化为true。并且也满足if这个条件(这个条件从字面意思来理解应该是判断这个属性A.ribbon.EnableZoneAffinity有没有设置过值,没有的话就往configInstance实例中set进去当前value)

其中要注意这行代码,后面会有用到

ConfigurationManager.getConfigInstance().setProperty(key, value);

继续往下看:

后面断点会进入RibbonClientConfiguration

其中会去初始化IClientConfig,默认采用DefaultClientConfigImpl

ribbon.EnableZoneAffinity配置失效问题

ribbon.EnableZoneAffinity配置失效问题

 图中标红的ConfigurationManager.getConfigInstance()拿到的就是eureka帮我们初始化的值,进入最后的setPropertyInternal()方法,可以看到当前断点的EnableZoneAffinity还是false,f7一下就变成了true

ribbon.EnableZoneAffinity配置失效问题

ribbon.EnableZoneAffinity配置失效问题 可以看到EnableZoneAffinity值被eureka初始化的时候设置进去的值覆盖了。

总结:由于整合了eureka-client,会在EurekaRibbonClientConfiguration中对所有服务的EnableZoneAffinity进行一个初始化为true,通过ribbon.EnableZoneAffinity设置进去的值就被其覆盖掉了。

解决办法:

(1)单独给每个服务都设置EnableZoneAffinity类似下面这样

A:
  ribbon:
    EnableZoneAffinity: false
B:
  ribbon:
    EnableZoneAffinity: false

但是这样服务太多的话,配置太多,看着蛋疼

(2)Ribbon组件初始化的时候先采用RibbonUtils.setRibbonProperty把它设置为false

(3)没有用到eureka的话就去掉spring-cloud-starter-netflix-eureka-client这个依赖吧。。。

上一篇:Vue项目(vuecli3.0搭建)集成高德地图实现路线轨迹绘制(转载)


下一篇:Java HashMap