Spring Cloud 下线微服务

十年热恋 提交于 2019-12-03 03:29:54

方式一:kill java进程【不建议】

    使用方式:

kill java进程ID

    该方式借助的是Spring Boot应用的Shutdown hook,应用本身的下线也是优雅的,但如果你的服务发现组件使用的是Eureka,那么默认最长会有90秒的延迟,其他应用才会感知到该服务下线,这意味着:该实例下线后的90秒内,其他服务仍然可能调用到这个已下线的实例。因此,该方式是不够优雅的 。

方式二:/shutdown 端点【不建议】

    Spring Boot提供了/shutdown 端点,可以借助它实现优雅停机。使用方式:

    在想下线应用的applicationyml 中添加如下配置,从而启用并暴露/shutdown 端点:

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 端点,利用该端点可实现优雅下线。

    使用方式:

    在想下线应用的application.yml 中添加配置,从而启用并暴露/pause 端点:

 

management:

    endpoint:

        shutdown:

            enabled: true

    endpoints:

        web:

            exposure:

                include: shutdown

    发送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 端点的效果。

    缺点

        暂时没有发现缺点。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!