升级零中断
要实现升级零中断,通常需要解决如下问题:
- 停止服务的时候,可能引起业务中断。在停止服务的过程中,可能服务正在处理请求,新的请求可能持续地发送到该服务。
- 在微服务架构下,一般都会通过注册中心进行服务发现,客户端会缓存实例地址。停止服务的时候,使用者可能无法及时感知实例下线,并继续使用错误的实例进行访问,导致失败。
- 实现升级零中断,需要进行滚动升级,在新版本功能就绪后,才能够停止老版本。
实现升级零中断需要很多的措施进行配合,比如滚动升级,实现零中断,建议保证最少有2个可用的实例。在本章节里面,主要描述从微服务的角度进行设置,更好的配合升级零中断。Java Chassis实现零中断的核心机制包括如下几个:
- 优雅停机。服务停止的时候,需要等待请求完成,并拒绝新请求。
Java Chassis优雅停机默认提供,在进程退出前,会进行一定的清理动作,包括等待正在处理的请求完成、拒绝未进入处理队列的新请求、调用注册中心接口进行注销等动作。Java Chassis进程退出前,先将实例状态修改为DOWN,然后等待一段时间再进行后续的退出过程:
servicecomb: boot: turnDown: # 实例状态修改为DOWN以后等待时间,默认值为0,即不等待。 waitInSeconds: 30
- 重试:客户端对于网络连接错误,以及被拒绝等请求,需要选择新服务器进行重试。
servicecomb: loadbalance: retryEnabled: true # 是否开启重试策略 retryOnNext: 1 # 重新寻找一个实例重试的次数(不同于失败实例,依赖于负载均衡策略) retryOnSame: 0 # 在失败的实例上重试的次数
- 隔离:对于失败超过一定次数的服务实例,进行隔离。
servicecomb: loadbalance: isolation: enabled: true enableRequestThreshold: 5 # 统计周期内实例至少处理的请求数,包括成功和失败。 singleTestTime: 60000 # 实例隔离后,经过这个时间,会尝试访问。如果访问成功,则取消隔离,否则继续隔离。 continuousFailureThreshold: 2 # 实例隔离的条件,连续两次失败。