工作逻辑
Eureka Server 开启健康检查,收集 Eureka Client 的健康状态; Eureka Client 定期自我检查,定期更新服务状态。
关于 Actuator
Spring Boot 提供了收集系统信息和对系统进行管理的功能,并会把它们以JMX或Http的方式发布出来,用户可以把它们集成到自己的监控系统中。
actuator 提供了更细粒度的系统监控方式,不仅仅停留在该服务的端口是否可达的层面。 provider 可以根据自己依赖的资源最终给出自己服务状态。如探测到依赖的 db、redis、mq 不可达了或出现了必然使业务失败的因素,可将自己设置成 DOWN
、 OUT_OF_SERVICE
或者 UNKNOW
。
-
actuator 提供的 endpoint
可以参照 Spring Boot Actuator: Production-ready featuresHTTP方法 路径 描述 鉴权 GET /autoconfig 查看自动配置的使用情况 true GET /configprops 查看配置属性,包括默认配置 true GET /beans 查看bean及其关系列表 true GET /dump 打印线程栈 true GET /env 查看所有环境变量 true GET /env/{name} 查看具体变量值 true GET /health 查看应用健康指标 false GET /info 查看应用信息 false GET /mappings 查看所有url映射 true GET /metrics 查看应用基本指标 true GET /metrics/{name} 查看具体指标 true POST /shutdown 关闭应用 true GET /trace 查看基本追踪信息 true acutator 默认只开放了 2 个 endpoints: /health 和 /info
-
actuator endpoint 配置
##管理端点HTTP端口,默认值是server.port management.server.port= 33101 #management.endpoints.enabled-by-default = true ##暴露所有端点 management.endpoints.web.exposure.include = "*" ##是否启用configprops端点。 #management.endpoint.configprops.enabled=true ##是否启用beans端点。 #management.endpoint.beans.enabled=true ##可以缓存响应的最长时间。 #management.endpoint.beans.cache.time-to-live= 0ms ##是否启用beans端点。 #management.endpoint.health.enabled=true ##是否启用info端点。 #management.endpoint.info.enabled=true ##应包含的端点ID或所有的“*” #management.endpoints.jmx.exposure.include=* ##应排除的端点ID或所有的'*'。 #management.endpoints.jmx.exposure.exclude = * ##是否启用env端点。 #management.endpoint.env.enabled=true ##是否启用mappings端点。 #management.endpoint.mappings.enabled=true ##是否启用metrics端点。 #management.endpoint.metrics.enabled=true ##是否启用threaddump端点 #management.endpoint.threaddump.enabled=true ##是否启用httptrace端点。 #management.endpoint.httptrace.enabled=tru
按照以上配置,可以通过 http://localhost:
33101
/actuator 查看所有 actuator 开放的端点。 -
actuator 提供的健康状态
public static final Status UNKNOWN = new Status("UNKNOWN"); public static final Status UP = new Status("UP"); public static final Status DOWN = new Status("DOWN"); public static final Status OUT_OF_SERVICE = new Status("OUT_OF_SERVICE");
Eureka Client 的配置改造
-
配置
eureka: instance: lease-renewal-interval-in-seconds: 30 # 表示 eureka client 发送心跳给server端的频率。这个值决定了服务注册的快慢,太快消耗资源。默认30秒。 lease-expiration-duration-in-seconds: 90 # 表示 eureka server 至上一次收到 client 的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则将移除该 instance。默认90秒 。 上报 eureka server 如何对待改 instance client: healthcheck: enabled: true # 开启客户端健康检查
Actuator 的使用
- 改造
album-provider
模块,spring-boot-starter-actuator
的模块已经在前面添加过了 -
创建一个程序入口
..ServiceStatusController
,可以通过外部传入参数控制当前 provider 的服务状态,来模拟 provider 的自我检查时发生了故障、又恢复了、又故障了@RestController @RequestMapping("/album") public class ServiceStatusController { // 期望的服务状态,默认是 true ,也就是服务状态为 UP public static boolean expectedStatus = true; @RequestMapping("/status") public String getServiceStatus() { return "期望的服务状态是 : " + expectedStatus + " ,等待 spring cloud 同步该状态,查看 eureka ui 面板信息"; } // 该接口接收一个 boolean 值,使用这个值来模拟检查 DB 是否可用后的返回结果 //(DB 是不是可用,这个接口传值说的算) @RequestMapping("/status/{isUp}") public String setServiceStatus(@PathVariable boolean isUp) { expectedStatus = isUp; return "期望的服务状态是 : " + expectedStatus + " ,等待 spring cloud 同步该状态,查看 eureka ui 面板信息"; } }
-
实现健康检查接口
..HealthSelfCheckService
@Component public class HealthSelfCheckService implements HealthIndicator { // 这里的逻辑应该是有个定时任务,周期性的检查 DB 的链接状态,改变 ServiceStatusController.expectedStatus 的值 // 当 health() 被调用时,根据当时的情况返回服务状态。 // 当然表示状态的变量不应该在 Controller 里 @Override public Health health() { if(ServiceStatusController.expectedStatus) { return new Health.Builder(Status.UP).build(); } else { return new Health.Builder(Status.DOWN).build(); } } }
- 依次启动 eureka-server 和 album-provider ,查看 eureka-server ui 面板
访问 album-provider 的http://localhost:33001/actuator/health
也会得到相同的状态提示 {"status":"UP"} - 访问 album-provider 的
http://localhost:33001/album/status/false
模拟此时 album-provider 的数据库已经无法连接。 - 回到 eureka-server ui 面板,刷新,最终会得到
该姿势可达成平滑下线。但是下线结果反馈到 eureka-server 有延迟。
通过 eurek-server 的接口下线服务。使用DELETE
请求访问http://{eureka-server}:{port}/eureka/apps/{application-name}/{instance}:{port}
,改接口是用于删除服务列表的。 需要另外注意的是,如果你的 eureka-server 开启了用户认证,需要提交认证信息,否则 401 无权限。 如果删除的实例仍然维持心跳,该实例会被添加会 eureka-server 的服务列表。
eureka-server ui 对服务状态更新的延迟
以下时间均为默认值;时长结果均为极限最长的极限时间。
Eureka UI | 时间 | 说明 |
---|---|---|
上线 | 0s | |
正常下线 | 30(Client)=30s | 30一次心跳检测 |
非正常下线 | 30+60(evict)*2+30= 180s | provider 非正常下线不会触发 DiscoveryClient.shutdown() 方法。 client 设置的 90s 清除 + server 60s 定时清除检查 + 30s Eureka Client 心跳 。(30秒定时检查未过期,+60秒定时检查仍未过期,再晚一点点就可以检查出,但就差这么一点点) |
使 eureka-server ui 中 instance 的 rul 可用
- 配置文件
- maven 解析占位符
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。