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

news2024/10/6 12:32:15

背景

最近引入了 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 注解上。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/333592.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

十分钟利用环信WebIM-vue3-Demo,打包上线一个即时通讯项目【含音视频通话】

这篇文章无废话,只教你如果接到即时通讯功能需求,十分钟利用环信WebIM-vue3-Demo,打包上线一个即时通讯项目【包含音视频通话功能】。 写这篇文章是因为,结合自身情况,以及所遇到的有同样情况的开发者在接到即时通讯&a…

VS+QT项目创建及配置设置

1.创建QT项目 选择MSV2015 32 (与VS一致即可) 2.在VS中 Qt VS Tools-OpenQtProjectFiles(.pro) 打开QT项目。 3.VS属性页中设置配置 (1)修改SDK版本和 平台工具集 (2)更改输出目录 (3)确认Qt Project …

设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)

工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂) 工厂模式-创建型模式-提供了创建对象的最佳方式。 在工厂模式中,创建对象时不会对客户端暴露创建逻辑,并且是通过一个共同的接口来创建新的对象。 简单工厂 简单工厂…

微服务负载均衡器Ribbon

目录 什么是Ribbon 客户端的负载均衡 服务端的负载均衡 常见负载均衡算法 Nacos使用Ribbon 添加LoadBalanced注解 修改controller Ribbon负载均衡策略 IRule AbstractLoadBalancerRule 修改默认负载均衡策略 自定义负载均衡策略 配置自定义的策略 饥饿加载 Ribbo…

Codeforces Round #699 (Div. 2)

E. 题意:n本书,每本书有颜色a[i],一次操作可以将其中一本书放在末尾,求满足:相同颜色的书都是相邻的 的最小操作次数. 显然最多只需要n次,考虑能节省多少次.倒着考虑,记f[i]为i~n最多能节约的次数.先预处理出每种颜色的出现的位置范围l[i],r[i]. 1.不节约这本书f[i] f[i 1]…

Linux文件,目录IO类系统调用总结与示例

tags: C Syscall Linux 写在前面 无论是做网络编程还是系统编程, 逃不开的一个内容就是C系统调用的学习, 正如C的STL一样, 学习OS也有如下的三步骤: 会使用: 熟悉API懂原理: 分析源码写扩展: 实际开发 现在就来熟悉一下系统调用吧. 环境Ubuntu x86_64. 源码部分也参考了apu…

2023抓住这些风口,让你的服装生意一路狂飙!

如今正是消费回暖的大好时机,想要趁着行情回升大展身手的服装商户们,抓住2023的这些风口,生意一路狂飙不是梦!风口1: T 恤和运动衫全球纺织信息透露,在全球范围内,T 恤和运动衫的市场规模将在 2…

骑车不戴头盔识别检测系统 Tesnorflow

骑车不戴头盔识别检测系统通过GPU深度学习技术,骑车不戴头盔识别检测对行驶在马路上的骑电动摩托车等未戴头盔的行为进行抓拍,不经过人为干预自动对上述违规行为进行自动抓拍识别。骑车不戴头盔识别检测系统技术上采用 TesnorflowTensorRT推理组合&#…

Qt学习笔记

文章目录一、C指针函数驼峰命名法、下划线命名法编程报错二、C三、Qt语法Qt历史、Qt应用Qt特色快捷键Qt类的族谱QWidgetQPushButtonQDebug对象树Qt窗口坐标信号和槽Qt自带的信号的槽自定义的信号和槽Qt4版本 vs Qt5版本 的connect写法函数指针解决重载问题拓展类型转换QString …

Minikube vs. kind vs. k3s vs k3d vs MicroK8s

文章目录1. minikube2. k3s3. k3d4. Kind5. MicroK8s1. minikube minikube 是一个 Kubernetes SIG 项目,已经启动三年多了。它采用生成虚拟机的方法,该虚拟机本质上是一个单节点 K8s 集群。由于支持大量管理程序,它可以在所有主要操作系统上…

项目管理基础

项目的特点 项目是为提供独特产品、服务或成果所做的临时性努力 临时性(一次性,指项目有明确的开始时间和结束时间)独特性逐步完善-渐进明细资源约束目的性 项目的三重制约: 成本 质量 时间 其次还有范围 目标:多快…

FPGA时序约束与分析 --- 实例教程(1)

注意: 时序约束辅助工具或者相关的TCL命令,都必须在 open synthesis design / open implemention design 后才能有效运行。 1、时序约束辅助工具 2、查看相关时序信息 3、一般的时序约束顺序 1、 时序约束辅助工具(1)时序约束编辑…

操作系统的奋斗(三)内存管理

第三章 内存管理3.1内存管理概念3.1.1 内存管理的基本原理和要求(1)内存管理的主要功能3.1.2 覆盖和交换(1)覆盖(2)交换3.1.3 连续分配管理方式(1)单一连续分配(2&#x…

【Spring源码】23. 执行初始化逻辑:initializeBean()

进入initializeBean()先检查是否有安全管理器,如果有就以特权方式执行回调bean中Aware接口方法invokeAwareMethods()invokeAwareMethods()这个方法处理了3个Aware(更多关于Aware的内容可移步至那些Aware们)BeanNameAwareBeanClassLoaderAware…

json文件在faster_rcnn中从测试到训练 可行性

1.确认任务 经过mydataset文件处理后 - > 在train_res50_fpn文件内应用 # load train data set # VOCdevkit -> VOC2012 -> ImageSets -> Main -> train.txt train_dataset VOCDataSet(VOC_root, "2012", data_transform["train"], &…

Python 异步: 使用和查询任务(8)

任务是异步程序的货币。在本节中,我们将仔细研究如何在我们的程序中与它们交互。 1. 任务生命周期 异步任务具有生命周期。首先,任务是从协程创建的。然后安排在事件循环中独立执行。在某个时候,它会运行。 在运行时它可能会被挂起&#xff0…

舆情监测方案主体需求,TOOM舆情监测预警应对处置方案

舆情监测预警是一种通过预先设定的告警机制,在发生重要事件或异常情况时及时通知相关人员的舆情监测方式。它旨在帮助企业和组织及时了解舆情变化,并采取必要的应对措施,舆情监测方案主体需求,TOOM舆情监测预警应对处置方案。 一…

在Unity中管理材质

Shader和Material的关系 Shader能够设置游戏物体的颜色或者能够通过材质来配置颜色。实际上,一个shader能够让许多物体看起来像是完全不同的物质。 Shader和材质作为一个整体工作:Shader定义了表面看起来可以像哪些东西,材质让表面真正看起来…

【手写 Vuex 源码】第一篇 - Vuex 的基本使用

一,前言 本篇开始,进入 vuex 源码学习,本篇主要介绍一下内容: 创建 vuex 源码项目;介绍 vuex 的基本使用; 二,创建 vuex 源码项目 1,使用 vue-cli 创建 vue2.x 脚手架 vue creat…

shell脚本(语法)

一、什么是shell脚本 1.1、shell 的两层含义:既是一种应用程序,又是一种程序设计语言 1.1.1、shell是一种应用程序 交互式地解释、执行用户输入的命令,将用户的操作翻译成机器可以识别的语言,完成相应功能称之为 shell 命令解析器。 shell 是…