三、Spring Cloud 之旅 -- Eureka 服务实例的健康自检

NOTE:本博客演示的代码可以去github下载:https://github.com/aharddreamer/chendong.git

上节我们演示了简单的将微服务发布Eureka与相互之间的调用,还演示了Eureka的集群及负载均衡功能。这节我们要学习Eureka更高级一点的功能—微服务实例的健康自检。

在默认情况下,Eureka客户端(微服务提供者或调用者)会每隔30秒发送一次心跳给Eureka服务器,告诉服务器自己是否是存活状态,但是实际情况可能会这样:客户端出现了部分异常,服务已经不可用了,但是还在正常的向服务器发送心跳,因为很显然,即使某个接口不能用了整个微服务还并没有挂掉。比如数据库连接中断 或者依赖的上游系统挂了等等。

那么,我们就需要一个健康自检机制,更加智能的处理这种问题。刚好 Eureka提供了这么一种功能—健康检查控制器。

本节演示的项目结构 (没有建过项目的同学请看我上一节博客):

eureka-server

first-service-provider

first-service-invoker

修改first-service-provider 项目的POM,我们要加入下面依赖:

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-actuator</artifactId>
   <version>1.5.3.RELEASE</version>
</dependency>

加好之后,启动first-service-provider试试。我在启动的时候报了一个jackson包未找到的错误,于是我又加入下面的依赖:

<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-core</artifactId>
   <version>2.9.8</version>
</dependency>

<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-databind</artifactId>
   <version>2.9.8</version>
</dependency>

PS: POM加完依赖之后,如果你用的IDE是Intellij IDEA,那么修改POM后右下角会出现一个弹出框,请点击Import Changes,这样依赖就会自动下载了。

如果是eclipse,修改完POM之后,请选中POM 右键->update maven project.

 

依次启动eureka-server和first-service-provider.

启动完之后,在浏览器输入: http://localhost:8080/health

可以看到浏览器返回如下:

说明该REST服务向外展示当前应用的状态为UP (服务正常)。

 

接下来我们要试试actuator自带的健康自检功能。

在first-service-provider里面新建一个Controller,我们要在这里面写一个测试的接口:

定义了一个变量,访问的时候通过控制这个变量来表示数据库的连接状态。

True表示当前数据库连接良好

False表示当前数据库连接中断

 

新建一个类,这个类实现了HealthIndicator接口,讲实现它的一个health方法,这个方法是用来构建当前微服务状态的。我们要做的就是当数据库连接中断(dbConnectionIsOk=false)的时候,来调整当前微服务的状态为DOWN。

好了,重新启动first-service-provider试试,然后访问http://localhost:8080/health 接口看看。会发现开始当前微服务状态为DOWN:

然后通过测试接口,修改状态为true:

再访问health接口试试:

可以看到服务已经起来了。

 

光这样的话只有服务提供者自己知道当前健康状态,我们还需要将之告诉服务器,然后在Eureka服务器上注册的其他微服务将拿不到这些“生病”的微服务。

新建一个健康检查处理器,处理器会将健康状态保存在内存,一旦状态发生改变将报告给服务器,如果状态不正常,其他微服务也就拿不到它了。

NOTE: 注意都不要忘了加@Component注解哦,要加入到Spring的容器托管,不然不会起作用的。

改好之后,再启动first-service-provider,启动的过程中可以看到控制台打印的“数据库连接异常”信息,这是因为dbConnectionIsOk变量的初始值是false。启动完了之后访问Eureka Server看看:

 

可以看到目前first-service-provider是DOWN的,被红色标记出来了。

我们通过测试接口改下状态:

咦!为啥还是DOWN的?

嚯嚯,是因为传状态给服务器的动作是定时执行的,并不是实时执行,默认是30秒钟一次,所以等待30秒钟再看看:

可以发现,它已经UP了。

那么我们怎么修改这个默认时间呢?可以再application.properties里面加入这个属性:

eureka.client.instance-info-replication-interval-seconds=10

这样就能将时间限制为10秒了。如果是application.yml文件,那就是这样的:

eureka.client.instanceInfoReplicationIntervalSeconds: 10

自己动手试试吧!

 

接下来,演示一下微服务查询。

这次我们要修改的是first-service-invoker(调用者) 的代码来看看健康自检的效果。

在first-service-invoker里面加一个测试接口,代码如下:

 

启动first-service-invoker, 在浏览器输入:http://localhost:9000/testHealth 就可以看到各个服务的状态了

我来美化一下:

 

 

posted @ 2019-03-09 17:28  SEC.VIP_网络安全服务  阅读(290)  评论(0编辑  收藏  举报