springcloud loadbalancer nacos无损发布
前言
- 故事背景
jenkins部署时总是会有几秒钟接口调用报错,观察日志是因为流量被下发到已下线的服务,重启脚本在停止应用之前先调用nacos注销实例api后再重启依然会短暂出现此问题。项目架构是springcloud alibaba,通过openfeign进行微服务之间调用,猜测是LoadBalancer缓存问题。 - 依赖版本
<dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2021.0.1.0</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.6.3</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>2021.0.1</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><exclusions><exclusion><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>3.1.1</version></dependency>
</dependencies>
- loadbalancer配置
spring:cloud:loadbalancer:#需要引入Spring Retry依赖retry:enabled: true
springcloud loadbalancer缓存原理
-
启用启动首先装配Caffeine一级缓存,缓存应用实例,降低注册中心负载,提升性能



从上图可以看出,可以通过设置spring.cloud.loadbalancer.cache来关闭一级缓存,其值默认是开启的。 -
feign初次从loadbalance获取应用实例会触发装配ServiceInstanceListSupplier逻辑


从一级缓存中获取应用实例:



解决方案
通过上面的源码分析,根本原因是应用从nacos下线后,loadbalancer的一级缓存未移除下线实例,有以下解决办法:
- 重启脚本下线nacos实例后,等待一级缓存失效后(默认35s)再重启应用
- 禁用一级缓存(不建议)
- 监听nacos下线事件,手动移除实例
方案实现
- 采用方案
监听nacos下线事件,手动移除实例 - 代码实现
- 思路
nacos订阅需要删除缓存的服务名(serviceName),下线应用主动调用nacos实例注销api后由nacos server触发自定义的订阅回调逻辑 - nacos订阅源码分析


- 思路
从上图可以看出默认只会订阅当前服务名,这也是为什么以下代码在其他应用主动下线后没有触发回调的原因

- 编写指定服务nacos订阅与删除实例缓存逻辑
package com.xxx.xxx.feign.listener;import com.alibaba.cloud.nacos.NacosDiscoveryProperties;
import com.alibaba.cloud.nacos.NacosServiceManager;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.listener.NamingEvent;
import lombok.SneakyThrows;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.cache.Cache;
import org.springframework.cloud.loadbalancer.cache.LoadBalancerCacheManager;
import org.springframework.cloud.loadbalancer.cache.LoadBalancerCacheProperties;
import org.springframework.cloud.loadbalancer.core.CachingServiceInstanceListSupplier;
import org.springframework.context.annotation.Configuration;import javax.annotation.Resource;
import java.util.Arrays;/*** @description nacos应用监听* @date 2024/7/29*/
@Configuration
@ConditionalOnProperty(name = "spring.cloud.loadbalancer.cache.enabled", havingValue = "true")
@AutoConfigureAfter(LoadBalancerCacheProperties.class)
public class NacosInstanceListener implements InitializingBean {@Resourceprivate NacosServiceManager nacosServiceManager;@Resourceprivate NacosDiscoveryProperties properties;@Resourceprivate LoadBalancerCacheManager caffeineLoadBalancerCacheManager;@Override@SneakyThrowspublic void afterPropertiesSet() {NamingService namingService = nacosServiceManager.getNamingService(properties.getNacosProperties());namingService.subscribe("xxx-product-xxx", properties.getGroup(), Arrays.asList(properties.getClusterName()), event -> {if (event instanceof NamingEvent) {NamingEvent namingEvent = (NamingEvent) event;String svrName = namingEvent.getServiceName();Cache cache = caffeineLoadBalancerCacheManager.getCache(CachingServiceInstanceListSupplier.SERVICE_INSTANCE_CACHE_NAME);if (cache != null) {cache.evict(svrName);}System.out.println(event);}});}
}
- 下线服务主动调用nacos注销实例接口,观察效果


从上图可以看到,删除服务实例缓存回调成功触发,考虑到调用nacos api下线到上述代码被成功执行的耗时,应用重启脚本最好在调用nacos api成功后等待1秒左右再停止服务。
相关文章:
springcloud loadbalancer nacos无损发布
前言 故事背景 jenkins部署时总是会有几秒钟接口调用报错,观察日志是因为流量被下发到已下线的服务,重启脚本在停止应用之前先调用nacos注销实例api后再重启依然会短暂出现此问题。项目架构是springcloud alibaba,通过openfeign进行微服务之间调用&…...
React原理
函数式编程 一种编程范式,概念比较多纯函数不可变值vdom和diff Vue2.x Vue3.x React 三者实现vdom细节都不同核心概念和实现思路,都一样h函数 用来生成vnode的函数 vnode数据结构 {tag: div,props: {className: div-class},children: [{tag: p,children: 测试}, ...] }pat…...
React-Native优质开源项目
React Native是由Facebook开发的一种开源框架,它允许开发者使用JavaScript和React编写原生应用,提供了一套跨平台的UI组件,可以在iOS和Android上实现一致的用户体验。在React Native的生态系统中,有许多优质的开源项目,…...
Ajax-02
一.form-serialize插件 作用:快速收集表单元素的值 const form document.querySelector(.example-form) const data serialize(form,{hash:true,empty:true}) *参数1:要获取哪个表单的数据 表单元素设置name属性,值会作为对象的属性名 建议…...
供应商较多的汽车制造业如何选择供应商协同平台?
汽车制造业的供应商种类繁多,根据供应链的不同环节和产品特性,可以大致分为以下几类。 按供应链等级分包括: 一级供应商通常具有较高的技术水平和生产能力,能够满足汽车厂商对零部件的高品质、高性能和高可靠性的要求。 二级供应…...
【开端】JAVA Mono<Void>向前端返回没有登陆或登录超时 暂无权限访问信息组装
一、绪论 JAVA接口返回信息ServerHttpResponse response 等登录接口token过期时需要给前端返回相关状态码和状态信息 二、Mono<Void>向前端返回没有登陆或登录超时 暂无权限访问信息组装 返回Mono对象 public abstract class Mono<T> implements CorePublisher…...
Python(模块---pandas+matplotlib+pyecharts)
import pandas as pd import matplotlib.pyplot as plt dfpd.read_excel(简易数据.xlsx) # print(df) plt.rcParams[font.sans-serif][SimHei] #设置画布的大小 plt.figure(figsize(10,6)) labelsdf[电影中文名] ydf[国籍] # print(labels) # print(y)# import pandas as pd im…...
解决使用Navicat连接数据库时,打开数据库表很慢的问题
今天使用Navicat连接数据库时,发现不管表中数据多少,打开数据库表非常慢。 解决方法: Navicat - 右键编辑数据库连接 - 高级 - 勾选保持连接间隔 - 输入框设置为20 - 点击确定! 参考文章:https://51.ruyo.net/14030.…...
nginx重启报错nginx: [error] invalid PID number
nginx重启报错nginx: [error] invalid PID numb 解决亲测有用 问题描述解决方式 问题描述 编译安装完 nginx 后,启动 nginx时,出现nginx已经在运行,然后输入 ./nginx -s reload时,出现了 nginx: [error] invalid PID number “” in “/us…...
人工智能深度学习系列—深度学习中的相似性追求:Triplet Loss 全解析
人工智能深度学习系列—深度解析:交叉熵损失(Cross-Entropy Loss)在分类问题中的应用 人工智能深度学习系列—深入解析:均方误差损失(MSE Loss)在深度学习中的应用与实践 人工智能深度学习系列—深入探索KL…...
26. Hibernate 如何自动生成 SQL 语句
1. 前言 本节和大家一起聊聊 Hibernate 是如何自动生成 SQL 语句的。通过本节的学习,你将了解到: 反射在框架中的重要性;元数据描述对 Hibernate 的重要性。 2. 理想状态 Hibernate 是全自动的 JDBC 框架,能自动构建 SQL 语句、…...
预言机(Oracle machine)
预言机(Oracle machine)是一个在多个领域中有不同应用和解释的概念。以下是从不同角度对预言机的详细解析: 一、计算复杂度理论与可计算性理论中的预言机 在计算复杂度理论与可计算性理论中,预言机是一种抽象电脑,用…...
55、PHP实现插入排序、二分查找
题目: PHP实现插入排序 描述: 思路:选择一个带插入的元素(假设从第一个开始),分别和已经插入有顺序的元素比较,如果要插入元素比比较元素小,则位置交换 function insertSort($arr){if(!is_array($arr)) return false;//外层循环插入次数for($i1;$i<…...
[Git][分支设计规范]详细讲解
目录 0.概览1.master分支2.release分支3.develop分支4.feature分支5.hotfix分支 0.概览 以下是常用的分支和环境的搭配,可视情况而定不同的策略 分支名称适用环境master主分支生产环境release预发布分支预发布/测试环境develop开发分支开发环境feature需求开发分支本…...
c#中winfrom需要了解的
如何用代码实现label1的字体大小 方法1:在设计视图中设置 打开你的Windows Forms项目。 在设计视图中,选中你想要更改字体大小的Label控件。 在属性窗口中,找到Font属性,点击旁边的省略号(...)。 在弹出的字体对话框中&#x…...
操作系统03:调度算法和文件系统
文章目录 调度算法进程调度算法先来先服务调度算法最短作业优先调度算法高响应比优先调度算法时间片轮转调度算法最高优先级调度算法 内存页面置换算法最佳页面置换算法(OPT)先进先出置换算法(FIFO)最近最久未使用的置换算法&…...
大量中国高清地图,必须收藏!!
1、中国人口密度 2、中国干湿区 3、中国温度带和干湿状况 4、中国气温分布 5、中国高陆状况 6、国家级高新技术产业开发区 7、中国工业布局的变化 8、中国旱灾 9、中国常年河与时令河 10、中国科斯塔地貌分布图 11、中国泥石流、滑坡崩塌灾害分布 12、中国森林和主要牧区分布图…...
无线领夹麦克风哪个品牌好,2024年收音麦哪个品牌好一点
在自媒体的浪潮中,内容创作者对于高质量音频的需求日益增长,这直接推动了无线领夹麦克风的兴起。过去,创作者们可能更倾向于使用传统的有线麦克风,但随着技术的进步和市场的变化,无线领夹麦克风以其便携性和灵活性的优…...
如何解决.NET8 类库Debug时,Debug文件夹中不包含Packages中引入的文件
最近在开发中使用了.NET8 Razor类库项目,但是惊讶的发现Debug时,Debug文件夹中不包含Packages中引入的文件,本以为是非常小的问题,但是被困住了竟然足足4个小时。 其实它也本就是个非常非常小的问题…… 只需引入<CopyLocalL…...
域名安全详解
域名安全是网络安全的重要组成部分,涉及多个方面。以下是域名安全的详细介绍: 1. 域名劫持防护 域名劫持是指攻击者通过各种手段,将用户访问的域名解析到非法IP地址上。 防护措施: 使用DNSSEC(域名系统安全扩展)定期监控域名解析记录选择可靠的域名注册商和DNS服务提供…...
我让 Claude 和 Codex 同时审计 个模块,它们只在 个上达成共识识
整体排查思路 我们的目标是验证以下三个环节是否正常: 登录成功时:服务器是否正确生成了Session并返回了包含正确 JSESSIONID的Cookie给浏览器。 浏览器端:浏览器是否成功接收并存储了该Cookie。 后续请求:浏览器在执行查询等操作…...
【信息科学与工程学】【管理科学】第十六篇 利益设计与分配:从静态薪酬到动态激励生态系统的工程化重构
1. 从静态薪酬到动态激励:一场组织动力系统的革命 记得三年前我参与过一家科技公司的薪酬体系改革项目。当时他们的CTO对我说:"我们给工程师的薪水在行业里算高的,但为什么总感觉大家没干劲?"这个问题困扰着无数技术管理…...
高光谱成像基础(十二)光谱重建(Spectral Reconstruction)卸
认识Pass层级结构 Pass范围从上到下一共分为5个层级: 模块层级:单个.ll或.bc文件 调用图层级:函数调用的关系。 函数层级:单个函数。 基本块层级:单个代码块。例如C语言中{}括起来的最小代码。 指令层级:单…...
filezilla求助
求助各位,filezilla一直这样连接不上,之前是连接成功之后就超时,按网上说的关了防火墙,把设置改为主动,然后禁用超时,就一直这样了,我们老师的源代码和交作业都要用ftp,真没办法了...
DOL-CHS-MODS整合包:2024一站式解决方案,3大优势助你轻松体验Degrees of Lewdity
DOL-CHS-MODS整合包:2024一站式解决方案,3大优势助你轻松体验Degrees of Lewdity 【免费下载链接】DOL-CHS-MODS Degrees of Lewdity 整合 项目地址: https://gitcode.com/gh_mirrors/do/DOL-CHS-MODS DOL-CHS-MODS整合包作为Degrees of Lewdity游…...
深入解析POODLE漏洞:SSL3.0的CBC模式安全隐患与防御策略
1. POODLE漏洞的前世今生 第一次听说POODLE漏洞时,我还以为是什么可爱的狗狗品种。后来才发现,这个听起来萌萌的名字背后,隐藏着一个足以让整个互联网颤抖的安全威胁。POODLE全称Padding Oracle On Downgraded Legacy Encryption,…...
从体素到三维模型:解析Volumetric Method在复杂场景重建中的核心算法
1. 什么是Volumetric Method?从体素到三维世界的魔法 第一次接触三维重建时,我被那些从照片变成立体模型的演示惊呆了。后来才知道,这背后藏着一种叫Volumetric Method的技术,它就像用乐高积木搭建世界——把空间切成无数小方块&a…...
终极启动盘制作工具:Deepin Boot Maker 完整使用指南
终极启动盘制作工具:Deepin Boot Maker 完整使用指南 【免费下载链接】deepin-boot-maker 项目地址: https://gitcode.com/gh_mirrors/de/deepin-boot-maker Deepin Boot Maker 是一款免费开源、简单快速的启动盘制作工具,专为新手和普通用户设计…...
如何高效使用UsbDk驱动开发套件:Windows USB设备控制的专业实战指南
如何高效使用UsbDk驱动开发套件:Windows USB设备控制的专业实战指南 【免费下载链接】UsbDk Usb Drivers Development Kit for Windows 项目地址: https://gitcode.com/gh_mirrors/us/UsbDk UsbDk(USB Development Kit)是一款专为Wind…...
文件(内部/外部)存储
Android 文件存储主要分为**内部存储**、**外部存储**(现在叫分区存储)和**其他介质**(如 SD 卡、USB)。理解它们的区别对开发很重要,特别是 Android 10+ 引入的**分区存储**机制。 1. 内部存储 (Internal Storage) 特点:私有、安全、随应用卸载而删除。其他应用和用户…...
