Spring Cloud系列(六) 改变Eureka server中注册服务的健康检测方式(Finchley.RC2版本)

发布于:2021-07-30 07:42:59

默认情况下,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的/actuator/health端点来检测。如果你对actuator的health端点做了处理,比如加了前缀等,请按照我这篇文章Eureka配置的端点配置对应修改,保证服务注册中心和正确访问到端点的路径。

修改服务提供者hello-service,即eureka-client-vFinchley.Rc2项目


第一步,在pom.xml引入actuator依赖



org.springframework.boot
spring-boot-starter-actuator

第二步,新建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;
}

}

第三步,新建HealthController提供修改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文件,添加eureka.client.healthcheck.enabled=true和配置actuator


#应用名称
spring:
application:
name: hello-service #为服务命名
server:
port: 2222
eureka:
client:
service-url:
defaultZone: http://localhost:1111/eureka/ #指定服务注册中心位置
healthcheck:
enabled: true #这个属性不会提示 修改健康检测方式为health监控
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面板也会跟着变。

相关推荐

最新更新

猜你喜欢