问题:如何安全的停止服务?
所谓“安全的停止服务”(也叫:优雅停止,或者:优雅重启)是指:在一个集群内,一个服务实例停止时,即不影响已有请求,也不影响第三方调用。Solon 在内核层面已提供了停全停止的机制:
1、操作说明(通过配置启用)
或者用启动参数
java -jar demoapi.jar --stop.safe=1
或者用jvm参数
java -Dsolon.stop.safe=1 -jar demoapi.jar
或者用 container 的环境变量
services:
demoapi:
image: demo/demoapi:1.0.0
container_name: demoapi
environment:
- solon.stop.safe=1
- TZ=Asia/Shanghai
ports:
- 8080:8080
2、完整的配置
solon.stop.safe: 0 #安全停止(0或1)//(v2.1.0 后支持;之前只能用接口启用)
solon.stop.delay: 10 #安全停止的延时秒数(默认10秒)
3、内部原理说明
启用安全停止后的内部处理流程:(不开启,则没有等待时间):
- 执行插件预停止动作(一般会向注册服务注销自己)
- 等3秒(让发现服务同步状态)
- 将当前应用标为已停止,请求响应为 503 状态码(标识服务不可用)
- 等7秒(用于消化已有的请求)
- 执行插件停止动作
- 退出进程
等待时间,是为了让消费端发现服务的状态变化(这里需要一定时间同步;不同框架或中间件时间不同)。
4、补充
a) 有注册与发现服务的环镜
按以上操作即可。
b) 没有注册与发现服务的环镜
比如只使用了 nginx?需要增加503重试机制:
upstream demoapi {
server 127.0.0.1:9030 weight=10;
server 127.0.0.1:9031 weight=10;
}
server {
listen 8081;
location / {
proxy_pass http://demoapi;
proxy_next_upstream error timeout http_503;
}
}
其它环境可以参考 nginx 的配置思路。