1. 首页 > 快讯

实操:大规模微服务架构下的优雅停机-微服务优雅下线

这篇文章给大家聊聊关于实操:大规模微服务架构下的优雅停机-微服务优雅下线,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。

大规模微服务改造后,白天重启或扩缩容服务实例时,系统经常会出现“无法连接到服务器”的错误(该错误是微服务框架抛出的异常,表明客户端无法连接到服务器)访问服务器)。到指定的服务器),导致部分用户无法接受服务,影响用户感知。

[[339209]]

问题分析我们生产环境的微服务框架是通过向Zookeeper进行服务注册来发现的。如下图1所示:

图1:服务注册调用流程图

其主要调用逻辑为:

生成容器,并在容器中启动服务;注册到服务路由器(Zookeeper);服务调用者订阅服务路由器;服务路由器发生注册变化,通知服务调用者获取新的注册列表;服务调用方根据获取的服务端列表获取新的注册列表进行服务调用。但当服务器实例停止时,由于服务器不会主动更改业务路由器上的注册信息,因此客户端需要40秒(目前应用于Zookeeper的会话超时配置)来消除此异常配置。在这40秒内应用程序仍然会继续尝试访问这个不存在的实例,从而导致大量的业务错误。

这也与每次实例重启后错误的持续时间一致。并且由于微服务的特性,每个实际业务请求都会根据业务需求多次调用同一个服务,这就增加了每个业务请求访问异常实例的可能性,加剧了业务失败的概率。

所以这是微服务架构下由服务实例暴力停止导致并因单个业务请求多次访问而放大的问题。

解决方案由于这是服务实例暴力关闭导致的问题,所以我们开始研究基于微服务的优雅关闭方法。

微服务架构中应用程序的优雅关闭主要是指应用程序实例有计划地平滑退出(即不进行任何需要处理的动作或产生异常错误)。主要有两种方式:

方法一:通过微服务框架的检测能力来实现。例如,在Spring Cloud微服务框架中,提供了执行器组件的/health端点。客户端需要实现一个自定义的HealthCheckHandler,它将应用程序的健康状态保存在内存中。只需要使用curl向服务器发送关闭命令即可。一旦状态发生变化,就会重新向服务器注册。方法二:通过注册JDK的ShutdownHook(钩子)来实现。当系统收到exit命令时,首先将自己从Zookeeper注册服务器上注销,并停止接收新消息。然后处理积压的请求,最后调用资源。回收接口销毁资源,最后各个线程退出执行。由于我们的生产环境没有采用开源的通用微服务架构,并且应用都是基于JAVA开发的,所以我们采用第二种方法:注册JDK的ShutdownHook(关机钩子)来实现优雅关闭。

shutdown hook本质上是一个线程(也称为Hook线程),用于监视JVM的关闭。关闭钩子可以通过Runtime 的addShutdownHook 注册到JVM。 Hook线程只有在JVM正常关闭时才会执行,强制关闭时不会执行。

JVM正常关闭的场景主要有以下几种:

Java程序正常运行退出时会被调用;当在终端中按ctrl-c 终止命令时将调用它;当JVM 由于OutOfMemory 退出时会调用它;当Java程序中执行System.exit()时会调用它;操作系统关闭时会调用;当Linux通过kill pid(或kill -15 pid)结束进程时会调用它。 JDK中ShutdownHook相关源码如下图2所示:

图2:添加和删除实现

ShutdownHook是如何调用的?使用java.lang.Runtime.addShutdownHook方法,可以注册一个JVM关闭钩子(线程),如下图3所示。我们希望程序在JVM退出时完成的各种完成任务,例如关闭资源、在服务路由器上注销注册信息、等待传输中的请求处理完成等都可以添加到这个线程中。

图3:注册JVM 关闭挂钩的示例

当然,优雅退出需要超时控制机制。如果达到超时时间,退出前的资源回收等操作仍未完成,则关闭脚本直接调用KILL -9 PID或调用强制关闭进程的代码强制退出。否则,可能会等待。长期以来,影响了我们正常的启停操作。

其它注意事项1、以下场景会直接停止JVM进程。 JVM没有机会执行关闭钩子线程时的清理工作,无法实现正常关闭:

Kill -9(SIGKILL 信号);调用java.lang.runtime.halt() 方法;主机直接崩溃;主机直接关机;主机内存(或容器内存)不足,触发操作系统OOM-KILLER。 2、hook线程会延迟JVM的关闭时间,所以尽量减少执行时间,控制好超时。

效果代码优化后,通过测试环境验证和固定场景实际生产演练,容器销毁或正常重启时没有出现“无法连接到服务器”的错误,也解决了业务感知问题。解决了这个问题之后,在大规模微服务架构的场景下,容器的自动自愈、扩缩容等功能就可以再次使用了。

总结微服务的优雅关闭没有最优的解决方案。只要抓住核心思想并进行设计即可。如果你使用的框架中有这样的方案,建议直接使用,因为它的适应性肯定是最高的。在微服务架构中,我们可以遵循以下推荐规则来设计微服务的优雅关闭机制:

所有微服务应用都应该支持优雅关闭;优先注销注册中心注册的服务实例;被关闭的服务应用程序的接入点被标记为拒绝服务;上游服务支持因正常关闭而被拒绝的服务的故障转移;还根据具体业务提供适当的关机接口。

好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!

用户评论

念初

感觉这个话题非常实用,一直都很想了解如何让微服务优雅地停止。

    有10位网友表示赞同!

绳情

大规模微服务的停机确实是个难题,这篇文章能提供一些经验教训吗?

    有5位网友表示赞同!

无关风月

之前没接触过 “优雅停机”的概念,现在越来越觉得微服务架构需要重视这个问题了。

    有17位网友表示赞同!

一别经年

看标题就感觉很有干货,期待作者分享具体的实操技巧和案例。

    有18位网友表示赞同!

顶个蘑菇闯天下i

希望这篇文章能简单易懂地讲解这个复杂的话题,方便我们学习实践。

    有15位网友表示赞同!

抚涟i

我一直对微服务的管理很感兴趣,停机机制是其中很重要的一部分。

    有11位网友表示赞同!

命运不堪浮华

在大规模系统中,优雅停机的重要性应该不能忽视。希望能通过文章深入理解。

    有10位网友表示赞同!

丢了爱情i

平时工作也会遇到类似问题,希望这篇文章能提供一些解决方法和思路。

    有19位网友表示赞同!

墨染年华

微服务的架构越来越流行,了解如何优雅停机是必不可少的技能之一。

    有17位网友表示赞同!

墨城烟柳

看起来内容很有深度,希望能从文章中学习到一些实践技巧和经验分享。

    有11位网友表示赞同!

别在我面前犯贱

以前总是把停机看成一个简单的事儿,没想到还有这么多的讲究。

    有6位网友表示赞同!

昂贵的背影

大规模微服务架构确实需要一套完善的停机方案,防止系统故障和混乱状态。

    有18位网友表示赞同!

尘埃落定

关注这篇文章,期待作者能提供一些实用的解决方法和工具建议。

    有18位网友表示赞同!

代价是折磨╳

我已经开始使用微服务架构进行开发,这个标题引起了我的注意。

    有8位网友表示赞同!

盲从于你

希望文章可以分享具体的代码实现方式和步骤,方便实践操作。

    有9位网友表示赞同!

淡抹烟熏妆丶

这个话题很有挑战性,也体现了微服务架构的复杂性。

    有6位网友表示赞同!

墨染殇雪

期待能从文中学习到一些关于微服务的最佳实践和设计原则。

    有12位网友表示赞同!

有一种中毒叫上瘾成咆哮i

技术发展不断进步,对微服务的管理方法也越来越重视。

    有9位网友表示赞同!

仅有的余温

这篇文章很及时也很实用,希望能给大家提供一些解决实际问题的思路。

    有5位网友表示赞同!

本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.iotsj.com//kuaixun/7710.html

联系我们

在线咨询:点击这里给我发消息

微信号:666666