Spring Cloud填坑日志(3)——Spring Boot Actuator的/pause端点使用

背景

    最近在学习周立大神的《Spring Cloud与Docker微服务架构实战》,在翻阅Eureka的健康检查这一部分的时候,发现有一个小备注:

  • 当eureka.client.healthcheck.enabled=true时,/pause端点(该端点由Spring Boot Actuator提供,用于暂停应用)无法正常工作,经笔者测试,发现当eureka.client.healthcheck.enabled=true时,请求/pause端点也无法将应用在Eureka上的状态标记为DOWN。由于该Bug尚未修复,建议读者留意。

于是我想重现一下这个Bug,但是并不知道如何使用这个端点,于是在网上搜了/pause端点的使用方式:实用技巧:Spring Cloud中,如何优雅下线微服务?,开启了踩坑之旅。

前提

    本人使用的相关软件版本是Spring Boot 1.x + Spring Cloud Edgware。

问题描述

    本人使用以下方法配置和暴露/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

然后eclipse一直报错找不到对应的属性,
在这里插入图片描述

出现原因

    一开始很迷惑,明明引入了Spring Boot Actuator依赖为什么还是找不到对应的配置属性,后来仔细看周立大神的博客,总算找到了原因:

:Spring Boot 1.x + Spring Cloud Edgware及之前的方式相同,但配置有区别,本文不做讨论。

要仔细看别人的博客!要仔细看别人的博客!要仔细看别人的博客!重要的事情说三遍。上面说的是Spring Boot 2.x配置,Spring Boot 2.x的Actuator与之前版本有较大不同。

解决方法

于是我按照Spring Boot 1.x的方式将以上配置改成了如下配置:

endpoints:
    # 启用pause端点
    pause:
      enabled: true
    # 启用restart端点,之所以要启用restart端点,是因为pause端点的启用依赖restart端点的启用
    restart:
      enabled: true

:启用pause端点的时候会依赖于restart端点,这严格意义上是Bug

重启服务,发送命令给Eureka Server

curl -X POST http://你想停止的服务实例地址/pause

需要注意的是,Spring Boot 2.x的端点基础路径由/调整到/actuator下,如:/info调整为/actuator/info可以通过以下配置改为和旧版本一致:

management.endpoints.web.base-path=/

通过curl命令调用/pause端点实现了服务的暂停,如图所示服务状态变成了DOWN
在这里插入图片描述
而当我们设置配置eureka.client.healthcheck.enabled=true的时候,即使调用/pause端点,Eureka上服务的状态也会是UP
在这里插入图片描述

:当应用在Eureka Server上的状态已被标记为DOWN但是应用本身其实依然是可以正常对外服务的,并没有被关闭,而在Spring Cloud中,Ribbon做负载均衡时,只会负载到标记为UP的实例上。

参考链接

实用技巧:Spring Cloud中,如何优雅下线微服务?
Spring Boot 2.0官方文档之 Actuator翻译
学习Spring Boot:(二十七)Spring Boot 2.0 中使用 Actuator


版权声明:本文为u010629610原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。