原文:http://www.itmuch.com/spring-cloud-sum/how-to-unregister-service-in-eureka/ ,转载请说明出处。html
在生产环境中,服务的上下线是不可避免的,咱们但愿可以优雅地下线微服务。本文基于Spring Boot 2.x + Spring Cloud Finchley讲解实际项目中优雅下线服务的四种方式,并探讨各方式的优缺点。java
注:Spring Boot 1.x + Spring Cloud Edgware及以前的方式相同,但配置有区别,本文不作讨论。web
使用方式:spring
kill java进程ID
该方式借助的是Spring Boot应用的Shutdown hook,应用自己的下线也是优雅的,但若是你的服务发现组件使用的是Eureka,那么默认最长会有90秒的延迟,其余应用才会感知到该服务下线,这意味着:该实例下线后的90秒内,其余服务仍然可能调用到这个已下线的实例。所以,该方式是不够优雅的 。shell
/shutdown
端点【不建议】Spring Boot提供了/shutdown
端点,能够借助它实现优雅停机。使用方式:json
在想下线应用的applicationyml
中添加以下配置,从而启用并暴露/shutdown
端点:app
management: endpoint: shutdown: enabled: true endpoints: web: exposure: include: shutdown
发送POST请求到/shutdown
端点负载均衡
curl -X http://你想中止的服务地址/actuator/shutdown
该方式本质和方式一是同样的,也是借助Spring Boot应用的Shutdown hook去实现的。运维
/pause
端点【生产可用,但有一点缺陷】Spring Boot应用提供了/pause
端点,利用该端点可实现优雅下线。curl
使用方式:
在想下线应用的application.yml
中添加配置,从而启用并暴露/pause
端点:
management: endpoint: # 启用pause端点 pause: enabled: true # 启用restart端点,之因此要启用restart端点,是由于pause端点的启用依赖restart端点的启用。详见:https://cloud.spring.io/spring-cloud-static/Finchley.SR2/single/spring-cloud.html#_endpoints restart: enabled: true endpoints: web: exposure: include: pause,restart
发送POST请求到/actuator/pause
端点:
curl -X POST http://你想中止的服务实例地址/actuator/pause
执行后的效果相似下图:
如图所示,该应用在Eureka Server上的状已被标记为DOWN
,可是应用自己其实依然是能够正常对外服务的。在Spring Cloud中,Ribbon作负载均衡时,只会负载到标记为UP
的实例上。利用这两点,你能够:先用pause端点,将要下线的应用标记为DOWN,但不去真正中止应用;而后过必定的时间(例如90秒,或者本身作个监控,看当前实例的流量变成0后)再去中止应用,例如kill 应用
,固然若是你足够变态,kill -9 也能够
。
缺点 | 描述 |
---|---|
不一样的版本配置不大同样 | 早期的Spring Cloud版本中,,pause端点是不依赖restart端点的,后来一个pull request致使pause端点必须依赖restart端点…我的给官方提issue,官方最后选择了继续依赖,我也是醉了…… |
没法和Eureka的健康检查配合使用 | 若是你的服务发现组件用的是Eureka,而且你的应用开启了健康检查(eureka.client.healthcheck.enabled = true ,那么/pause 端点无效!!! |
/service-registry
端点【生产可用】使用方式:
在想下线应用的application.yml
中添加配置,从而暴露/service-registry
端点:
management: endpoints: web: exposure: include: service-registry
发送POST请求到/actuator/service-registry
端点:
curl -X "POST" "http://localhost:8000/actuator/service-registry?status=DOWN" \ -H "Content-Type: application/vnd.spring-boot.actuator.v2+json;charset=UTF-8"
实行后的效果相似以下图:
由图可知,使用/service-registry
端点可实现相似/pause
端点的效果。
暂时没有发现缺点。
在实际项目中,你能够作一个运维工具:
/pause
端点或者service-registry
端点(看你能不能容忍/pause
端点的缺点),这样就能够把该实例在Eureka上标记为DOWN,流量过一段时间后就不会打到这个实例上。