对于微服务,需要服务优雅。
就发布而言,如果没有成功启动组件或容器,则不应暴露于外界。对于离线,如果机器停止,则应保证该服务是离线的,以免上游流量进入不健康的机器。
优雅的离线
基本离线(Spring/Springboot/Build -In -In容器)
首先,JVM本身通过ShutdownHook优雅地支持。
此方法在以下情况下支持优雅的停止:
1.程序正常退出2.使用system.exit()3。终端使用ctrl+c 4.使用kill pid杀死该过程
然后,如果您想要杀死-9程序,它肯定会不知所措。
在Springboot中,它实际上帮助您实现了一个关闭钩,以支持对CTRL+C或KILL -15项信号的响应。
这是什么意思?在春季,它支持优雅关闭的扩展)。
我们能做什么?实际上,很明显,在Doclose方法中,它发布了一种上下文cloctsedevent的方法,不是我们吗?
因此,我们可以写一个听众来聆听上下文cloctsctclosedevent,并在事件发生时脱机逻辑。对于微服务,该服务是从注册中心取消服务。
有疑问的是,在微观服务中,一般来说,取消服务通常是优雅离线的第一步,然后将执行关闭操作。那我现在该怎么办?
个人建议在取消服务后,您可以打开请求挡板以拒绝流量,并通过微服务框架本身的故障传输功能来处理被拒绝的流量。
离线在Docker中
因此,有人说我使用Docker来部署服务,并支持离线优雅。
让我们看一下Docker的一些停止命令:
一般而言,普通人可以使用Docker Stop或Docker Kill Command关闭容器(当然,如果您在上一步中注册USR2自定义信息,则可以由Docker Exec Kill -12关闭)。
对于Docker Stop,它将将容器的PID1进程发送到容器中,并且默认情况下,它将等待10s将Sigkill(杀死-9个信息)发送到PID1。
因此,很明显,Docker Stop允许该程序具有默认的10S反应时间来进行优雅的停止操作。该程序可以对杀伤-15信号做出一些反应,如上一步中所述,这是一种相对较好的方法。
当然,如果ShutDownHook方法执行50s,那么它绝对不是优雅。您可以通过Docker Stop -T添加等待时间。
外部容器的关闭脚本(码头)
如果您必须用外部容器部署它(个人认为您浪费资源并改善了复杂性),那么您可以优雅地停止吗?
当然,这里有两种方法:这里:
首先,RPC框架本身提供了一个优雅的上层和离线接口,以调整整个应用程序的生命周期,并为开发人员提供扩展点,以自定义服务停止服务到离线的服务。接口的操作将被封装在带有码头或其他容器的关闭脚本中的Prestop操作固化中,并确保下一个应用程序周期在容器停止之前结束。关闭端口 - >检查离线服务,直到关闭容器的过程。
另一个简单的方法是将Kill -15命令直接添加到脚本中。
在线优雅
优雅的启动可能更困难,因为没有默认实现方法,但简而言之,一个原则是确保端口存在之后可用。
Springboot建造 - 在线容器优雅在线
这非常简单,并且在构建容器的前提下实施了该行业的优雅性,并且也可以与一些健康检查一起使用。
请参阅SOFA-BOOT的健康检查的源代码,在程序启动时,它将对Springboot组件进行一些健康检查,然后对SOFA的一些中间件进行一些健康检查。整个健康检查过程完成后(Sofaboot当前不是其自己的应用程序级别的健康检查。它具有相关的界面,但是它将暴露于服务或优雅的在线服务,那么何时健康检查时间?羊毛布:
可以看出,它正在监视contextrefreshdevent的事件。在构建的-IN容器模式下,构建-in内置容器模式的启动方法是在RefreshContext方法中。执行该方法后,发布了一个contextrefreshedevent事件,这意味着,当听到事件时,构建的 - 内置容器必须成功。
但是,由于各种原因,在某些特定场景中,contextrefreshdevent事件将被多次听到contextrefreshdevent,并且无法确保最后一次事件是最后一次,以正确地实现优雅在线的逻辑。
Springboot中还有一个更大的后方事件,称为ApplicationReadyEvent。它的出版被隐藏在afterrefresh和后来的听众的句子中。
外部容器(码头)优雅在线
目前,大多数应用程序部署模式是码头部署模式或Docker部署模式(也使用Jetty Mirror),这实际上是外部容器。那么这种情况更加困难。至少在应用程序级别,无法观察到外部容器的操作状态,并且容器本身不会为您提供任何钩子。
因此,就像优雅的发布一样,RPC框架需要提供优雅的在线接口来初始化整个应用程序的生命周期,并为开发人员提供自定义逻辑(检测信息等)提供扩展点。进入开始后的操作,该操作在诸如Jetty之类的外部容器的启动脚本中进行了巩固服务直到完成过程。
作者:Fredalxin地址:https://fredal.xin/graceful-soa-updown