• 深入研究下Spring Boot Actuator 在kubernetes中探针的应用


    背景

    不管什么样的场景,我们应用基本上都需要提供一个探针,判断应用是否存活,来监控应用是否存活,是否需要剔除服务,是否需要自动重启

    健康监控

    在不使用三方插件我们最简单的方式就是自己写个接口供外部调用去做类似心跳探测

        @GetMapping("/health")
        public String health() {
            return ActionEnum.SUCCESS.name();
        }
    
    • 1
    • 2
    • 3
    • 4

    Spring Boot Actuator

    实际上Spring Boot Actuator已经给我们提供了相应的组件。

    使用

    spring boot 版本: 2.6.8

    1. 引入依赖
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
    
    • 1
    • 2
    • 3
    • 4
    1. 启动endpoint监控
      我们可以使用如下配置开启所有的接口(endpoint)监控
    management:
      endpoints:
        web:
          exposure:
            include: '*'
    
    • 1
    • 2
    • 3
    • 4
    • 5

    也可以开启指定接口(endpoint)的监控

    management:
      endpoints:
        web:
          exposure:
            exclude: health,beans,trace
    
    • 1
    • 2
    • 3
    • 4
    • 5

    默认的接口前缀都是/actuator开头,如果我们要自定义可以使用如下配置

    management:
      endpoints:
        web:
          base-path: /manage
    
    • 1
    • 2
    • 3
    • 4

    spring boot 为我们提供了如下可用的接口(endpoints)

    路径描述
    auditevents公开当前应用程序的审计事件信息。
    beans显示应用程序中所有 Springbean 的完整列表
    caches公开可用的缓存
    conditions显示在配置和自动配置类上计算的条件以及它们匹配或不匹配的原因
    configprops显示已排序的所有@ConfigurationProperties 列表
    env获取全部环境属性
    flyway显示已经应用的任何 Flyway 数据库迁移。需要一个或多个 Flyway bean
    health显示应用程序健康信息
    httptrace显示 HTTP 跟踪信息(默认情况下是最后100次 HTTP 请求-响应)
    info显示任意的应用程序信息
    integrationgraph显示了 Spring integrationgraph。需要对 Spring-Integration-core 的依赖关系
    threaddump获取线程活动的快照

    更多请参考spring boot 官方文档

    1. 访问接口

    添加了spring-boot-starter-actuator依赖并开启接口监控后,我们可以直接访问接口,比如health

    我们访问:

    http://localhost:8080/actuator/health
    
    • 1

    在这里插入图片描述
    可以看到就返回了应用的健康信息,其他的接口就不一一演示了。因为这不是我们今天的重点

    kubernetes 健康检查

    当应用部署到kuberneteskubernetes提供了两种探测机制

    • Liveness探测(存活探针):Liveness探测让用户可以自定义判断容器是否健康的条件。如果探测失败,Kubernetes就会重启容器。
      在这里插入图片描述

    • Readiness探测(就绪探针):Readiness探测则是告诉Kubernetes什么时候可以将容器加入到Service负载均衡池中,对外提供服务
      在这里插入图片描述

    在2.3.0之前我们Liveness探测Readiness探测都可以使用health这个接口来处理。

    health 源码分析

    health的自动装配主要实现类是HealthEndpointAutoConfiguration

    @Configuration(proxyBeanMethods = false)
    @ConditionalOnAvailableEndpoint(endpoint = HealthEndpoint.class)
    @EnableConfigurationProperties(HealthEndpointProperties.class)
    @Import({ HealthEndpointConfiguration.class, ReactiveHealthEndpointConfiguration.class,
    		HealthEndpointWebExtensionConfiguration.class, HealthEndpointReactiveWebExtensionConfiguration.class })
    public class HealthEndpointAutoConfiguration {
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这里面我们可以一个比较核心的类HealthEndpointConfiguration
    在这里插入图片描述
    这里获取的就是health要检测的一些资源
    在这里插入图片描述
    比如数据库
    在这里插入图片描述
    这里就可以看到了一个问题,实际上容器的存活就绪探针是应该分开的。

    1. 存活的探测不应该依赖于数据库这些三方中间件
    2. 就绪就需要检测数据库连接池等三方中间件是否加载完成,是否可以提供服务了

    Spring boot 版本更新支持kubernetes 探针

    在这里插入图片描述
    可以看到在spring boot 2.3后官方支持了kubernetes的这两种探针

    在spring boot 中使用kubernetes 探针

    默认只有应用在kubernetes容器中开会开启这两个探针即

    • /actuator/health/liveness
    • /actuator/health/readiness

    如果我们本地需要开启测试可以添加如下配置开关

    management:
      endpoint:
        health:
          probes:
            enabled: true
    
    • 1
    • 2
    • 3
    • 4
    • 5

    然后我们访问试试

    在这里插入图片描述

    可以看到是生效了

    总结

    我们从最初的健康探测,到kubernetes中的liveness(存活)探针readiness(就绪)探针
    可见即使是最简单的健康检测也有这么多要研究的东西。
    路漫漫其修远兮,吾将上下而求索啊!

  • 相关阅读:
    012-第二代硬件选型
    前端3D规划
    【Python数据结构与判断7/7】数据结构小结
    字符设备驱动注册的本质及注册注销步骤,struct inode/file结构体作用
    售前工程师工作内幕揭秘:面试实战技巧
    MySQL源码解析之执行计划
    JAVA毕业设计购物网站设计计算机源码+lw文档+系统+调试部署+数据库
    springmvc 获取项目中的所有请求路径
    计算机毕业设计选题推荐-在线考试系统-Java项目实战
    手把手教你搭建Windows 搭建Prometheus + Grafana + Jmeter可视化监控平台
  • 原文地址:https://blog.csdn.net/qq_42651904/article/details/125467593