问题 - 在 ip 漂移时更安全的服务注册与注销?
比如 k8s 或 docker bridge 运行环境下,每次重新部署后 ip 都可能会变化。在这种环境下,使用外部的注册与发现服务时,需要用到以下两点。
1、增加参数,申明当前为漂移环境
或者用启动参数
java -jar demoapi.jar --drift=1
或者用jvm参数
java -Dsolon.drift=1 -jar demoapi.jar
或者用 container 的环境变量
services:
demoapi:
image: demo/demoapi:1.0.0
container_name: demoapi
environment:
- solon.drift=1
- TZ=Asia/Shanghai
ports:
- 8080:8080
这个申明的作用,是告诉注册与发现服务:服务ip挂了,不用告警,并自动摘除。否则,可能会不断增加失效ip。
2、启用安全停止
- 通过配置启用(新做法,v1.12.2 后支持)
或者用启动参数
java -jar demoapi.jar --drift=1 --app.safeStop=1
或者用jvm参数
java -Dsolon.drift=1 -Dsolon.app.safeStop=1 -jar demoapi.jar
或者用 container 的环境变量
services:
demoapi:
image: demo/demoapi:1.0.0
container_name: demoapi
environment:
- solon.drift=1
- solon.app.safeStop=1
- TZ=Asia/Shanghai
ports:
- 8080:8080
- 在代码里通过接口启用(之前的旧做法,比较死板)
public class DemoApp {
public static void mian(String[] args){
Solon.start(DemoApp.class, args, app->{
app.enableSafeStop(true);
});
}
}
启用安全停止的效果是(不开启,则没有等待时间):
- 执行插件预停止动作(一般会向注册服务注销自己)
- 等3秒(让发现服务同步状态)
- 将当前应用标为已停止,请求响应为 503 状态码(标识服务不可用)
- 等7秒(用于消化已有的请求)
- 执行插件停止动作
- 退出进程
等待时间,是为了让消费端发现服务的状态变化(这里需要一定时间同步;不同框架或中间件时间不同)。