服务优雅上线&下线方案
arch
summary_2020/12
docker
一、服务优雅上线
1、核心问题
- 保证服务暴露给调用方时,服务已经准备完毕,可以立即提供正常服务。
二、服务优雅下线
1、核心问题
- 应用自身完成的安全下线并正常退出
- 正在处理的请求完成处理
- 调用方感知服务提供方异常(如何快速感知服务正在下线;或者感知下线过程中可以提供正常服务)
2、解决方案
2.1、应用自身完成的安全下线并正常退出
- 使用合理的方式下线,使资源合理释放,正常关闭应用。
2.2、正在处理的请求完成处理
- 可以采用延迟下线的方案,使已经接受到的请求处理完成后再下线。
2.3、调用方感知服务提供方异常
- 调用方及时感知
- 比如在SpringCloud体系中,我们下线需要立即告知注册中心服务即将下线(方式如下),但其它客户端获取新的实例列表不是实时的, SpringCloud提供了两种方式,客户端每30s到注册中心轮询;或者当发生变动时,注册中心进行广播。(但网络并不可靠,即使使用广播的方式,也可能存在通知失败的情况,所以两种方式结合是比较推荐的方式)
curl --location --request POST 'http://localhost:8080/service-registry/instance-status' --header 'Content-Type: application/json' -d 'DOWN'
- 感知过程中如何保证服务正常运行
- 由上面的内容我们可以知道,调用方并不能立即感知服务已经下线,也就是说可以会调用一个正在销毁的实例,针对这种情况,我们可以在调用方感知的间隔继续提供服务,等调用方感知到服务下线后再进行下线,也就是延迟下线。
- 当然还有一种方案是进行重试,调用方负载均衡到一个不可用的节点时,进行重试,选择一个正常的节点进行处理请求,当然这种方案会浪费一定的请求时间。(推荐两种方式结合的方式)
3、案例
3.1、经由反向代理的服务优雅下线
3.2、在微服务集群中下线单个服务
- 结合上文,只要满足上面三个优雅下线的原则,即可实现优雅下线。
4、参考文献