前文链接:https://blog.csdn.net/weixin_41682266/article/details/88854103
前言:
在默认情况下,Eureka客户端(服务提供者或调用者)会每隔30秒发送一次“心跳”告诉Eureka服务器自己是否还是存活状态,但是呢,实际情况有可能出现这样子:客户端出现了部分异常,服务已经不可用了,但是还在正常的向服务器发送心跳,因为很显然的,即便某个接口不能用了整个微服务还并没有挂掉。比如数据库连接中断或者是依赖的上游系统挂了等等。
那么,我们就需要一个健康自检机制,更加智能的处理这种问题。而Eureka就提供了这么一种功能----健康检查控制器
步骤:
1.假设服务提供者需要访问数据库,那么对其进行健康自检。我们可以对上次搭建的集群中client-1进行健康自检,首先增加actuator自检模块,maven如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
然后在application.properties中添加:
eureka.client.initial-instance-info-replication-interval-seconds=10
修改为每10秒发送一次心跳
接着启动服务,结果如图:
通过地址访问就可以了解到当前服务是否存在异常了
2.通过健康自检,我们可以实现服务查询,通过查询我们可以知道当前的各个服务目前那个存在异常情况了
@RestController
@Configuration
public class InvokerController {
@Autowired
private DiscoveryClient discoveryClient;
@RequestMapping(value = "/rotuer",method = RequestMethod.GET)
public String router(){
List<ServiceInstance> list =getServiceInstances();
for (ServiceInstance service:list){
EurekaServiceInstance esi = (EurekaServiceInstance)service;
InstanceInfo info = esi.getInstanceInfo();
System.out.println(info.getAppName()+"==="+info.getInstanceId()+"==="+info.getStatus());
}
return "";
}
private List<ServiceInstance> getServiceInstances(){
List<String> ids = discoveryClient.getServices();
List<ServiceInstance> result = new ArrayList<ServiceInstance>();
for (String i:ids){
List<ServiceInstance> list =discoveryClient.getInstances(i);
result.addAll(list);
}
return result;
}
尾言:
通过实现健康查询服务,我们可以通过调用该服务去发现哪里出现了异常,这样子能够快速的定位到异常发生点,使得能够快速对异常服务快速的进行处理。