皮皮网

皮皮网

【36计2009源码】【回收源码】【微客服源码】DubboShutdownHook源码

时间:2024-11-19 02:27:27 分类:热点

1.中国体育彩票6十1什么开始发行的
2.Dubbo 优雅停机演进之路
3.Java ShutDown Hook介绍和实例

DubboShutdownHook源码

中国体育彩票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 如何在不同版本中解决优雅停机的实现问题。

       二、36计2009源码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 类似,重点关注处理已经发出请求的逻辑,确保所有请求都得到响应。

       四、django源码分析2.7.X 版本改进

       随着 Spring 框架的使用,2.5.X 版本的停机过程可能导致优雅停机失效。为解决这一问题,Dubbo 从 2.6.X 版本开始重构相关逻辑,并最终在 2.7.X 版本中解决了“双 hook”问题,通过引入 ShutdownHookListener 监听 Spring 关闭事件,确保优雅停机流程不受 Spring 关闭事件的影响。

       五、总结

       实现优雅停机看似简单,但其中细节复杂,米赚源码任何一个环节出现问题都可能导致优雅停机失效。学习和参考 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等。