默认情况下,Eureka的健康检测并不是通过actuator的health端点来实现的,而是依靠客户端心跳的方式来保持服务实例的存活。在Eureka的服务续约和剔除机制下,客户端的健康状态从注册到注册中心开始会一直处于UP状态,除非心跳终止一段时间后,服务注册中心将其剔除。默认的心跳的方式可以有效检查客户端进程是否正常运行,但无法有效检查客户端是否可以正常提供服务,比如大多数微服务应用都会有一些其他的外部资源依赖,比如数据库,REDIS缓存等,如果我们的应用与这些外部资源无法连通的时候,实际上已经不能提供正常的对外服务了,但因为客户端心跳依然在运行,所以它还是会被服务消费者调用,而这样的调用实际上并不能获得预期的后果。我们可以将其健康检查的方式修改为actuator的Health端点来实现。
①在pom.xml中引入spring-boot-starter-actuator模块的依赖。
②在eureka客户端中的application.properties或yml文件中配置:eureka.client.healthcheck.enabled=true,就可以改变eureka server对客户端健康检测的方式,改用actuator的/health端点来检测。
③如果你对actuator的health端点做了处理,比如加了前缀等,请按照第四节的端点配置对应修改,保证服务注册中心和正确访问到端点的路径。
现在通过代码来实现
在客户端的pom.xml引入actuator依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
在eureka-client-vFinchley.Rc2项目中新建类MyHealthChecker并实现HealthIndicator,来加入自己的逻辑。
/**
* 自定义health监控内容
* @author Administrator
*
*/
@Component
public class MyHealthChecker implements HealthIndicator{
private boolean up = true;
@Override
public Health health() {
if (up) {
return new Health.Builder().withDetail("status", "up").up().build(); //自定义监控内容
} else {
return new Health.Builder().withDetail("error", "client is down").down().build();
}
}
public boolean isUp() {
return up;
}
public void setUp(boolean up) {
this.up = up;
}
}
新建一个Controller提供修改UP/DOWN状态的API
@RestController
public class HealthController {
@Autowired
private MyHealthChecker myHealthChecker;
@RequestMapping("/up")
public String up(@RequestParam("up") Boolean up) {
myHealthChecker.setUp(up);
return myHealthChecker.isUp()?"UP":"DOWN";
}
}
修改application.yml文件
#应用名称
spring:
application:
name: hello-service #为服务命名
server:
port: 2222
eureka:
client:
service-url:
defaultZone: http://localhost:1111/eureka/ #指定服务注册中心位置
healthcheck:
enabled: true #这个属性不会提示
instance:
prefer-ip-address: true
instance-id: ${spring.cloud.client.ip-address}:${server.port}
#actuator设置
management:
endpoints:
web:
exposure:
include: "*" #暴露所有端点 默认是info和health
endpoint:
health:
show-details: always #默认是never
注意eureka.client.healthcheck.enabled=true 是不会自动提示的。actuator设置那部分是2.0以上的版本必加的。
现在先后启动服务端和客户端,发现Eureka面板已经有此服务了,状态为UP
查看一下客户端的健康信息,这里如果不配置刚才的actuator设置则只有status属性。
请求up接口修改客户端的状态
再次查看客户端的健康信息,已经变成DOWM了
再次访问Eureka面板发现也变成DOWN了
此时消费者就不能在这个客户端获取服务了。
如果再次请求up接口变为UP状态则Eureka面板也会跟着变。