背景我们的 SpringCloud 是部署在 k8s 上的, 当通过 k8s 进行滚动升级时, 会有请求 500 的情况, 不利于用户体验, 严重的可能造成数据错误的问题k8s 滚动更新策略介绍假设我们要升级的微服务在环境上为3个副本的集群, 升级应用时, 会先启动1个新版本的副本, 然后下线一个旧版本的副本, 之后再启动1个新版本的副本, 一次类推,直到所有旧副本都替换新副本.通过链路追踪分析, 报错的原因分别由以下两种情况SpringCloud 中的微服务在升级过程中, 当旧的微服务中还有没有处理完成的请求时, 就开始关闭动作, 造成请求中断当旧应用执行关闭动作时, 已经开始拒绝请求, 但是 nacos 中的路由并没有及时更新, 造成 gateway/openfeign 在路由时仍会命中正在关闭的应用, 造成请求报错为了解决这个问题, 我们将利用 springboot 的 graceful shutdown 功能和 nacos 的主动下线功能来解决这个问题. 具体思路如下:比如当我们执行订单微服务(3个副本)滚动更新时先启动一个新版本副本4然后准备关闭副本1, 在关闭之前先通知 nacos 订单服务的副本1下线, 然后由 nacos 通知给其他应用(nacos2.x 是grpc, 所以通知速度比较快), 这样, 订单服务的副本1就不会再接收到请求, 然后执行 graceful
...
继续阅读
(161)