ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ribbon.EnableZoneAffinity配置失效问题

2022-02-08 19:02:31  阅读:161  来源: 互联网

标签:初始化 false eureka 设置 失效 EnableZoneAffinity ribbon


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


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

  

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

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

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

继续往下看:

后面断点会进入RibbonClientConfiguration

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

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

 可以看到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这个依赖吧。。。

标签:初始化,false,eureka,设置,失效,EnableZoneAffinity,ribbon
来源: https://blog.csdn.net/weixin_43410352/article/details/122823120

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有