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

微服务重启优化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来变相实现多服务通知呢?

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【Docker】Docker-compose 单机容器集群编排工具
  • Armpro搭建教程全开源版的教程
  • 【BUG】已解决: KeyboardInterrupt
  • Ubuntu16.04环境下Baxter机器人开发环境搭建要点说明
  • windows ssh的登录,私钥权限太开放 WARNING: UNPROTECTED PRIVATE KEY FILE!
  • 在 CI/CD Pipeline 中实施持续测试的最佳实践!
  • C 语言实例 - 使用引用循环替换数值
  • 【LeetCode】填充每个节点的下一个右侧节点指针 II
  • PHP 表单验证:邮件和URL
  • 【每日一练】python编写一个简易计算器
  • ETCD介绍以及Go语言中使用ETCD详解
  • IDEA的详细设置
  • 【Spark官方文档部分翻译】RDD编程指南(RDD Programming Guide)
  • Oracle 12c新特性 In-Memory Column Store
  • WebGIS主流的客户端框架比较|OpenLayers|Leaflet|Cesium
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 2017年终总结、随想
  • CentOS7简单部署NFS
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • ES6简单总结(搭配简单的讲解和小案例)
  • gitlab-ci配置详解(一)
  • PHP 7 修改了什么呢 -- 2
  • PHP 的 SAPI 是个什么东西
  • 编写高质量JavaScript代码之并发
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 从零开始学习部署
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 前嗅ForeSpider中数据浏览界面介绍
  • 设计模式走一遍---观察者模式
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 小李飞刀:SQL题目刷起来!
  • 新版博客前端前瞻
  • 正则表达式
  • 终端用户监控:真实用户监控还是模拟监控?
  • scrapy中间件源码分析及常用中间件大全
  • 数据可视化之下发图实践
  • 正则表达式-基础知识Review
  • ​虚拟化系列介绍(十)
  • #微信小程序:微信小程序常见的配置传值
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (+3)1.3敏捷宣言与敏捷过程的特点
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (LLM) 很笨
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (二)linux使用docker容器运行mysql
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (四)图像的%2线性拉伸
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转载)(官方)UE4--图像编程----着色器开发