• 自动秒收录
  • 软件:1973
  • 资讯:57811|
  • 收录网站:279872|

IT精英团

Spring云应用的优雅下线和灰度发布

Spring云应用的优雅下线和灰度发布

浏览次数:
评论次数:
编辑: 阳煦
信息来源: ITPUB
更新日期: 2022-05-09 18:32:45
摘要

前言在生产环境中,如何保证在服务升级的时候,不影响用户的体验,这个是一个非常重要的问题。如果在我们升级服务的时候,会造成一段时间内的服务不可用,这就是不够优雅的。那什么是优雅的呢?主要就是指在服务升级

  • 正文开始
  • 相关阅读
  • 推荐作品

前言

在生产环境中,如何保证服务升级不会影响用户体验是一个非常重要的问题。如果我们升级服务,会让服务在一段时间内不可用,不够优雅。什么是优雅?主要是指服务升级的时候,整个服务不中断,让用户没有感知,然后用户体验不会受到影响。这是优雅的。

其实,优雅的下线是目的,不是手段。这是一个相对的概念。比如kill PID和kill -9 PID都是暴力查杀服务。与kill -9 PID相比,kill PID是优雅的。但如果单拿kill PID来说,能说是优雅的线下策略吗?我肯定不是。这就是原因。

所以本文所描述的优雅下线只能称之为“相对优雅的下线”,但相对于暴力的查杀服务来说,已经足够优雅了。常见的优雅解决方案主要有优雅离线和灰度释放。其实灰度发布的范围已经包括优雅下线了。

最后,本文主要讲基于Spring Cloud和Euraka的优雅离线和灰度发布。

优雅下线

常见的下线方式

方式一:kill PID

用法:kill java进程ID

这种方法依靠Spring Boot应用的关机钩子,应用本身的下线是优雅的。但是,如果您的服务发现组件正在使用Eureka,默认情况下会有90秒的延迟,其他应用程序会感知到服务的下线,这意味着其他服务可能仍然会在实例下线后的90秒内调用下线实例。所以这个方法不够优雅。

41211">方式二:/shutdown端点

Spring Boot 提供了/shutdown端点,可以借助它实现优雅停机。

使用方式:在想下线应用的application.yml中添加如下配置,从而启用并暴露/shutdown端点:

management:
  endpoint:
    shutdown:
      enabled: true
  endpoints:
    web:
      exposure:
        include: shutdown

发送 POST 请求到/shutdown端点

curl -X http://你想停止的服务地址/actuator/shutdown

该方式本质和方式一是一样的,也是借助 Spring Boot 应用的 Shutdown hook 去实现的。

方式三:/pause端点

Spring Boot 应用提供了/pause端点,利用该端点可实现优雅下线。

使用方式:在想下线应用的application.yml中添加配置,从而启用并暴露/pause端点:

management:
  endpoint:
    # 启用pause端点
    pause:
      enabled: true
    # 启用restart端点,之所以要启用restart端点,是因为pause端点的启用依赖restart端点的启用
    restart:
      enabled: true
  endpoints:
    web:
      exposure:
        include: pause,restart

发送 POST 请求到/actuator/pause端点:

curl -X POST http://你想停止的服务实例地址/actuator/pause

执行后的效果类似下图:

如图所示,该应用在 Eureka Server 上的状已被标记为DOWN,但是应用本身其实依然是可以正常对外服务的。在 Spring Cloud 中,Ribbon 做负载均衡时,只会负载到标记为UP的实例上。

利用这两点,你可以:先用/pause端点,将要下线的应用标记为DOWN,但不去真正停止应用;然后过一定的时间(例如 90 秒,或者自己做个监控,看当前实例的流量变成 0 后)再去停止应用,例如kill应用。

缺点 & 局限

方式四:/service-registry端点

使用方式:在想下线应用的application.yml中添加配置,从而暴露/service-registry端点:

management:
  endpoints:
    web:
      exposure:
        include: service-registry

发送 POST 请求到/actuator/service-registry端点:

curl -X "POST" "http://localhost:8000/actuator/service-registry?status=DOWN" \
   -H "Content-Type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8"

实行后的效果类似如下图:

图片

优雅的下线方式

在上文中,我们讲述了四种常见的下线方式,对比来看,方式四是一种比较优雅的下线方式。


在实际项目中,我们可以先使用/service-registry端点,将服务标记为DOWN,然后监控服务的流量,当流量为 0 时,即可升级该服务。当然,这里假设我们部署了多个服务实例,当一个服务实例DOWN掉之后,其他服务实例仍然是可以提供服务的,如果就部署一台服务的话,那么讨论优不优雅就没那么重要了。

除了上述的下线方式之外,还有一种利用EurekaAutoServiceRegistration对象达到优雅下线的目标。

  • 执行eurekaAutoServiceRegistration.start()方法时,当前服务向 Eureka 注册中心注册服务;
  • 执行eurekaAutoServiceRegistration.stop()方法时,当前服务会向 Eureka 注册中心进行反注册,注册中心收到请求后,会将此服务从注册列表中删除。

示例代码如下:

@RestController
@RequestMapping(value = "/graceful/registry-service")
public class GracefulOffline {

    @Autowired
    private EurekaAutoServiceRegistration eurekaAutoServiceRegistration;

    @RequestMapping("/online")
    public String online() {
        this.eurekaAutoServiceRegistration.start();
        return "execute online method, online success.";
    }

    @RequestMapping("/offline")
    public String offline() {
        this.eurekaAutoServiceRegistration.stop();
        return "execute offline method, offline success.";
    }
}

到这里,我们已经介绍了两种相对优雅的下线方式了。具体如何操作,我们可以根据实际上情况进行包装,或者利用自动化的脚本来实现更加优雅的下线方式。

灰度发布

蓝绿部署

蓝绿部署,英文名为 Blue Green Deployment,是一种可以保证系统在不间断提供服务的情况下上线的部署方式。

如何保证系统不间断提供服务呢?那就是同时部署两个集群,但仅对外提供一个集群的服务,当需要升级时,切换集群进行升级。蓝绿部署无需停机,并且风险较小。其大致步骤为:

  • 部署集群 1 的应用(初始状态),将所有外部请求的流量都打到这个集群上
  • 部署集群 2 的应用,集群 2 的代码与集群 1 不同,如新功能或者 Bug 修复等
  • 将流量从集群 1 切换到集群 2
  • 如集群 2 测试正常,就删除集群 1 正在使用的资源(例如实例),使用集群 2 对外提供服务

因为在使用蓝绿部署的方式时,我们需要控制流量,所以我们需要借助路由服务,如 Nginx 等。

滚动部署

滚动部署,英文名为 Rolling Update,同样是一种可以保证系统在不间断提供服务的情况下上线的部署方式。和蓝绿部署不同的是,滚动部署对外提供服务的版本并不是非此即彼,而是在更细的粒度下平滑完成版本的升级。

如何做到细粒度平滑升级版本呢?滚动部署只需要一个集群,集群下的不同节点可以独立进行版本升级。比如在一个 12 节点的集群中,我们每次升级 4 个节点,并将升级后的节点重新投入使用,周而复始,直到集群中所有的节点都更新为新版本。

这种部署方式相对于蓝绿部署,更加节约资源,因为它不需要运行两个集群。但这种方式也有很多缺点,例如:

  • 没有一个确定 OK 的环境。使用蓝绿部署,我们能够清晰地知道老版本是 OK 的,而使用滚动发布,我们无法确定。
  • 修改了现有的环境。
  • 如果需要回滚,很困难。举个例子,在某一次发布中,我们需要更新 100 个实例,每次更新 10 个实例,每次部署需要 5 分钟。当滚动发布到第 80 个实例时,发现了问题,需要回滚。这时,我们估计就要疯了。
  • 有的时候,我们还可能对系统进行动态伸缩,如果部署期间,系统自动扩容/缩容了,我们还需判断到底哪个节点使用的是哪个代码。尽管有一些自动化的运维工具,但是依然令人心惊胆战。

并不是说滚动发布不好,滚动发布也有它非常合适的场景。

金丝雀部署

金丝雀部署又称灰度部署(或者,灰度发布),英文名为 Canary Deployment,是指在黑与白之间,能够平滑过渡的一种发布方式


金丝雀的名称来源于「矿井中的金丝雀」,早在 17 世纪,英国矿井工人发现,金丝雀对瓦斯这种气体十分敏感,空气中哪怕有极其微量的瓦斯,金丝雀也会停止歌唱;而当瓦斯含量超过一定限度时,虽然鲁钝的人类毫无察觉,金丝雀却早已毒发身亡。当时在采矿设备相对简陋的条件下,工人们每次下井都会带上一只金丝雀作为“瓦斯检测指标”,以便在危险状况下紧急撤离。


我们来看一下金丝雀部署的步骤:

  • 准备好部署各个阶段的工件,包括:构建工件,测试脚本,配置文件和部署清单文件
  • 从负载均衡列表中移除掉“金丝雀”服务器
  • 升级“金丝雀”应用(切断原有流量并进行部署)
  • 对应用进行自动化测试
  • 将“金丝雀”服务器重新添加到负载均衡列表中(连通性和健康检查)
  • 如果“金丝雀”在线使用测试成功,升级剩余的其他服务器(否则就回滚)


在金丝雀部署中,常常按照用户量设置路由权重,例如 90% 的用户维持使用老版本,10% 的用户尝鲜新版本。不同版本应用共存,经常与 A/B 测试一起使用,用于测试选择多种方案。


金丝雀部署比较典型的例子,就是我们在使用某个应用的时候,该应用邀请我们进行“内测”或者“新版本体验”,如果我们同意了,那么我们就成了金丝雀。

原文

运维常用的34个Linux Shell脚本 对你一定有帮助!
« 上一篇 2022-05-09
做SQL性能优化真的是干瞪眼
下一篇 » 2022-05-11
  • 如何在Ubuntu中保留文件系统并备份当前开发板镜像
    0阅读 0条评论 个赞
    在Ubuntu保留文件系统或者说备份当前开发板镜像的需求在不断增加。比如Ubuntu文件系统需要安装库文件的话直接使用apt-get工具就可以下载,但由于需要下载的核心板较多,比较费时间,这时需要将安……
  • 国产核心板全志T507助力消防系统升级
    0阅读 0条评论 个赞
    9月16日下午,位于湖南长沙市区内的中国电信大楼发生火灾,建筑高度218米,现场浓烟滚滚,数十层楼体燃烧剧烈。消防救援人员赶到现场后很快将火势控制住,目前大楼火势已被扑灭,所幸未发现人员伤亡。湖南电信……
  • 教大家如何处理Spring Boot易流中的用户和群体!
    0阅读 0条评论 个赞
    1.准备工作2.用户操作2.1添加用户2.2修改用户2.3删除用户2.4查询用户3.组操作3.1添加组3.2修改组3.3删除组3.4查询组4.查看表详情虽然说我们在实际开发中,……
  • 从PG15开始WAL压缩优化
    0阅读 0条评论 个赞
    PG15传闻中的超级令人激动的功能大多数跳票了,年初我也写过一个关于PG15新功能跳票的文章。PG15BETA已经发出几个月了,似乎PG15里令人激动人心的功能不多,不过从长长的新功能列表里,……
  • 深入了解美团叶子发射器开源方案
    0阅读 0条评论 个赞
    大家好,我是树哥。之前我们有聊过「如何设计一个分布式ID发号器」,其中有讲过4种解决方案,分别是:UUID类雪花算法数据库自增主键Redis原子自增美团以第2、3种解决方案为基础,开发出……
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
  • 渗透攻击和防御网络-简单的SQL注入
    0阅读 0条评论 个赞
    1背景京东SRC(SecurityResponseCenter)收录大量外部白帽子提交的sql注入漏洞,漏洞发生的原因多为sql语句拼接和Mybatis使用不当导致。2手工检测2.1前置知识……
  • 码头工人日常工作的常用命令
    0阅读 0条评论 个赞
    容器生命周期管理Docker创建新容器并运行[run]语法:dockerrun[OPTIONS]IMAGE[COMMAND][ARG...]OPTIONS说明:-astdin:指定标准输入……
  • Python系列入门(四)别傻了 别糊涂了:链表、元组、字典、集合的区别
    0阅读 0条评论 个赞
    总结分析列表、元组、字典、集合的相同与区别之处,只有彻底分清之后,就会在应用的时候,得心应手。四句话总结列表是一个有序且可更改的集合,允许重复成员。元组是一个有序且不可更改的集合,允许重复成员。集合是……
  • Velox简介:一个开源的统一执行引擎
    0阅读 0条评论 个赞
    •Meta正在引入Velox,这是一个开源的统一执行引擎(unifiedexecutionengine),旨在加速数据管理系统和简化其开发。•Velox正在积极开发中,Meta在2022……
  • SQL Server联接方式
    0阅读 0条评论 个赞
    0.参考文献MicrosoftSQLServer企业级平台管理实践看懂SqlServer查询计划1.测试数据准备参考:SqlServer中的表访问方式TableScan,IndexScan……
  • 平均负载和CPU利用率有什么区别?
    2阅读 0条评论 个赞
    大家好,我是树哥。在性能优化中,我们经常会关注CPU平均负载这个指标。但如果让你来跟我解释一下什么是平均负载,你能说得清楚吗?它跟CPU使用率有什么区别?我想可能很多人都数不清楚,今天我们就来……
  • 关于这个能见度的例子 网上95%的文章都是错的!
    0阅读 0条评论 个赞
    你好,我是坤哥上周我在查阅资料时无意中搜到一篇解释volatile用法的博文,这篇博文排得很靠前,不过很遗憾,虽然结论是对的,但分析过程完全错误,而且我发现网上很多文章都用这个例子来解释vola……
  • 大促销活动如何抵御高流量DDoS攻击?
    0阅读 0条评论 个赞
    大促活动如何抵御大流量DDoS攻击?每一次活动大促带来的迅猛流量,对技术人而言都是一次严峻考验。如果在活动期间遭受黑产恶意DDoS攻击,无疑是雪上加霜。电商的特性是业务常态下通常不会遭受大流量DD……
  • 简单分析下的GOLDENDB
    0阅读 0条评论 个赞
    GOLDENDB是金融行业使用的比较广泛的一个数据库产品,以前也经常有朋友希望我写几篇分析GoldenDB数据库的文章。说实在的这类文章不好写,必须对某个产品有一定程度的了解,特别是真正上手用过之后,……
  • spring项目中启动包的原理 以及自定义启动包的使用
    0阅读 0条评论 个赞
    MAVEN项目中starter的原理一.原始方式我们最早配置spring应用的时候,必须要经历的步骤:1.pom文件中引入相关的jar包,包括spring,redis,jdbc等等2.通过prope……
  • c#异步高级————通道[1]
    0阅读 0条评论 个赞
    前言该系列为异步编程的进阶篇,其实也不能这么讲。世界上本没有进阶篇,只能说是高级篇(高级篇不能说多高级,是对底层的封装的意思),只要是加深理解都是进阶。本章先介绍一下channel。正文下面没什么好说……
  • 图系列中推荐算法的召回与粗排实践
    3阅读 0条评论 个赞
    一、转转推荐算法介绍1.1什么是推荐系统?1.2转转推荐主要场景及流程二、图算法原理介绍及转转实践2.1经典GraphEmbedding方法:DeepWalk2.2结构性与同质性:node2……
  • 如何在C#程序中注入恶意DLL?
    6阅读 0条评论 个赞
    一:背景前段时间在训练营上课的时候就有朋友提到一个问题,为什么Windbg附加到C#程序后,程序就处于中断状态了?它到底是如何实现的?其实简而言之就是线程的远程注入,这一篇就展开说一下。二:……
  • [设计模式] Java设计模式-桥模式
    0阅读 0条评论 个赞
    目录【设计模式】Java设计模式-桥接模式简介桥接模式实例代码示例①、品牌接口②、汽车品牌③、抽象汽车类④、汽车类型子类⑤、桥接模式测试1|1简介桥接(Bridge)是用于把抽象化与实现化解耦,使……
  • 数字人技术在直播场景中的应用
    0阅读 0条评论 个赞
    作者|薄志浩导读introduction本文介绍了在数字人AI技术发展迅猛,整体AI数字人市场呈现高速增长的趋势下,与强调高实时性互动的直播业务场景的结合与应用,通过数字人渲染技术、强大的AI全栈能……
  • 关于Redis在windows上运行的问题和fork函数
    0阅读 0条评论 个赞
    Redis在将数据库进行持久化操作时,需要fork一个进程,但是windows并不支持fork,导致在持久化操作期间,Redis必须阻塞所有的客户端直至持久化操作完成。微软的一些工程师花费时间在解决在……
  • 2022数字技能职业教育生态研讨会
    9阅读 0条评论 个赞
    职业教育是国民教育体系和人力资源开发的重要组成部分。发展职业教育,已经成为世界各国应对经济、社会、人口、环境、就业等方面挑战,实现可持续发展的重要战略选择。中国职业教育源远流长,师徒制教学有着悠久的……
  • 高手面试一个人 问4个问题就够了
    0阅读 0条评论 个赞
    作者|Mr.K编辑|Emma来源|技术领导力(ID:jishulingdaoli)金九银十求职季又要来了。据统计,今年的应届毕业生已破千万,加上社会面存量人才,相信今年的人才季的热度,不会低于今年……
  • 转:Java老了 科特林会取而代之吗?
    0阅读 0条评论 个赞
    .css-1yuhvjn{margin-top:16px;}.css-3jt6os.FileLinkCard{-webkit-align-items:center;-webkit-box-align……
  • [设计模式] Java设计模式-工厂模式
    3阅读 0条评论 个赞
    目录【设计模式】Java设计模式-工厂模式简介1、普通工厂(SimpleFactory)模式①、定义类②、定义简单的工厂类③、实例2、抽象工厂(AbstractFactory)模式①、定义类②、……
最近发布资讯
更多