0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于Spring Cloud和Euraka的优雅下线以及灰度发布

Android编程精选 来源:CSDN 作者:CSDN 2022-04-20 09:52 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言

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

实际上,优雅下线是目标,而不是手段,它是一个相对的概念,例如kill PIDkill -9 PID都是暴力杀死服务,相对于kill -9 PID来说,kill PID就是优雅的。但如果单独拿kill PID出来说,我们能说它是优雅的下线策略吗?肯定不是啊,就是这个道理。

因此,本文讲述的优雅下线仅能称之为“相对的优雅下线”,但相对于暴力的杀死服务,已经足够优雅了。常见的优雅解决方案,主要包括优雅下线和灰度发布。而实际上,灰度发布的范围就已经包含优雅下线了。

最后,在本文中,我们主要讲述基于 Spring Cloud 和 Euraka 的优雅下线以及灰度发布。

优雅下线

常见的下线方式

方式一:kill PID

使用方式:kill java进程ID

该方式借助的是 Spring Boot 应用的 Shutdown hook,应用本身的下线也是优雅的,但如果你的服务发现组件使用的是 Eureka,那么默认最长会有 90 秒的延迟,其他应用才会感知到该服务下线,这意味着:该实例下线后的 90 秒内,其他服务仍然可能调用到这个已下线的实例。因此,该方式是不够优雅的。

方式二:/shutdown端点

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

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

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

发送 POST 请求到/shutdown端点

curl-Xhttp://你想停止的服务地址/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-XPOSThttp://你想停止的服务实例地址/actuator/pause

执行后的效果类似下图:

41fb98f6-bfd5-11ec-bce3-dac502259ad0.png图片

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

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

缺点 & 局限

42109dc8-bfd5-11ec-bce3-dac502259ad0.png图片
方式四:/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"

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

41fb98f6-bfd5-11ec-bce3-dac502259ad0.png图片

优雅的下线方式

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

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

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

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

示例代码如下:

@RestController
@RequestMapping(value="/graceful/registry-service")
publicclassGracefulOffline{

@Autowired
privateEurekaAutoServiceRegistrationeurekaAutoServiceRegistration;

@RequestMapping("/online")
publicStringonline(){
this.eurekaAutoServiceRegistration.start();
return"executeonlinemethod,onlinesuccess.";
}

@RequestMapping("/offline")
publicStringoffline(){
this.eurekaAutoServiceRegistration.stop();
return"executeofflinemethod,offlinesuccess.";
}
}

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

灰度发布

蓝绿部署

蓝绿部署,英文名为 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 测试一起使用,用于测试选择多种方案。

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

-End-

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 自动化
    +关注

    关注

    31

    文章

    6007

    浏览量

    90791
  • springcloud
    +关注

    关注

    0

    文章

    17

    浏览量

    1675

原文标题:SpringCloud 优雅下线+灰度发布

文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    NVIDIA与Google Cloud携手推进代理式与物理AI发展

    企业可以使用 NVIDIA Vera Rubin 驱动的 A5X 实例 (可扩展至近 100 万个 Rubin GPU)、Google Distributed Cloud 上的 Gemini、机密
    的头像 发表于 04-27 15:35 573次阅读

    比亚迪第1600万辆新能源汽车下线

    2026年4月17日,比亚迪第1600万辆新能源汽车在长沙工厂迎来下线,科技豪华旗舰MPV——第二代腾势D9成为第1600万辆下线车型,这也是全球首台第二代腾势D9下线
    的头像 发表于 04-17 16:46 1546次阅读

    大华云面向OpenClaw生态发布Dahua Cloud Open Skills

    近日,大华云开发者平台面向OpenClaw生态正式发布Dahua Cloud Open Skills(大华云开放技能),——一套专为OpenClaw生态打造的一站式智慧物联技能,以“开箱即用、零代码
    的头像 发表于 03-26 15:20 640次阅读

    比亚迪第1500万辆新能源汽车下线

    2025年12月18日,比亚迪第1500万辆新能源汽车下线仪式在济南工厂顺利举行,“大六座安全豪华SUV”腾势N8L成为第1500万辆下线车型,这也是腾势N8L的第15000辆下线。比亚迪达成这一
    的头像 发表于 12-19 09:50 618次阅读

    由Memfault赋能的Nordic-nRF Cloud云服务将硬核加持物联网通信应用

    全球低功耗无线通信半导体解决方案领导者 Nordic Semiconductor (以下简称 “Nordic”) 宣布,通过Memfault技术驱动的nRF Cloud平台在 2025 年移动突破奖
    发表于 11-27 22:30

    小鹏汽车迎来第100万台整车正式下线

    11月21日,小鹏汽车迎来第100万台整车正式下线。小鹏汽车在广州工厂举行了第100万台下线暨首批X9超级增程车主交付,数百家海内外媒体和X9超级增程首批车主共同见证了这一里程碑时刻。
    的头像 发表于 11-25 10:00 669次阅读

    Anthill Cloud:以AI、模块化内容与全渠道互动重塑医药营销

      丹麦哥本哈根2025年11月3日 /美通社/ -- 生命科学行业领先的卓越内容与技术合作伙伴Anthill宣布推出Anthill Cloud™,这一创新平台将AI、模块化内容与个性化互动融合
    的头像 发表于 11-03 20:14 841次阅读
    Anthill <b class='flag-5'>Cloud</b>:以AI、模块化内容与全渠道互动重塑医药营销

    使用Otsu阈值算法将灰度图像二值化

    Otsu 算法是由日本学者OTSU于1979年提出的一种对图像进行二值化的高效算法,又称“最大类间方差法”。当我们对一个图象进行二值化操作的时候,需要根据一项灰度阈值来判决每个像素点应该被视作纯黑
    发表于 10-28 06:49

    联想moto第3亿台设备成功下线

    很少有人知道,在联想moto卖疯了背后,是联想集团武汉产业基地灯火通明、日夜制造,如今它迎来第3亿台设备下线的里程碑时刻!
    的头像 发表于 09-18 09:10 1047次阅读

    Spring拦截器:你的请求休想逃过我的五指山!

    Spring框架中,拦截器(Interceptor)是一种强大的机制,它允许开发者在请求处理的不同阶段插入自定义逻辑。WebApplicationContext作为Spring Web应用的上下文容器,为拦截器的配置和管理提供了基础支持。
    的头像 发表于 07-26 11:25 849次阅读
    <b class='flag-5'>Spring</b>拦截器:你的请求休想逃过我的五指山!

    比亚迪第1300万辆新能源汽车下线

    2025年7月21日,比亚迪在深汕工厂举行第1300万辆新能源汽车下线仪式,超级四电旗舰轿车仰望U7作为下线车型亮相
    的头像 发表于 07-22 18:13 1334次阅读

    如何使用nRF Cloud

    Nordic Semiconductor云服务和nRF Cloud构成了一个专为Nordic Semiconductor无线设备优化的物联网平台。该平台为使用Nordic Semiconductor
    的头像 发表于 07-04 11:12 1161次阅读
    如何使用nRF <b class='flag-5'>Cloud</b>

    东风岚图FREE+焕新下线

    近日,岚图FREE+下线仪式在东风岚图总装工厂正式举行,得益于高效稳定的供应链体系,高度自动化的智能生产线,成熟的研发能力,岚图FREE+正以超预期的速度与用户见面,近日,这款“极智驾享大五座SUV”将正式开启预售。
    的头像 发表于 06-26 13:52 879次阅读

    NVIDIA推出AI平台DGX Cloud Lepton

    CoreWeave、Crusoe、Firmus、Foxconn、GMI Cloud、Lambda、Nebius、Nscale、SoftBank Corp. 和 Yotta Data Services 为 DGX Cloud Lepton Marketplace 提供数以万
    的头像 发表于 05-22 09:42 1261次阅读

    理想MEGA Home家庭特别版正式下线

    近日,理想MEGA家族新成员——理想MEGA Home家庭特别版,在理想汽车北京绿色智能制造基地正式下线,并将于5月23日陆续开启全国交付。
    的头像 发表于 05-22 09:17 972次阅读