说明:
在默认情况下,Eureka 的客户端每隔 30 秒会发送一次心跳给服务端,告知仍然存活,但是一些情况下(比如数据库挂了),客户端表面上可以正常发送心跳,但实际上无法提供服务。
这时可以利用 Eureka 的健康检查控制器(哪个模块对外提供服务需要自检,在哪个模块实现)。
需要在 pom.xml 中引入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-actuator</artifactId>
<version>1.5.3.RELEASE</version>
</dependency>
SpringBoot Actuator
第一步: 可以实现一个自定义的 HealthIndicator 来根据是否能访问数据库决定自身的健康状态,
第二步: 服务提供者把自身健康状态告知服务器.
实现"健康检查处理器", 将应用的健康状态保存在内存中,状态一旦发生改变,就会重新向服务器进行注册,其他的客户端将拿不到这些不可用的实例。
访问 http://localhost:8080/db/true 将数据库状态设置为 true
再看状态就是 UP
第三步 服务查询
查看集群中的服务,可以使用 SpringCloud 的 discoveryClient 类, 或者 eurekaClient 类,SpringCloud 对 Eureka 进行了封装。本例中使用 discoveryClient 的方法来查询服务实例,输出服务实例的状态等信息。
访问 http://localhost:8080/db/false 将 db 设置为 false
3.再访问 http://localhost:9000/router 服务 输出如下:
HEALTH-HANDLER-INVOKER---172.16.112.115:health-handler-invoker:9000---UP
说明,可用的服务只剩下调用者自己了,服务的提供者已经不存在于服务列表中.
综上,
想要服务健康自检,需要两步(实测,仅需要第二步实现 HealthCheckHandler):
1.实现 HealthIndicator
来返回服务的状态。
实现 HealthCheckHandler
来让 Eureka 调用获取 getStatus
方法来获取状态并通知服务端
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于