前言
目前k8s 对微服务发版是可能出现问题的,即便是滚动发布模式+健康检查 也会出现发布期间的请求错误。
原因是:k8s新的实例启动起来,旧的就会立即被杀掉,而nacos和其他服务没法很快感知到 该服务已经下线(心跳机制),期间就会出现流量还会转到旧的节点上(实际上已经被杀掉了 就会报错)
所以方案的原理也是:在k8s杀掉旧的实例之前,让实例主动在nacos下线,且给予一定的缓冲时间(其他服务的列表刷新),然后额外再调用一下优雅下线接口(友好地让原来的任务执行完毕)
服务侧:
yml配置:
server:
# tomcat开启优雅下线
shutdown: graceful
management:
metrics:
export:
prometheus:
enabled: true
tags:
application: ${spring.application.name}
endpoints:
web:
exposure:
include: "*"
endpoint:
# spring容器优雅下线 暴露 shutdown 接口
shutdown:
enabled: true
prometheus:
enabled: true
metrics:
enabled: true
spring:
lifecycle:
# 优雅下线超时时间
timeout-per-shutdown-phase: 5m