1 介绍

微服务架构中的应用优雅停机主要是指应用实例有计划而平滑(即不产生需要处理的事故)的退出。应用服务器的停机主要分为两类:主动停机和被动停机,而其中主动停机和大部分的被动停机都是可以实现优雅停机。如果应用不做优雅停机,则会带来以下情况:

  • 数据丢失:内存的中数据尚未持久化至磁盘

  • 文件损坏:正在操作写的文件因没有更新完成,导致文件损坏

  • 请求丢失:排队中等待处理的请求丢失

  • 响应丢失:成功的交易还没来得及做出响应

  • 交易中断:正在处理至中间状态的交易被强制中断

  • 服务未下线:上游服务依然还会继续往下游服务发送消费请求

而我们微服务的优雅升级的目标就是避免以上几种情况,从而避免人工干预的工作量和提升微服务架构的服务高可靠。

2 使用场景

优雅停机可以解决以下场景:

  • KILL PID

  • 应用意外自动退出(System.exit(n))

  • 使用脚本命令的方式停止应用

优雅停机解决不了以下场景:

  • 突然断电

  • 机器物理破坏

  • KILL-9 PID 或 taskkill /f /pid

3 ShutdownHook

Java的优雅停机通常通过注册JDK的ShutdownHook(钩子)来实现,当系统接收到退出指令后,首先标记系统处于退出状态,不再接收新的消息,然后将积压的消息处理完,最后调用资源回收接口将资源销毁,最后各线程退出执行。简单的使用demo案例如下(简单版):

/*** 优雅停机处理方式* * @author lry**/
public class Main{/*** 启动应用**/public void start(){// 第一步:启动应用服务……// 第二步:注册JDK钩子Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {@Overridepublic void run() {System.out.println("The hook running...");//第三步:调用停机处理stop();}}));}/*** 停止应用**/public void stop(){// 停止应用前停机处理(如:注销服务、标记不接受请求等)}}

超时控制
        通常优雅退出需要有超时控制机制,如果到达超时时间仍然没有完成退出前的资源回收等操作,则由停机脚本直接调用KILL -9 PID的方式进行强制退出,不然可能会等待很长时间。

4 微服务优雅停机

微服务的优雅停机没有统一的解决方案,只要抓住核心思想进行设计即可:
        引流 → 挡板 → 等待停机

但在微服务架构中,我们可以遵守以下建议规则来设计微服务的优雅停机机制:

  • 所有微服务应用都应该支持优雅停机

  • 优先注销注册中心注册的服务实例

  • 待停机的服务应用的接入点标记拒绝服务

  • 上游服务支持故障转移因优雅停机而拒绝的服务

  • 根据具体业务也提供适当的停机接口

微服务应用的优雅停机根据其使用者角色的不同,而主要分为两种类型:

  • 微服务业务应用优雅停机设计:

    微服务业务应用优雅停机设计

  • 微服务网关应用优雅停机设计:

    微服务网关应用优雅停机设计

其余各层设备的优雅停机都可从以上两种类型进行衍生出解决方案,如:

  • 整个后端架构升级,则可从DNS或Nginx直接切换

  • Nginx层升级,则可以从DNS直接切换

5 使用案例

在业界开源的产品中,很多产品都使用了JDK钩子的方式来实现优雅停机,如以下产品:

  • Netty

  • DUBBO

中台化实践——优雅停机方案相关推荐

  1. 微服务架构—优雅停机方案

    1 介绍 微服务架构中的应用优雅停机主要是指应用实例有计划而平滑(即不产生需要处理的事故)的退出.应用服务器的停机主要分为两类:主动停机和被动停机,而其中主动停机和大部分的被动停机都是可以实现优雅停机 ...

  2. 品牌广告投放平台的中台化应用与实践

    导读:随着业务和团队规模的增长,原来单体应用的技术架构无论从研发效率还是系统性能来看,都出现了瓶颈.微服务化的技术架构改造(遵循领域模型将现有单体应用按照业务边界拆分为多个微服务)提上议程.本文主要分 ...

  3. 一文聊透 Dubbo 优雅停机

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 作者 | kiritomoe 来源 | 公众号「Kirito的技术分享」 1 前言 一年之前 ...

  4. 处于停机等非正常状态_一文聊透 Dubbo 优雅停机

    1 前言 一年之前,我曾经写过一篇<研究优雅停机时的一点思考>,主要介绍了 kill -9,kill -15 两个 Linux 指令的含义,并且针对性的聊到了 Spring Boot 应用 ...

  5. Spring Boot(Cloud) 优雅停机

    为了解决在微服务重启的过程中,可能出现一部分 http 请求处理失败的问题,提供一下方案 拟用方案: 第一步:重启前先从主动将服务剔除,并等待一段时间 第二步:停止服务并重启 一.主动将服务剔除 该方 ...

  6. 干货 | 携程中台化背景下的元数据驱动架构实践

    作者简介 灿荣,携程软件技术专家,目前关注互联网中台以及中间件领域. 一.背景介绍 为解决系统重复建设.能力复用性低的问题,携程启动了中台化建设步伐.旅游行业的中台建设,携程并非从零开始,前期已经积累 ...

  7. 低代码、中台化:爱奇艺号微服务工作流实践

    背景 微服务从诞生到现在,经历了很长时间.期间不同公司,不同的团队有各自独特的见解,但慢慢对于微服务的各个方面的理解,如服务发现一致性.容错.事务.熔断.降级.配置等等趋于一致.随着微服务在团队中应用 ...

  8. 潮水褪去看中台落地实践-学习资料下载(1):《业务中台建设方法之“中台需求结构化”(普元-喻吉林)》

    " 潮水褪去看中台落地实践是一个系列,讲的是2021年中台的瓜怎么种.怎么吃的实践经验及心得." 分享一些2020中台战略暨互联网架构大会的公开版PPT,供中台系列阅读者参考. & ...

  9. 命令测试post_【第2088期】前端中台化,把格局做大——NodeJS 和测试服务探索

    前言 今日早读文章由<React状态管理与同构实战>作者@LucasHC投稿分享. 正文从这开始~~ 近些年,「NodeJS 应该如何在公司业务中真实落地 」这类问题屡见不鲜.自从 200 ...

最新文章

  1. Oracle Logminer 做数据恢复 说明示例
  2. CircleDisplay
  3. 计算机视觉研究群体及专家主页汇总
  4. 微信浏览器不支持下载文件或应用解决方案
  5. python中sorted_Python中sorted()方法的用法
  6. 图像融合亮度一致_博文精选 | 基于深度学习的低光照图像增强方法总结
  7. 心脏为什么长在左边?原来是因为这个消失的器官
  8. android标题白色_Android设置布局背景为白色的三种方法
  9. [转]cookie、sesstion、localstorage、sesstionstorage的使用和区别
  10. 浏览器乱码问题的具体解决
  11. 函数-函数进阶-装饰器
  12. Java中FilterInputStream和FilterOutputStream的用法
  13. Springboot整合阿里云短信SDK发送短信验证码笔记
  14. 7-5 华氏度转摄氏度(四舍五入) (5分)
  15. 计量广义差分操作过程_计量学堂 | 计量经济学最基本的31个问题
  16. hive修复多级分区
  17. ffmpeg:制作gif / 提取视频帧为图片
  18. 【智慧照明】宾馆智能照明控制系统
  19. [原]Wap push over sms 实践
  20. 程序分析之中间表示(Intermediate Representation)

热门文章

  1. 邵奈一的技术博客导航
  2. Toolbar控件:32位真彩色大图标
  3. Linux shell脚本实现归档文件
  4. 支持YD/T 1363 铁塔通讯协议智能电表
  5. 以下web.xml片断( )正确地声明servlet 上下文参数。
  6. 计算机被改成游戏,我的电脑主页被修改
  7. 虚拟机通过桥接上网(dhcp)
  8. c语言指opt算法实现,Sunday算法c语言版实现
  9. npm install报错:EPERM: operation not permitted
  10. 团队-吃货之家-项目总结