优雅停机
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;优雅停机结束;