默认情况下注册到eureka server的服务是通过心跳来告知自己是UP还是DOWN,并不是通过spring-boot-actuator模块的/health端点来实现的,这样其实不是很合理
默认的心跳实现方式可以有效的检查eureka客户端进程是否正常运作,但是无法保证客户端应用能够正常提供服务。由于大多数微服务应用都会有一些其他的外部资源依赖,比如数据库,REDIS缓存等,如果我们的应用与这些外部资源无法连通的时候,实际上已经不能提供正常的对外服务了,但因为客户端心跳依然在运行,所以它还是会被服务消费者调用,而这样的调用实际上并不能获得预期的后果。
我们可以通过在eureka客户端中配置:
eureka.client.healthcheck.enabled=true
,就可以改变eureka server对客户端健康检测的方式,改用actuator的/health端点来检测。
添加一个自定义的HealthIndicator:
1 | import org.springframework.boot.actuate.health.Health; |
里面有一个成员变量up,用来控制是否监控,下面我们会在请求中改变这个变量的值来模拟健康状态UP->DOWN
1 | import com.example.eurekaclientconsumerribbon.health.MyHealthChecker; |
application.yml:
1 | spring: |
主要看配置里面设置了
eureka.client.healthcheck.enabled=true
,这个配置属性在IDEA里面不会自动提示,我一度怀疑写错了,试过确实有效的改变了检测方式。启动该服务将会注册到eureka server中去,此时显示的应该是UP,
然后我们调用一下服务:http://localhost:8200/up?up=false
,将此时查看http://localhost:8200/health
,整个应用的health状态变成DOWN了:注册中心的服务状态也将变为DOWN:我们可以试一下把application.yml中eureka.client.healthcheck.enabled=true这段配置去掉重新启动服务,然后调用服务将health变为DOWN,但是注册中心中仍然会显示该服务的status为UP!