1,直接kill
该方式借助的是Spring Boot应用的Shutdown hook,应用本身的下线也是优雅的,但如果你的服务发现组件使用的是Eureka,那么默认最长会有90秒的延迟,其他应用才会感知到该服务下线,这意味着:该实例下线后的90秒内,其他服务仍然可能调用到这个已下线的实例。因此,该方式是不够优雅的
2, 主动关闭Eureka客户端
这种方式相对于直接关闭服务来说,优雅了许多,可以通过监控查看是否下线后还有流量进来,等到完全没有流量进来后再进行发布。因为Eureka注册中心在收到某个客户端下线后不会马上通知所有的注册的客户端,而是等到客户端进行心跳的时候再将下线的数据返回。通过这种方式下线的话,可以在某个服务下线后防止其他服务调用此服务失败。在项目中可以使用如下方式关闭客户端:
@Autowired
private EurekaClient client;
@RequestMapping(value = { "/eurekaUnRegister" }, method = RequestMethod.GET)
public String shutDown() {
eurekaClient.shutdown();
return "eurekaUnRegistering";
}
直接调用/eurekaUnRegister即可让当前服务下线,做好权限控制。
特点:需要改代码。 下线后服务进程还在,可以等没有流量再发布。注册中心服务下线。
3. /shutdown
端点
Spring Boot提供了/shutdown
端点,可以借助它实现优雅停机。
在想下线应用的 properties中添加如下配置,从而启用并暴露/shutdown
端点
#启用shutdown
endpoints.shutdown.enabled=true
#禁用密码验证
endpoints.shutdown.sensitive=false
然后发送POST请求到/shutdown
端点
curl -X http://你想停止的服务地址/shutdown
特点:发现这个进程停止了。
4./pause 端点
Spring Boot应用提供了/pause
端点,利用该端点可实现优雅下线。
使用方式:
在想下线应用的 properties中添加如下配置,从而启用并暴露/pause
端点
#启用pause,restart,之所以要启用restart端点,是因为pause端点的启用依赖restart端点的启用
endpoints.pause.enabled=true
endpoints.restart.enabled=true
#禁用密码验证
endpoints.pause.sensitive=false
#暴露端点
endpoints.web.exposure.include=pause
特点:pause后服务进程在;注册中心显示DOWN; 如果你的服务发现组件用的是Eureka,并且你的应用开启了健康检查(eureka.client.healthcheck.enabled = true
,那么/pause
端点无效!!!