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

默认情况下,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

扫描二维码关注公众号,回复: 2939829 查看本文章

查看一下客户端的健康信息,这里如果不配置刚才的actuator设置则只有status属性。

请求up接口修改客户端的状态

再次查看客户端的健康信息,已经变成DOWM了

再次访问Eureka面板发现也变成DOWN了

此时消费者就不能在这个客户端获取服务了。

如果再次请求up接口变为UP状态则Eureka面板也会跟着变。

猜你喜欢

转载自blog.csdn.net/WYA1993/article/details/81083848
今日推荐