SpringCloud 优雅下线+灰度发布
共 4903字,需浏览 10分钟
·
2022-07-13 02:22
阅读本文大概需要 3.5 分钟。
management:
endpoint:
shutdown:
enabled: true
endpoints:
web:
exposure:
include: shutdown
management:
endpoint:
# 启用pause端点
pause:
enabled: true
# 启用restart端点,之所以要启用restart端点,是因为pause端点的启用依赖restart端点的启用
restart:
enabled: true
endpoints:
web:
exposure:
include: pause,restart
management:
endpoints:
web:
exposure:
include: 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"
执行eurekaAutoServiceRegistration.start()方法时,当前服务向 Eureka 注册中心注册服务;
执行eurekaAutoServiceRegistration.stop()方法时,当前服务会向 Eureka 注册中心进行反注册,注册中心收到请求后,会将此服务从注册列表中删除。
public class GracefulOffline {
private EurekaAutoServiceRegistration eurekaAutoServiceRegistration;
public String online() {
this.eurekaAutoServiceRegistration.start();
return "execute online method, online success.";
}
public String offline() {
this.eurekaAutoServiceRegistration.stop();
return "execute offline method, offline success.";
}
}
部署集群 1 的应用(初始状态),将所有外部请求的流量都打到这个集群上
部署集群 2 的应用,集群 2 的代码与集群 1 不同,如新功能或者 Bug 修复等
将流量从集群 1 切换到集群 2
如集群 2 测试正常,就删除集群 1 正在使用的资源(例如实例),使用集群 2 对外提供服务
没有一个确定 OK 的环境。使用蓝绿部署,我们能够清晰地知道老版本是 OK 的,而使用滚动发布,我们无法确定。
修改了现有的环境。
如果需要回滚,很困难。举个例子,在某一次发布中,我们需要更新 100 个实例,每次更新 10 个实例,每次部署需要 5 分钟。当滚动发布到第 80 个实例时,发现了问题,需要回滚。这时,我们估计就要疯了。
有的时候,我们还可能对系统进行动态伸缩,如果部署期间,系统自动扩容/缩容了,我们还需判断到底哪个节点使用的是哪个代码。尽管有一些自动化的运维工具,但是依然令人心惊胆战。
准备好部署各个阶段的工件,包括:构建工件,测试脚本,配置文件和部署清单文件
从负载均衡列表中移除掉“金丝雀”服务器
升级“金丝雀”应用(切断原有流量并进行部署)
对应用进行自动化测试
将“金丝雀”服务器重新添加到负载均衡列表中(连通性和健康检查)
如果“金丝雀”在线使用测试成功,升级剩余的其他服务器(否则就回滚)
推荐阅读:
Spring Boot 使用 Disruptor 做内部高性能消息队列
互联网初中高级大厂面试题(9个G) 内容包含Java基础、JavaWeb、MySQL性能优化、JVM、锁、百万并发、消息队列、高性能缓存、反射、Spring全家桶原理、微服务、Zookeeper......等技术栈!
⬇戳阅读原文领取! 朕已阅