优雅停机

ServiceComb是通过JDK的ShutdownHook来完成优雅停机的。

使用场景

优雅停机可以解决以下场景:

  • KILL PID
  • 应用意外自动退出(System.exit(n))
    优雅停机解决不了以下场景:

  • KILL -9 PID 或 taskkill /f /pid

效果

触发优雅停机时:

  • 服务提供者:
    • 标记当前服务状态为STOPPING,不接受新的客户端请求,新的客户端访问请求会在客户端直接报错,客户端配合重试机制可重试其他实例;
    • 等待当前已运行线程执行完毕,如果设置了provider端超时,超时则强制关闭;
  • 服务消费者:
    • 标记当前服务状态为STOPPING,直接拒绝新的调用请求;
    • 等待当前已发送请求的响应,如果超过客户端接收响应的超时时间(默认30秒),则强制关闭;

原理

触发优雅停机时,会依次执行以下步骤:

  • 给所有listener下发BEFORE_CLOSE事件,通知listener处理对应事件;
  • 将当前服务状态标记为STOPPING;
  • 从服务中心注销当前微服务实例,并关闭registry对应vertx;
  • 等待所有当前已存在invocation调用完成;
  • 关闭config-center和transport对应vertx;
  • 给所有listener下发AFTER_CLOSE事件,通知listener处理对应事件;
  • 将当前服务状态标记为DOWN;优雅停机结束;