微服务重启优化kafka+EurekaNotificationServerListUpdater
由于遇到服务重启导致的业务中断等异常,所以计划通过kafka+eureka实现服务下线通知,来尽可能规避这类问题。
如果可以升级spring,则可以考虑nacos等更为方便的方案;
程序优化:
1.默认启用的为 PollingServerListUpdater,所以需要手动启用EurekaNotificationServerListUpdater
@Configuration
public class ConsumerRibbonClientConfig {@Beanpublic ServerListUpdater ribbonServerListUpdater() {return new EurekaNotificationServerListUpdater();}
}
2.需要触发PollingServerListUpdater中的更新,则需要先触发DiscoveryClient中的refreshRegistry
@Slf4j
@Component
public class EurekaRefreshUpdater {public void refresh() {try {log.info("EurekaRefreshUpdater-begin");Method method = DiscoveryClient.class.getDeclaredMethod("refreshRegistry");method.setAccessible(true);method.invoke(SpringUtil.getBean(DiscoveryClient.class));log.info("EurekaRefreshUpdater-end");} catch (Exception e) {log.error("EurekaRefreshUpdater"+e.getMessage(), e);e.printStackTrace();}}
3.服务关机listener
@Component
@KafkaListener(topics = GracefulShutdownConfigConstant.KAFKA_TOPIC)
@Slf4j
public class ServiceDowntimeListener {@AutowiredEurekaRefreshUpdater eurekaRefreshUpdater;@KafkaHandlerpublic void onMessage(@Payload String message, Acknowledgment acknowledgment) {log.info("服务关机-接收到其他服务关机信息,message:{}", JSON.toJSONString(message));eurekaRefreshUpdater.refresh();acknowledgment.acknowledge();}
}
4.自己关机发送消息通知
@Slf4j
@Component
public class GracefulShutdown {@Value("${server.graceful.shutdown.seconds:30}")private Integer serverGracefulShutdownSeconds;@AutowiredEurekaClient eurekaClient;@Value("${spring.application.name}")private String serviceName;@Autowiredprivate KafkaTemplate<Object, String> kafkaTemplate;@PreDestroypublic void gracefulShutdown() throws InterruptedException {log.info("gracefulShutdown wait {} seconds -- begin", serverGracefulShutdownSeconds);eurekaClient.shutdown();new Thread(() -> {kafkaTemplate.send(GracefulShutdownConfigConstant.KAFKA_TOPIC,1,serviceName);kafkaTemplate.send(GracefulShutdownConfigConstant.KAFKA_TOPIC,0,serviceName);}).start();Thread.sleep(serverGracefulShutdownSeconds * 1000);log.info("gracefulShutdown shutdown");}
}
脚本优化
在服务启动脚本中,要注意不可使用kill -9 结束服务进程,需要使用kill -15 让服务有一定的存活时间。来处理完成已有的请求。
问题
1.kafka通过group分组,如果同一组则只能收到一条信息。如果同一服务部署两个节点,则不能很好的都通知到位,所以在创建kafka通知的时候,根据服务的部署情况,利用分区+多条通知,来变相实现全广播。
./kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 3 --partitions 2 --topic shutdown_service
2.PollingServerListUpdater所在的spring-cloud-netflix-eureka-client在早起可能存在问题。具体详见:
EurekaNotificationServerListUpdater启用后出现 Connection refused (Connection refused)
ps:
需要注意下程序版本以及kafka版本,防止某些方法不适用。
如果高版本kafka 是否可以通过指定不同的groupid来变相实现多服务通知呢?
相关文章:
微服务重启优化kafka+EurekaNotificationServerListUpdater
由于遇到服务重启导致的业务中断等异常,所以计划通过kafkaeureka实现服务下线通知,来尽可能规避这类问题。 如果可以升级spring,则可以考虑nacos等更为方便的方案; 程序优化: 1.默认启用的为 PollingServerListUpdater…...
removeIf 方法设计理念及泛型界限限定
ArrayList 中的 removeIf 方法是 Java 8 中引入的集合操作方法之一。它使用了 Predicate 接口作为参数,以便根据指定的条件移除集合中的元素。以下是对 removeIf 方法入参设计的详细解释: Predicate 接口 Predicate 是一个函数式接口,定义了…...
kubernetes集群部署elasticsearch集群,包含无认证和有认证模式
1、背景: 因公司业务需要,需要在测试、生产kubernetes集群中部署elasticsearch集群,因不同环境要求,需要部署不同模式的elasticsearch集群, 1、测试环境因安全性要求不高,是部署一套默认配置; 2…...
Java 随笔记: 集合与泛型
文章目录 1. 集合框架概述2. 集合接口2.1 Collection 接口2.2 List 接口2.3 Set 接口2.4 Map 接口 3. 集合的常用操作3.1 添加元素3.2 删除元素3.3 遍历元素3.4 判断大小3.5 判断是否为空 4. 迭代器4.1 迭代器的作用4.2 迭代器的使用4.3 迭代器与增强 for 循环4.4 迭代器的注意…...
SurrealDB:高效构建实时Web应用的数据库
SurrealDB:数据驱动,实时协同。用SurrealDB简化你的开发流程- 精选真开源,释放新价值。 概览 SurrealDB,一款专为现代Web应用设计的云原生数据库,以其创新的架构和功能,为开发者提供了一个强大的工具。它整…...
SQL Server查询计划阅读及分析
6.4.5. 查询计划阅读及分析 SQL Server中,SQL语句的查询计划可能会包含多个节点,每个节点除了包含和对应一个操作符外,还包含节点及操作符相关的其他信息,其细节与具体的操作符相关。SQL Server查询计划与Oracle执行计划中,虽然每个节点所包含内容的具体称谓…...
SAP Fiori 实战课程(二):新建页面
课程回顾 上一课中,利用Visual studio Code 新建、并运行了一个Demo工程。可以实现对项目的启动,启动后进入一个List清单。 那么本次课程的目前就是在上一节Demo的基础上,从零开始新建一个完整的页面。实现从首页清单,选择行后,鼠标点击,进入下一个页面。 准备工作 在开…...
【Rust光年纪】超越ORM:探索Rust语言多款数据库客户端库的核心功能和使用场景
数据库操作新选择:从异步操作到连接管理,掌握Rust语言数据库客户端库的全貌 前言 在现代软件开发中,与数据库进行交互是一个常见的任务。Rust语言作为一种高性能、内存安全的编程语言,拥有丰富的生态系统来支持各种数据库操作。…...
解决:事件监听器 addEventListener 被多次调用
背景: 给一个元素添加了事件监听,click 会触发 然而在实际场景中,点击一次,事件会被触发两次 阻止冒泡也没有用 解决: 使用API:event.stopImmediatePropagation() stopImmediatePropagation() 方法可防止…...
配置RIPv2的认证
目录 一、配置IP地址、默认网关、启用端口 1. 路由器R1 2. 路由器R2 3. 路由器R3 4. Server1 5. Server2 二、搭建RIPv2网络 1. R1配置RIPv2 2. R2配置RIPv2 3. Server1 ping Server2 4. Server2 ping Server1 三、模拟网络攻击,为R3配置RIPv2 四、在R…...
前端调试技巧:动态高亮渲染区域
效果: 前端界面的渲染过程、次数,会通过高亮变化来显示,通过这种效果排除一些BUG 高亮 打开方式 F12进入后点击ESC,进入rendering,选择前三个即可(如果没有rendering,点击橘色部分勾选上&…...
深克隆与浅克隆的区别与实现
在软件开发中,克隆对象是一个常见需求。克隆的方式主要有两种:深克隆(Deep Clone)和浅克隆(Shallow Clone)。了解它们的区别及其实现方法,对于编写高效、安全的代码非常重要。 深克隆与浅克隆的…...
【学习笔记】无人机系统(UAS)的连接、识别和跟踪(六)-无人机直接C2通信
目录 引言 5.4 直接C2通信 5.4.1 概述 5.4.2 A2X直接C2通信服务的授权策略 5.4.3 USS使用A2X直接C2通信服务的C2授权程序 5.4.4 直接C2通信建立程序 引言 3GPP TS 23.256 技术规范,主要定义了3GPP系统对无人机(UAV)的连接性、身份识别…...
认识和安装R的扩展包,什么是模糊搜索安装,工作目录和空间的区别与设置
R语言以其强大的功能和灵活的扩展性,成为了无数数据分析师和研究者的首选工具。R的丰富功能和海量扩展包直接相关,但如何高效管理这些扩展包,进而充分发挥R的强大潜力?本文将为您揭示这些问题的答案。 一、R的扩展包 R的包(packages)是由R函数、数据和预编译代码组成的一…...
解决STM32开启定时器时立即进入一次中断程序问题
转自 解决STM32开启定时器时立即进入一次中断程序问题_stm32f407定时器初始化自动进入一次-CSDN博客 配置STM32定时器时,定时器中断使能、定时器使能、清除更新中断标志位,三者不同顺序程序执行时有不同效果,具体如下: TIM_Clea…...
Unity UGUI 之EventSystem
本文仅作学习笔记与交流,不作任何商业用途 本文包括但不限于unity官方手册,唐老狮,麦扣教程知识,引用会标记,如有不足还请斧正 1.EventSystem是什么? 有需要请查看手册:Unity - 手册࿱…...
USB转多路UART - USB 基础
一、 前言 断断续续做了不少USB相关开发,但是没有系统去了解过,遇到问题就很被动了。做这个USB转UART的项目就是,于是专门花了一天的时间学习USB及CDC相关,到写这文章时估计也忘得差不多了,趁项目收尾阶段记录一下&am…...
接近50个实用编程相关学习资源网站
Date: 2024.07.17 09:45:10 author: lijianzhan 编程语言以及编程相关工具等实用性官方文档网站 C语言文档:https://learn.microsoft.com/zh-cn/cpp/c-languageMicrosoft C、C和汇编程序文档:https://learn.microsoft.com/zh-cn/cppJAVA官方文档&#…...
在数据操作中使用SELECT子句
目录 一、INSERT 语句中使用 SELECT子句 二、UPDATE 语句中使用 SELECT子句 三、DELETE 语句中使用 SELECT子句 一、INSERT 语句中使用 SELECT子句 在 INSERT 语句中使用 SELECT子句,可以将一个或多个表或视图中的数据添加到另外一个表中。使用 SELECT 子句还可以…...
Golang | Leetcode Golang题解之第274题H指数
题目: 题解: func hIndex(citations []int) int {// 答案最多只能到数组长度left,right:0,len(citations)var mid intfor left<right{// 1 防止死循环mid(leftright1)>>1cnt:0for _,v:range citations{if v>mid{cnt}}if cnt>mid{// 要找…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...
