背景
最近在学习周立大神的《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