Solon

问题 - 在 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);
        });
    }
}

启用安全停止的效果是(不开启,则没有等待时间):

  1. 执行插件预停止动作(一般会向注册服务注销自己)
  2. 等3秒(让发现服务同步状态)
  3. 将当前应用标为已停止,请求响应为 503 状态码(标识服务不可用)
  4. 等7秒(用于消化已有的请求)
  5. 执行插件停止动作
  6. 退出进程

等待时间,是为了让消费端发现服务的状态变化(这里需要一定时间同步;不同框架或中间件时间不同)。