工作逻辑

Eureka Server 开启健康检查,收集 Eureka Client 的健康状态; Eureka Client 定期自我检查,定期更新服务状态。

关于 Actuator

Spring Boot 提供了收集系统信息和对系统进行管理的功能,并会把它们以JMX或Http的方式发布出来,用户可以把它们集成到自己的监控系统中。

actuator 提供了更细粒度的系统监控方式,不仅仅停留在该服务的端口是否可达的层面。 provider 可以根据自己依赖的资源最终给出自己服务状态。如探测到依赖的 db、redis、mq 不可达了或出现了必然使业务失败的因素,可将自己设置成 DOWNOUT_OF_SERVICE 或者 UNKNOW

  1. actuator 提供的 endpoint
    可以参照 Spring Boot Actuator: Production-ready features

    HTTP方法 路径 描述 鉴权
    GET /autoconfig 查看自动配置的使用情况 true
    GET /configprops 查看配置属性,包括默认配置 true
    GET /beans 查看bean及其关系列表 true
    GET /dump 打印线程栈 true
    GET /env 查看所有环境变量 true
    GET /env/{name} 查看具体变量值 true
    GET /health 查看应用健康指标 false
    GET /info 查看应用信息 false
    GET /mappings 查看所有url映射 true
    GET /metrics 查看应用基本指标 true
    GET /metrics/{name} 查看具体指标 true
    POST /shutdown 关闭应用 true
    GET /trace 查看基本追踪信息 true

    acutator 默认只开放了 2 个 endpoints: /health 和 /info

  2. actuator endpoint 配置

    ##管理端点HTTP端口,默认值是server.port
    management.server.port= 33101
    #management.endpoints.enabled-by-default = true
    ##暴露所有端点
    management.endpoints.web.exposure.include = "*"
    ##是否启用configprops端点。
    #management.endpoint.configprops.enabled=true
    ##是否启用beans端点。
    #management.endpoint.beans.enabled=true
    ##可以缓存响应的最长时间。
    #management.endpoint.beans.cache.time-to-live= 0ms
    ##是否启用beans端点。
    #management.endpoint.health.enabled=true
    ##是否启用info端点。
    #management.endpoint.info.enabled=true
    ##应包含的端点ID或所有的“*”
    #management.endpoints.jmx.exposure.include=*
    ##应排除的端点ID或所有的'*'。
    #management.endpoints.jmx.exposure.exclude = *
    ##是否启用env端点。
    #management.endpoint.env.enabled=true
    ##是否启用mappings端点。
    #management.endpoint.mappings.enabled=true
    ##是否启用metrics端点。
    #management.endpoint.metrics.enabled=true
    ##是否启用threaddump端点
    #management.endpoint.threaddump.enabled=true
    ##是否启用httptrace端点。
    #management.endpoint.httptrace.enabled=tru

    按照以上配置,可以通过 http://localhost:33101/actuator 查看所有 actuator 开放的端点。

  3. actuator 提供的健康状态

      public static final Status UNKNOWN = new Status("UNKNOWN");
      public static final Status UP = new Status("UP");
      public static final Status DOWN = new Status("DOWN");
      public static final Status OUT_OF_SERVICE = new Status("OUT_OF_SERVICE");

Eureka Client 的配置改造

  1. 配置

    eureka:
      instance:
        lease-renewal-interval-in-seconds: 30 # 表示 eureka client 发送心跳给server端的频率。这个值决定了服务注册的快慢,太快消耗资源。默认30秒。
        lease-expiration-duration-in-seconds: 90 # 表示 eureka server 至上一次收到 client 的心跳之后,等待下一次心跳的超时时间,在这个时间内若没收到下一次心跳,则将移除该 instance。默认90秒 。 上报 eureka server 如何对待改 instance
      client:
        healthcheck:
          enabled: true # 开启客户端健康检查

Actuator 的使用

  1. 改造 album-provider 模块, spring-boot-starter-actuator 的模块已经在前面添加过了
  2. 创建一个程序入口 ..ServiceStatusController,可以通过外部传入参数控制当前 provider 的服务状态,来模拟 provider 的自我检查时发生了故障、又恢复了、又故障了

    @RestController
    @RequestMapping("/album")
    public class ServiceStatusController {
    
      // 期望的服务状态,默认是 true ,也就是服务状态为 UP
      public static boolean expectedStatus = true;
    
      @RequestMapping("/status")
      public String getServiceStatus() {
        return "期望的服务状态是 : " + expectedStatus  + " ,等待 spring cloud 同步该状态,查看 eureka ui 面板信息";
      }
    
      // 该接口接收一个 boolean 值,使用这个值来模拟检查 DB 是否可用后的返回结果
      //(DB 是不是可用,这个接口传值说的算)
      @RequestMapping("/status/{isUp}")
      public String setServiceStatus(@PathVariable boolean isUp) {
        expectedStatus = isUp;
        return "期望的服务状态是 : " + expectedStatus + " ,等待 spring cloud 同步该状态,查看 eureka ui 面板信息";
      }
    }
  3. 实现健康检查接口 ..HealthSelfCheckService

    @Component
    public class HealthSelfCheckService implements HealthIndicator {
    
      // 这里的逻辑应该是有个定时任务,周期性的检查 DB 的链接状态,改变 ServiceStatusController.expectedStatus 的值
      // 当 health() 被调用时,根据当时的情况返回服务状态。
      // 当然表示状态的变量不应该在 Controller 里
      @Override
      public Health health() {
        if(ServiceStatusController.expectedStatus) {
          return new Health.Builder(Status.UP).build();
        } else {
          return new Health.Builder(Status.DOWN).build();
        }
      }
    }
  4. 依次启动 eureka-server 和 album-provider ,查看 eureka-server ui 面板
    album-provider UP 状态
    访问 album-provider 的 http://localhost:33001/actuator/health 也会得到相同的状态提示 {"status":"UP"}
  5. 访问 album-provider 的 http://localhost:33001/album/status/false 模拟此时 album-provider 的数据库已经无法连接。
  6. 回到 eureka-server ui 面板,刷新,最终会得到
    album-provider DOWN 状态
该姿势可达成平滑下线。但是下线结果反馈到 eureka-server 有延迟。
通过 eurek-server 的接口下线服务。使用 DELETE 请求访问 http://{eureka-server}:{port}/eureka/apps/{application-name}/{instance}:{port} ,改接口是用于删除服务列表的。 需要另外注意的是,如果你的 eureka-server 开启了用户认证,需要提交认证信息,否则 401 无权限。 如果删除的实例仍然维持心跳,该实例会被添加会 eureka-server 的服务列表。

eureka-server ui 对服务状态更新的延迟

以下时间均为默认值;时长结果均为极限最长的极限时间。

Eureka UI 时间 说明
上线 0s
正常下线 30(Client)=30s 30一次心跳检测
非正常下线 30+60(evict)*2+30= 180s provider 非正常下线不会触发 DiscoveryClient.shutdown() 方法。 client 设置的 90s 清除 + server 60s 定时清除检查 + 30s Eureka Client 心跳 。(30秒定时检查未过期,+60秒定时检查仍未过期,再晚一点点就可以检查出,但就差这么一点点)

使 eureka-server ui 中 instance 的 rul 可用

  1. 配置文件
  2. maven 解析占位符

wowxhycoming
0 声望1 粉丝

引用和评论

0 条评论