当前位置: 首页 > 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来变相实现多服务通知呢?

http://www.lryc.cn/news/404272.html

相关文章:

  • removeIf 方法设计理念及泛型界限限定
  • kubernetes集群部署elasticsearch集群,包含无认证和有认证模式
  • Java 随笔记: 集合与泛型
  • SurrealDB:高效构建实时Web应用的数据库
  • SQL Server查询计划阅读及分析
  • SAP Fiori 实战课程(二):新建页面
  • 【Rust光年纪】超越ORM:探索Rust语言多款数据库客户端库的核心功能和使用场景
  • 解决:事件监听器 addEventListener 被多次调用
  • 配置RIPv2的认证
  • 前端调试技巧:动态高亮渲染区域
  • 深克隆与浅克隆的区别与实现
  • 【学习笔记】无人机系统(UAS)的连接、识别和跟踪(六)-无人机直接C2通信
  • 认识和安装R的扩展包,什么是模糊搜索安装,工作目录和空间的区别与设置
  • 解决STM32开启定时器时立即进入一次中断程序问题
  • Unity UGUI 之EventSystem
  • USB转多路UART - USB 基础
  • 接近50个实用编程相关学习资源网站
  • 在数据操作中使用SELECT子句
  • Golang | Leetcode Golang题解之第274题H指数
  • 区块链技术在智能家居中的创新应用探索
  • 无需业务改造,一套数据库满足 OLTP 和 OLAP,GaiaDB 发布并行查询能力
  • PHP 表单验证:邮件和URL
  • 前端八股文 路由的懒加载
  • HarmonyOS Web组件(二)
  • HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 单选题序号2
  • 基于python深度学习遥感影像地物分类与目标识别、分割实践技术应用
  • 叶再豪降龙精英课程总结
  • 算法 - 查找算法(顺序、折半、红黑树、AVL树、B+树、散列)
  • TCP与UDP网络编程
  • 媲美Midjourney-v6,Kolors最新文生图模型部署