当前位置: 首页 > news >正文

@LoadBalanced 和 @RefreshScope 同时使用,负载均衡失效分析

背景

最近引入了 Nacos Config 配置管理能力,说起来用法很简单,还是踩了三个坑。

  1. Nacos Config 的 nacos 的帐号密码加密配置后,怎么解密而且在 NacosConfigBootstrapConfiguration 真正注入 Nacos Config 注入之前,而且不能触发 NacosDiscoveryPropertiesisNacosDiscoveryInfoChanged 变动事件。因为 NacosDiscoveryProperties 接受 NacosContextRefresher 事件时,还是从 yml 配置中获取属性,不会从 Environment 对象中加载。
  2. @RefreshScope 要想生效,该注意什么?非 shared-config 的配置变动时,要想实时生效,必须在当前应用的 bootstrap.yml 中配置 spring.application.name 属性,注册该应用在配置中心需要监听的配置。
  3. @RefreshScope + @LoadBalanced 同时使用导致 Ribbon 负载均衡失效问题。

问题一比较复杂,此处不做讨论,本文记录问题三的解决方法及个人思考。

问题

有个模块使用了 @LoadBalanced 负载均衡,通过配置控制超时时间。

引入 Nacos Config 配置后,按照常规用法,在对象上添加了 @RefreshScope 属性,希望配置变动时,能实时生效。

注入代码如下:

@Value("${rest.template.connect-timeout:10000}")
private Integer connectTimeout;

@Value("${rest.template.read-timeout:10000}")
private Integer readTimeout;

@Bean
@RefreshScope
@LoadBalanced
public RestTemplate restTemplate(RestTemplateBuilder builder){
SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
      requestFactory.setConnectTimeout(connectTimeout); //连接超时设置
      requestFactory.setReadTimeout(readTimeout); //读写超时设置
      RestTemplate restTemplate = new RestTemplate(requestFactory);

      logger.info("初始化负载均衡的 RestTemplate 对象 {} {}", connectTimeout, readTimeout);

      return restTemplate;
  }

修改配置中心的配置后,可以监控到 RestTemplate 会在配置变化后重新初始化了,也打印了最新的配置。
在这里插入图片描述

但真正使用这个类,调用某个服务时,出现了服务无法解析的异常:
在这里插入图片描述

分析

首先,检查调用的目标服务是否注册成功,目标服务是正常启动的。

其次,对比其他同样引用了 @LoadBalancedRestTemplate 的模块,它调用是正常的。

最后,对比异常调用和正常调用的注入代码的区别,多了一个 @RefreshScope ,调整代码验证结果正常。引入 @RefreshScope 时,在配置变化后才会发生这个异常,首次运行时正常的。

延伸搜索发现,负载均衡 RestTemplate 也有类似的问题 @scope(“prototype”)+@loadbalanced注解时负载均衡失效问题。

启示录

@LoadBalanced@RefreshScope 同时使用,首次初始化时,RestTemplate 对象具有负载均衡的能力;当 Nacos 配置中的配置变动时,这个对象会重新创建,而且此时并没有使用 @LoadBalanced 的能力,导致负载均衡失效。

就是说,这两个注解同时使用时,在不同的时机,只会有一个注解生效:

  1. 初始创建时,@LoadBalanced 生效,系统中的实例是负载均衡的 RestTemplate
  2. 当 Nacos 配置变化,NacosContextRefresher 触发通知 @RefreshScope 注解的 @Bean 对象时,重新创建的实例就是普通的 RestTemplate 了。

引入任何一个第三方工具,面对的都是黑盒,各种资料用法看似简单,一用就坑不断啊!建议 Nacos Config 官方配置给出一个使用建议 @RefreshScope 不要用在 @LoadBalanced 注解上。

最后记录一个偶然的发现:
在这里插入图片描述
选中几个图片文件后,右侧概览图是一个堆叠的图,才注意到!

相关文章:

  • 【前端CSS面试题】2023前端最新版css模块,高频15问
  • java高频面试题(2023最新)
  • 第十六篇 Inception V2、Inception V3、Inception V4模型详解
  • 数据分析实战项目3:RFM用户分群
  • LeetCode刷题模版:292、295、297、299-301、303、304、309、310
  • 通过python 调用OpenAI api_key提交问题解答
  • uni-app低成本封装一个取色器组件
  • 大学物理·第15章【量子物理】
  • Linux 磁盘坏块修复处理(错误:read error: Input/output error)
  • 常见字符串函数的使用,你确定不进来看看吗?
  • 【Linux】进程优先级 | 进程的切换 | 环境变量详解
  • 软件测试标准流程
  • 将群晖NAS变为本地盘
  • 网络安全的就业及发展前景如何?
  • Hadoop组件Yarn常见命令
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • ERLANG 网工修炼笔记 ---- UDP
  • JavaScript类型识别
  • node和express搭建代理服务器(源码)
  • Octave 入门
  • python大佬养成计划----difflib模块
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 前端性能优化--懒加载和预加载
  • 如何使用 JavaScript 解析 URL
  • No resource identifier found for attribute,RxJava之zip操作符
  • ​如何防止网络攻击?
  • #{}和${}的区别是什么 -- java面试
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • $ git push -u origin master 推送到远程库出错
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (¥1011)-(一千零一拾一元整)输出
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (第27天)Oracle 数据泵转换分区表
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (原)Matlab的svmtrain和svmclassify
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .Net Remoting常用部署结构
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET分布式缓存Memcached从入门到实战
  • .NET连接MongoDB数据库实例教程
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • ::什么意思
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • [CF226E]Noble Knight's Path