zoukankan      html  css  js  c++  java
  • 三、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 就可以看到各个服务的状态了

    我来美化一下:

     

     

  • 相关阅读:
    LabelImg 图像图像标注工具
    周杰伦的2000w个故事
    ROS 订阅图像节点(1)
    ROS 订阅图像节点
    ROS 双目标定
    书籍
    Z30云台PC控制问题
    大疆M600组装和试飞
    M100 X3云台安装
    M100 组装教程
  • 原文地址:https://www.cnblogs.com/cnsec/p/13407185.html
Copyright © 2011-2022 走看看