0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Spring Boot Actuator快速入门

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-10-09 17:11 次阅读

不知道大家在写 Spring Boot 项目的过程中,使用过 Spring Boot Actuator 吗?知道 Spring Boot Actuator 是什么,干什么的吗?今天就要来给大家介绍一下 Spring Boot Actuator,学习如何在 Spring Boot 2.x 中使用、配置和扩展这个监控工具。Spring Boot 1.x 的使用就不再这边介绍了。相信大家平时使用的框架基本上都要升级到 2.x了吧。

什么是 Actuator ?

从本质上讲,Spring Boot Actuator 为我们的应用程序带来了生产就绪的功能。监控我们的应用程序,收集指标,了解流量,或者是数据库的状态。有了它,我们就可以很简单的监控应用程序的各种指标数据。

Spring Boot Actuator 使用 http 或者 JMX 的方式来公开运行中的应用程序的操作信息--健康、指标、信息、转储、环境等,我们能够方便的与它互动。只要添加Spring Boot Actuator 依赖到 classpath 中,就有几个指标路径可供我们开箱使用。与大多数 Spring boot 模块一样,我们可以很容易地以多种方式配置或扩展它。

快速入门

要想启用 Spring Boot Actuator,我们只需在软件包管理器中添加 spring-boot-starter-actuator 依赖项。在 pom.xml 文件添加如下代码即可:

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

是吧,很简单就添加好了。有的小朋友可能会有疑问了,为什么没有添加 version 节点呢?那是因为 Spring Bootparent pom 会制定版本号,所以这里无需再次指定了。

Spring Boot 2.x Actuator

2.x 版本中,Spring Boot Actuator 保持了 1.x 的基本操作,但简化了它的模型,扩展了它的能力,并加入了更好的默认值。这个版本变得与技术无关。它还简化了其安全模型,将其与应用程序模型合并。最新版本现在支持CRUD模型,而不是旧的读写模型。

技术支持

2.x 中,Spring Boot Actuator 将其模型定义为可插拔和可扩展的,而不依赖于 MVC。通过这个新的模型,我们能够利用 MVC 以及 WebFlux 作为底层 Web 技术的优势。此外,可以通过实现正确的适配器来添加即将到来的技术。不过 JMX 仍然被支持,无需任何额外的代码就可以暴露路径。

重要变化

与以前的版本不同,Spring Boot Actuator 的大多数路径都是禁用的。默认情况下,只有 /health/info 两个可用。如果我们想启用所有的路径,可以设置 management.endpoints.web.exposure.include=* 来实现。Actuator 现在与常规的 App 安全规则共享安全配置,所以安全模型被大大简化。要调整 Actuator 的安全规则,我们可以只添加一个 /actuator/** 的条目。

@Bean
public SecurityWebFilterChain securityWebFilterChain(
  ServerHttpSecurity http) {
    return http.authorizeExchange()
      .pathMatchers("/actuator/**").permitAll()
      .anyExchange().authenticated()
      .and().build();
}

我们可以在全新的 Actuator 官方文档中找到进一步的细节。另外,在默认情况下,所有的 Actuator 路径现在都被放在 /actuator 路径下。和以前的版本一样,我们可以使用新的属性management.endpoints.web.base-path 来调整这个路径。

预定义的路径

让我们看看一些可用的路径,其中大部分在1.x中已经可用。另外,有些路径被添加了,有些被删除了,有些被重组了。

  • /auditevents 列出了安全审计相关的事件,如用户登录/注销。此外,我们还可以通过本金或类型以及其他字段进行过滤。
  • /beans 返回我们BeanFactory中所有可用的bean。与/auditevents不同,它不支持过滤。
  • /conditions,以前被称为/autoconfig,围绕自动配置建立一个条件报告。
  • /configprops 允许我们获取所有@ConfigurationProperties。
  • /env 返回当前的环境属性。此外,我们还可以检索单个属性。
  • /flyway 提供了关于我们Flyway数据库迁移的细节。
  • /health 总结了我们应用程序的健康状态。
  • /heapdump 构建并返回我们应用程序使用的 JVM 的堆存储。
  • /info 返回一般信息。它可能是自定义数据、构建信息或关于最新提交的细节。
  • /liquibase 的行为类似于/flyway,但针对Liquibase。
  • /logfile 返回普通的应用程序日志。
  • /loggers 使我们能够查询和修改我们应用程序的日志级别。
  • /metrics 详细说明我们应用程序的指标。这可能包括通用指标和自定义指标。
  • /prometheus 返回与前面一样的指标,但格式化为与Prometheus服务器一起工作。
  • /scheduledtasks 提供了关于我们应用程序中每个计划任务的细节。
  • /sessions 列出HTTP会话,因为我们使用的是Spring Session。
  • /shutdown 执行应用程序的优雅关闭。
  • /threaddump 转储底层JVM的线程信息。

执行器路径的超媒体

Spring Boot 增加了一个所有路径的集合入口,可以返回所有可用的执行器路径的链接。这将有助于发现执行器路径及其相应的URL。默认情况下,这个集合入口可以通过 /actuator 路径访问。因此,如果我们向这个URL发送一个GET请求,它将返回各种路径的执行器链接。

{
  "_links": {
    "self": {
      "href": "http://localhost:8080/actuator",
      "templated": false
    },
    "features-arg0": {
      "href": "http://localhost:8080/actuator/features/{arg0}",
      "templated": true
    },
    "features": {
      "href": "http://localhost:8080/actuator/features",
      "templated": false
    },
    "beans": {
      "href": "http://localhost:8080/actuator/beans",
      "templated": false
    },
    "caches-cache": {
      "href": "http://localhost:8080/actuator/caches/{cache}",
      "templated": true
    },
    // ...
}

如上所示,/actuator 路径在 _links 字段下报告所有可用的执行器路径。如果我们配置了一个自定义的管理基础路径,那么我们应该能使用该集合入口发现URL。例如,如果我们将management.endpoints.web.base-path 设置为 /mgmt ,那么我们应该向 /mgmt 路径发送请求,以查看链接列表。但是如果当管理集合入口被设置为 / 时,集合入口被禁用,以防止与其他映射发生冲突的可能性。

健康指示器

就像以前的版本一样,我们可以很容易地添加自定义指标。与其他 API 相反,用于创建自定义健康路径的抽象概念保持不变。然而,一个新的接口,即 ReactiveHealthIndicator,已经被添加到实现反应式健康检查。让我们来看看一个简单的自定义反应式健康检查。

@Component
public class DownstreamServiceHealthIndicator implements ReactiveHealthIndicator {
    @Override
    public Mono< Health > health() {
        return checkDownstreamServiceHealth().onErrorResume(
          ex - > Mono.just(new Health.Builder().down(ex).build())
        );
    }
    private Mono< Health > checkDownstreamServiceHealth() {
        return Mono.just(new Health.Builder().up().build());
    }
}

健康指标的一个方便的特点是,我们可以把它们作为一个层次结构的一部分进行汇总。因此,按照前面的例子,我们可以把所有的下游服务归入一个下游服务类别。只要每个嵌套的服务都是可以到达的,这个类别就会是健康的。

健康组

Spring Boot 2.2 开始,我们可以将健康指标组织成组,并对所有组员应用相同的配置。例如,我们可以通过在 application.properties 中添加以下内容来创建一个名为 custom 的健康组。

management.endpoint.health.group.custom.include=diskSpace,ping

这样,自定义组包含 diskSpaceping 健康指标。现在,如果我们调用 /actuator/health 路径,它将在 JSON 响应中告诉我们关于新的健康组。

{"status":"UP","groups":["custom"]}

通过健康组,我们可以看到一些健康指标的汇总结果。在这种情况下,如果我们向 /actuator/health/custom 发送一个请求,

{"status": "UP"}

我们可以通过 application.properties 来配置该组,以显示更多细节。

management.endpoint.health.group.custom.show-components=always
management.endpoint.health.group.custom.show-details=always

现在,如果我们向 /actuator/health/custom 发送同样的请求,我们会看到更多的细节。

{
  "status": "UP",
  "components": {
    "diskSpace": {
      "status": "UP",
      "details": {
        "total": 499963170816,
        "free": 91300069376,
        "threshold": 10485760
      }
    },
    "ping": {
      "status": "UP"
    }
  }
}

也可以只为授权用户显示这些细节。

management.endpoint.health.group.custom.show-components=when_authorized
management.endpoint.health.group.custom.show-details=when_authorized

我们还可以有一个自定义的状态映射。例如,它可以不返回 HTTP 200 OK 响应,而是返回 207 状态代码。

management.endpoint.health.group.custom.status.http-mapping.up=207

在这里,我们要告诉 Spring Boot,如果自定义组的状态是 UP,就返回 207 的 HTTP 状态代码。

Spring Boot 2中的度量

Spring Boot 2.0 中,内部指标被 Micrometer 支持所取代,因此我们可以预期会有一些变化。如果我们的应用程序正在使用 GaugeService 或 CounterService 等度量衡服务,它们将不再可用。

相反,我们要与 Micrometer 直接互动。在 Spring Boot 2.0 中,我们会得到一个自动配置的 MeterRegistry 类型的 bean。此外,Micrometer 现在是 Actuator 依赖的一部分,所以只要 Actuator 的依赖在 classpath 中,我们就应该可以使用了。此外,我们将从 /metrics 端点得到一个全新的响应。

{
  "names": [
    "jvm.gc.pause",
    "jvm.buffer.memory.used",
    "jvm.memory.used",
    "jvm.buffer.count",
    // ...
  ]
}

正如我们所看到的,没有像我们在1.x中得到的实际度量。为了得到一个特定指标的实际值,我们现在可以导航到所需的指标,例如,/actuator/metrics/jvm.gc.pause,然后得到一个详细的响应。

{
  "name": "jvm.gc.pause",
  "measurements": [
    {
      "statistic": "Count",
      "value": 3.0
    },
    {
      "statistic": "TotalTime",
      "value": 7.9E7
    },
    {
      "statistic": "Max",
      "value": 7.9E7
    }
  ],
  "availableTags": [
    {
      "tag": "cause",
      "values": [
        "Metadata GC Threshold",
        "Allocation Failure"
      ]
    },
    {
      "tag": "action",
      "values": [
        "end of minor GC",
        "end of major GC"
      ]
    }
  ]
}

现在的度量标准要彻底得多,不仅包括不同的值,还包括一些相关的元数据。

创建一个自定义路径

正如我们之前指出的,我们可以创建自定义路径。不过,Spring Boot 2重新设计了实现的方式,以支持新的技术无关的范式。让我们创建一个Actuator路径,在我们的应用程序中查询、启用和禁用功能标志。

@Component
@Endpoint(id = "features")
public class FeaturesEndpoint {
    private Map< String, Feature > features = new ConcurrentHashMap<  >();
    @ReadOperation
    public Map< String, Feature > features() {
        return features;
    }
    @ReadOperation
    public Feature feature(@Selector String name) {
        return features.get(name);
    }
    @WriteOperation
    public void configureFeature(@Selector String name, Feature feature) {
        features.put(name, feature);
    }
    @DeleteOperation
    public void deleteFeature(@Selector String name) {
        features.remove(name);
    }
    public static class Feature {
        private Boolean enabled;
        // [...] getters and setters 
    }
}

为了获得路径,我们需要一个Bean。在我们的例子中,我们使用@Component来做这个。同时,我们需要用@Endpoint来装饰这个Bean。我们的端点的路径是由@Endpoint的id参数决定的。在我们的例子中,它将把请求路由到/actuator/features。一旦准备就绪,我们就可以开始使用定义操作了。

  • @ReadOperation。它将映射到HTTP GET。
  • @WriteOperation。它将映射到HTTP POST。
  • @DeleteOperation。它将映射到HTTP DELETE。

当我们在应用程序中使用前一个端点运行应用程序时,Spring Boot将注册它。验证这一点的一个快速方法是检查日志。

扩展现有的端点

想象一下,如果我们想确保应用程序的生产实例永远不是SNAPSHOT版本。我们决定通过改变返回该信息的 Actuator 端点的HTTP状态代码,即/info来做到这一点。如果我们的应用程序碰巧是SNAPSHOT,我们会得到一个不同的HTTP状态代码。

我们可以使用 @EndpointExtension 注解,或其更具体的特殊化@EndpointWebExtension或@EndpointJmxExtension,轻松地扩展预定义端点的行为。

@Component
@EndpointWebExtension(endpoint = InfoEndpoint.class)
public class InfoWebEndpointExtension {
    private InfoEndpoint delegate;
    @ReadOperation
    public WebEndpointResponse< Map > info() {
        Map< String, Object > info = this.delegate.info();
        Integer status = getStatus(info);
        return new WebEndpointResponse<  >(info, status);
    }
    private Integer getStatus(Map< String, Object > info) {
        return 200;
    }
}

启用所有端点

为了能够使用 HTTP 访问 Actuator 的端点,我们需要启用和公开它们。默认情况下,除了/shutdown,所有的端点都是启用的。默认情况下,只有/health和/info这两个端点是公开的。我们需要添加以下配置来公开所有端点。

management.endpoints.web.exposure.include=*

要明确地启用一个特定的端点(例如,/shutdown)

management.endpoint.shutdown.enabled=true

要公开所有已启用的端点,除了一个(例如,/loggers)

management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=loggers

总结

在这篇文章中,我们谈到了Spring Boot Actuator。我们首先解释了Actuator的含义以及它为我们做了什么。接下来,我们重点讨论了当前Spring Boot 2.x版本的Actuator,讨论了如何使用它、调整它和扩展它。我们还谈到了在这个新的迭代中我们可以发现的重要的安全变化。我们讨论了一些流行的端点,以及它们是如何变化的。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4556

    浏览量

    66784
  • 应用程序
    +关注

    关注

    37

    文章

    3136

    浏览量

    56400
  • 软件包
    +关注

    关注

    0

    文章

    90

    浏览量

    11320
  • SpringBoot
    +关注

    关注

    0

    文章

    172

    浏览量

    106
收藏 人收藏

    评论

    相关推荐

    Spring Boot中Docker的入门指南(一)

    许多人使用容器来包装他们的 Spring Boot 应用程序,而构建容器并不是一件简单的事情。这是针对 Spring Boot 应用程序开发人员的指南,容器对于开发人员来说并不总是一个
    的头像 发表于 06-28 15:54 2417次阅读

    Spring boot中Redis的使用

    【本人秃顶程序员】springboot专辑:Spring boot中Redis的使用
    发表于 03-27 11:42

    启动Spring Boot项目应用的三种方法

    的文件。那么我们可以直接用java命令启动:java -jar girl-0.0.1-SNAPSHOT.jar。最后说下使用spring boot的好处呢?spring boot带给我
    发表于 01-14 17:33

    Spring Boot嵌入式Web容器原理是什么

    Spring Boot嵌入式Web容器原理Spring Boot的目标是构建“非常容易创建、独立、产品级别的基于Spring的应用”。这些应
    发表于 12-16 07:57

    spring快速入门教程

    Spring 快速入门教程──开发你的第一个Spring程序本章学习用struts MVC框架作前端,Spring做中间层,Hibernat
    发表于 09-11 11:07 34次下载
    <b class='flag-5'>spring</b><b class='flag-5'>快速</b><b class='flag-5'>入门</b>教程

    spring boot入门

    运行应用:mvn spring-boot:run或在IDE中运行main()方法,在浏览器中访问http://localhost:8080,Hello World!就出现在了页面中。只用了区区十几行Java代码,一个Hello World应用就可以正确运行了,那么这段代码究竟做了什么呢?
    发表于 11-25 09:57 2606次阅读

    Spring Boot从零入门1 详述

    在开始学习Spring Boot之前,我之前从未接触过Spring相关的项目,Java基础还是几年前自学的,现在估计也忘得差不多了吧,写Spring
    的头像 发表于 12-10 22:18 419次阅读

    Spring Boot特有的实践

    Spring Boot是最流行的用于开发微服务的Java框架。在本文中,我将与你分享自2016年以来我在专业开发中使用Spring Boot所采用的最佳实践。这些内容是基于我的个人经验
    的头像 发表于 09-29 10:24 646次阅读

    强大的Spring Boot 3.0要来了

    来源:OSC开源社区(ID:oschina2013) Spring Boot 3.0 首个 RC 已发布,此外还为两个分支发布了更新:2.7.5 2.6.13。 3.0.0-RC1: https
    的头像 发表于 10-31 11:17 1176次阅读

    怎样使用Kiuwan保护Spring Boot应用程序呢?

    Spring Boot 提供了快速轻松地构建基于Spring 的应用程序所需的工具、功能和依赖项。
    的头像 发表于 03-16 09:10 532次阅读

    如何通过IDEA快速建立一个Spring Boot项目

    在说Spring Boot之前先要了解Spring,那么Spring是什么呢?Spring 框架是一个分层的、面向切面的Java应用程序的一
    的头像 发表于 03-17 15:00 816次阅读
    如何通过IDEA<b class='flag-5'>快速</b>建立一个<b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>项目

    Spring Boot Web相关的基础知识

    上一篇文章我们已经学会了如何通过IDEA快速建立一个Spring Boot项目,还介绍了Spring Boot项目的结构,介绍了项目配置文件
    的头像 发表于 03-17 15:03 462次阅读

    Spring Boot启动 Eureka流程

    在上篇中已经说过了 Eureka-Server 本质上是一个 web 应用的项目,今天就来看看 Spring Boot 是怎么启动 Eureka 的。 Spring Boot 启动 E
    的头像 发表于 10-10 11:40 422次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>启动 Eureka流程

    Spring Boot的启动原理

    可能很多初学者会比较困惑,Spring Boot 是如何做到将应用代码和所有的依赖打包成一个独立的 Jar 包,因为传统的 Java 项目打包成 Jar 包之后,需要通过 -classpath 属性
    的头像 发表于 10-13 11:44 372次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>的启动原理

    Spring Boot 的设计目标

    什么是Spring Boot Spring BootSpring 开源组织下的一个子项目,也是 S
    的头像 发表于 10-13 14:56 313次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> 的设计目标