1.ä¸å½ä½è²å½©ç¥¨6å1ä»ä¹å¼å§åè¡ç
2.Dubbo 优雅停机演进之路
3.Java ShutDown Hook介绍和实例
ä¸å½ä½è²å½©ç¥¨6å1ä»ä¹å¼å§åè¡ç
è¿ å© é 以
ä¸ è© æ
iky.baidu/www.1-un.com?sjup
1ã使ç¨Servlet容å¨è¿è¡ï¼TomcatãJettyçï¼----ä¸å¯å
缺ç¹ï¼å¢å å¤ææ§ï¼ç«¯å£ã管çï¼ æµªè´¹èµæºï¼å åï¼
å®æ¹ï¼æå¡å®¹å¨æ¯ä¸ä¸ªstandaloneçå¯å¨ç¨åºï¼å 为åå°æå¡ä¸éè¦TomcatæJBossçWeb容å¨çåè½ï¼å¦æ硬è¦ç¨Web容å¨å»å è½½æå¡æä¾æ¹ï¼å¢å å¤ææ§ï¼ä¹æµªè´¹èµæºã
2ãèªå»ºMainæ¹æ³ç±»æ¥è¿è¡ï¼Spring容å¨ï¼ ----ä¸å»ºè®®ï¼æ¬å°è°è¯å¯ç¨ï¼
缺ç¹ï¼ Dobboæ¬èº«æä¾çé«çº§ç¹æ§æ²¡ç¨ä¸ èªå·²ç¼åå¯å¨ç±»å¯è½ä¼æ缺é·
å®æ¹ï¼æå¡å®¹å¨åªæ¯ä¸ä¸ªç®åçMainæ¹æ³ï¼å¹¶å è½½ä¸ä¸ªç®åçSpring容å¨ï¼ç¨äºæ´é²æå¡ã
3ã使ç¨Dubboæ¡æ¶æä¾çMainæ¹æ³ç±»æ¥è¿è¡ï¼Spring容å¨ï¼----建议使ç¨
ä¼ç¹ï¼æ¡æ¶æ¬èº«æä¾ï¼com.alibaba.dubbo.container.Mainï¼
å¯å®ç°ä¼é åæºï¼ShutdownHookï¼
å®æ¹ï¼æå¡å®¹å¨çå è½½å 容å¯ä»¥æ©å±ï¼å ç½®äºspring, jetty, log4jçå è½½ï¼å¯éè¿Containeræ©å±ç¹è¿è¡æ©å±
Dubboæ¯éè¿JDKçShutdownHookæ¥å®æä¼é åæºçï¼æ以å¦æç¨æ·ä½¿ç¨"kill -9 PID"ç强å¶å ³éæ令ï¼æ¯ä¸ä¼æ§è¡ä¼é åæºçï¼åªæéè¿"kill PID"æ¶ï¼æä¼æ§è¡ã
Dubbo 优雅停机演进之路
一、前言
在深入探讨 Dubbo 实现优雅停机的机制之前,我们需要理解 Java 实现优雅停机的原理。接下来,我们将详细研究 Dubbo 如何在不同版本中解决优雅停机的实现问题。
二、开源威客系统 源码Dubbo 优雅停机待解决的问题
为了实现优雅停机,Dubbo 需要解决三个核心问题:确保新的请求不再发往正在停机的服务提供者,注销注册中心以通知消费者下线服务,以及关闭与客户端的连接,以避免正在进行的服务请求被忽略。
三、2.5.X 版本实现
在 Dubbo 2.5.X 版本中,优雅停机实现较为完整且易于理解。该版本的核心在于使用 AbstractConfig 静态代码注册一个 ShutdownHook,并在应用停机时调用 ProtocolConfig.destroyAll() 方法来执行主要的优雅停机流程。
3.1、优雅停机总体实现方案
优雅停机的入口类位于 AbstractConfig 静态代码中,其作用是注册一个 ShutdownHook,确保一旦应用停机,将调用 ProtocolConfig.destroyAll() 方法来销毁所有协议配置。公式源码成交量
3.2、注销注册中心
注销注册中心是优雅停机实现中的关键步骤。这通常通过调用 AbstractRegistry 的相关方法来完成,具体操作包括从注册中心删除服务节点、取消订阅,以及最后关闭与注册中心的连接。
3.3、注销 Protocol
在关闭服务时,Dubbo 会处理两种 Protocol 子类:用于服务端请求交互的 DubboProtocol 和用于内部请求交互的 InjvmProtocol。主要关注 DubboProtocol 的黄金点买卖指标源码内部逻辑,包括关闭 Server 和 Client 的具体操作。
3.4、关闭 Server
关闭 Server 的过程涉及向服务消费者发送 READ_ONLY 事件,确保消费者排除掉停机的服务节点。然后关闭心跳检测和底层通讯框架 NettyServer,以降低服务被消费者调用的风险。
3.5 关闭 Client
关闭 Client 的流程与关闭 Server 类似,重点关注处理已经发出请求的逻辑,确保所有请求都得到响应。
四、信息流app源码2.7.X 版本改进
随着 Spring 框架的使用,2.5.X 版本的停机过程可能导致优雅停机失效。为解决这一问题,Dubbo 从 2.6.X 版本开始重构相关逻辑,并最终在 2.7.X 版本中解决了“双 hook”问题,通过引入 ShutdownHookListener 监听 Spring 关闭事件,确保优雅停机流程不受 Spring 关闭事件的影响。
五、总结
实现优雅停机看似简单,但其中细节复杂,源码包编译安装php任何一个环节出现问题都可能导致优雅停机失效。学习和参考 Dubbo 的实现逻辑,可以为解决相关问题提供宝贵经验。Dubbo 系列文章和资源提供了深入的见解,帮助你更全面地理解 Dubbo 的优雅停机机制。
Java ShutDown Hook介绍和实例
Java的ShutDown Hook机制允许开发者在Java虚拟机(JVM)即将关闭之前执行一些清理或终止操作。这种机制提供了一个钩子,让开发者在JVM关闭时捕获关闭事件并执行相应的逻辑。在源码中,主要涉及两个类:ApplicationShutdownHooks和Runtime。
添加Hook实际上是在ApplicationShutdownHooks的静态Map中放入新的线程。这些线程在程序退出时被运行,每个带有Hook任务的线程的start()方法才被执行。由于Hook之间是独立的线程,它们的执行顺序没有关系。主线程调用每个Hook线程的join方法,确保主线程等待所有Hook执行完毕后退出。
有一些情况无法添加Hook:1. ApplicationShutdownHooks已经在调用Hook时,hooks会被置为null,无法添加新Hook。2. Hook的Thread不能是已经在运行状态的线程。3.因为储存的Hook是根据线程是否相同来判断的,所以不能添加相同的Hook。
ShutDown Hook不适用于处理非正常退出的情况,如kill -9命令。同时,使用ShutDown.halt和kill -9一样都是强制退出,不会给Hook执行的机会。
下面是一个简单的ShutDown测试例子。通过GitHub地址可以找到这个例子。
ShutDown的使用相对简单,网上有很多关于Spring和Dubbo等开源框架使用ShutDown Hook的例子,主要应用于资源释放和清理工作。
需要注意的是,Hook的执行顺序是无序的,不能重复添加相同的Hook,且已经执行的Hook不能再创建新的Hook。
在平时的应用中,ShutDown Hook的使用频率较低。一个有用的场景是在JVM挂掉时,Hook中可以给监控程序发送通知,如发邮件等,以便技术人员进行处理。
关于ShutDown Hook的相关资料,可以参考Oracle官网资料、Java Shutdown Hook的场景使用和源码分析、以及Adding Shutdown Hooks for JVM Applications等。