Spring Boot 执行器:公开操作信息

举报
千锋教育 发表于 2023/08/09 15:03:16 2023/08/09
【摘要】 随着时间的推移,Spring Boot 由于其提供的功能而越来越受欢迎。现在,该框架为各种企业问题和模式提供了解决方案,并且最适合每种需求,它与大量自动配置库/模块捆绑在一起,以减少样板代码并让您专注于业务逻辑。Spring boot Actuator 是 Spring Boot 的流行功能之一,用于创建生产就绪的应用程序。Actuator 公开了一组端点来监视您的应用程序运行状况、查看指标...

随着时间的推移,Spring Boot 由于其提供的功能而越来越受欢迎。现在,该框架为各种企业问题和模式提供了解决方案,并且最适合每种需求,它与大量自动配置库/模块捆绑在一起,以减少样板代码并让您专注于业务逻辑。

Spring boot Actuator 是 Spring Boot 的流行功能之一,用于创建生产就绪的应用程序。Actuator 公开了一组端点来监视您的应用程序运行状况、查看指标、使用 Spring Security 以及您声明应用程序生产就绪所需的许多其他功能来保护它们。

Spring Boot执行器的特点

  1. Spring Boot Actuator 模块允许您通过两种方式监控您的应用程序;通过利用 HTTP 端点或JMX(Java 管理扩展)。大多数应用程序都利用 HTTP 端点。
  2. 端点: Actuator 模块与一组丰富的 HTTP 端点捆绑在一起,用于监视应用程序并与应用程序交互。您甚至可以创建自定义端点来满足您的需求,还可以利用 spring-security 来保护执行器端点。几个例子是
    • 信息
    • 健康
    • 指标
    • 豆子
    • 缓存
    • 伐木工
    • 映射
  3. 指标: Spring Boot Actuator 为名为Micrometer的仪器库提供支持,它是一个供应商中立的应用程序指标外观,可捕获应用程序指标并将其公开给不同的监控解决方案,例如 Prometheus、Dynatrace、New Relic、DataDog 等等...为计时器、仪表、计数器、分布摘要和具有维度数据模型的长任务计时器提供接口。
  4. 执行器模块是高度(但简单)可配置的,您可以利用您的 application.[properties|yaml] 文件来满足您的大多数自定义需求。

让我们构建一个 Spring Boot 应用程序并见证 spring-boot-actuator 的神奇作用......

先决条件:

  1. 您的系统上安装了 Java(推荐 JDK 17),尝试使用SDKMAN来管理您的 JDK 版本。
  2. 具有 starter-web 依赖项的 Spring 项目。
$ curl -G https://start.spring.io/starter.zip \
    -d type=gradle-project \
    -d language=java \
    -d packaging=jar \
    -d javaVersion=17 \
    -d dependencies=web \
    -d name=spring-boot-actuator-example \
    -d baseDir=spring-boot-actuator-example \
    -o starter.zip
$ # You can specify more options using -d option; like groupId, artifactId, packageName
$ unzip starter.zip
$ # Open project in your preferred IDE

将 Spring Boot Actuator 添加到您的应用程序中

在构建配置文件中添加“spring-boot-starter-actuator”依赖项。
对于 Maven 用户:

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

对于 gradle 用户:

implementation 'org.springframework.boot:spring-boot-starter-actuator'

一旦您在类路径中添加启动器-执行器依赖项并重新启动应用程序(重建后),您就可以看到执行器端点已由 Spring Boot 启用。默认情况下,“/actuator”是所有执行器端点的基本路径。

INFO 9143 --- [           main] i.c.s.SpringbootActuatorsApplication     : No active profile set, falling back to 1 default profile: "default"
INFO 9143 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
INFO 9143 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
INFO 9143 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.64]
INFO 9143 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
INFO 9143 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 648 ms
INFO 9143 --- [           main] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 1 endpoint(s) beneath base path '/actuator'
INFO 9143 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
INFO 9143 --- [           main] i.c.s.SpringbootActuatorsApplication     : Started SpringbootActuatorsApplication in 1.271 seconds (JVM running for 1.818)
INFO 9143 --- [on(1)-127.0.0.1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
INFO 9143 --- [on(1)-127.0.0.1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
INFO 9143 --- [on(1)-127.0.0.1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 1 ms

应用程序在端口 8080 上启动,让我们点击“/actuator”端点来查看所有可用的执行器端点...
SpringBoot执行器端点

正如您所观察到的,只有“/actuator/health”端点被暴露,默认情况下,出于安全原因,所有其他端点都被禁用,由于某些执行器端点可以暴露敏感数据,所以要小心...

让我们启用所有端点...通过设置“management.endpoints.web.exposure.include”属性来更新“application.properties”文件

management.endpoints.web.exposure.include=*

“*”模式将启用执行器模块公开的所有端点。但建议公开一组特定的端点(逗号分隔列表),这对于您的操作要求是必要的,以避免任何安全问题。
注意:“关闭”端点仍将被禁用,因为它对您的应用程序非常重要。它用于优雅地关闭您的应用程序。
让我们尝试点击“ http://localhost:8080/actuator ”

{
   "_links" : {
      "beans" : {
         "href" : "http://localhost:8080/actuator/beans",
         "templated" : false
      },
      "caches" : {
         "href" : "http://localhost:8080/actuator/caches",
         "templated" : false
      },
      "caches-cache" : {
         "href" : "http://localhost:8080/actuator/caches/{cache}",
         "templated" : true
      },
      "conditions" : {
         "href" : "http://localhost:8080/actuator/conditions",
         "templated" : false
      },
      "configprops" : {
         "href" : "http://localhost:8080/actuator/configprops",
         "templated" : false
      },
      "configprops-prefix" : {
         "href" : "http://localhost:8080/actuator/configprops/{prefix}",
         "templated" : true
      },
      "env" : {
         "href" : "http://localhost:8080/actuator/env",
         "templated" : false
      },
      "env-toMatch" : {
         "href" : "http://localhost:8080/actuator/env/{toMatch}",
         "templated" : true
      },
      "health" : {
         "href" : "http://localhost:8080/actuator/health",
         "templated" : false
      },
      "health-path" : {
         "href" : "http://localhost:8080/actuator/health/{*path}",
         "templated" : true
      },
      "heapdump" : {
         "href" : "http://localhost:8080/actuator/heapdump",
         "templated" : false
      },
      "info" : {
         "href" : "http://localhost:8080/actuator/info",
         "templated" : false
      },
      "loggers" : {
         "href" : "http://localhost:8080/actuator/loggers",
         "templated" : false
      },
      "loggers-name" : {
         "href" : "http://localhost:8080/actuator/loggers/{name}",
         "templated" : true
      },
      "mappings" : {
         "href" : "http://localhost:8080/actuator/mappings",
         "templated" : false
      },
      "metrics" : {
         "href" : "http://localhost:8080/actuator/metrics",
         "templated" : false
      },
      "metrics-requiredMetricName" : {
         "href" : "http://localhost:8080/actuator/metrics/{requiredMetricName}",
         "templated" : true
      },
      "scheduledtasks" : {
         "href" : "http://localhost:8080/actuator/scheduledtasks",
         "templated" : false
      },
      "self" : {
         "href" : "http://localhost:8080/actuator",
         "templated" : false
      },
      "threaddump" : {
         "href" : "http://localhost:8080/actuator/threaddump",
         "templated" : false
      }
   }
}

请查看此spring 文档,了解每个端点的详细说明。

* application.properties 文件中的一些更多配置:

#1. Update default port for actuator endpoints
management.server.port=2121

#2. Update base-path to use **'/manage'** instead of **'/actuator'**
management.endpoints.web.base-path=/manage

#3. Following will ensure include all actuator endpoints except 'mappings' and 'heapdump'
management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=mappings,heapdump

健康端点

运行状况端点将应用程序的运行状况暴露给外界(使用有用的数据),此端点在分布式系统中变得更加重要,其中一项服务的活性依赖于另一项服务,例如数据库、队列或其他应用程序。
现在,让我们尝试“/actuator/health”端点,并查看响应
/执行器/健康

目前,运行状况端点返回的唯一信息是应用程序是否启动,默认情况下,运行状况端点不会显示所有详细信息。可以通过设置 health.show-details 属性的值来启用(或安全启用)此功能。

management.endpoint.health.show-details=always
# Possible values for health.show-details can be one of the following
# never|always|when_authorized
# by default it is set to 'never', 
# 'always' will display all the details,
# 'when_autorized' will display details when requesting user is authorized.

输出(具有状态和磁盘空间的运行状况端点):
带有显示详细信息的健康端点

请注意,Spring Boot Actuator 模块支持使用以下模式单独更新每个端点的配置。

# Pattern: management.endpoint.{endpoint-name}.{property}=value
# property attribute can vary according to endpoint

management.endpoint.configprops.enabled=true
management.endpoint.info.enabled=false

management.endpoint.beans.cache.time-to-live=10s

management.endpoint.logfile.external-file=~/app.log

信息端点

现在让我们尝试“/actuator/info”端点,看看它返回什么。
/执行器/信息

因此,默认情况下,信息端点不会返回任何有用的信息,您可以通过更新构建配置来自定义信息端点的响应,让我们逐步了解如何在 build.gradle 文件中配置信息端点。
Maven 用户也可以关注这个Spring 官方文档

对于gradle用户,我们首先更新build.gradle文件,添加buildInfo任务,并更新版本值。

description = 'Spring Boot Actuator Configuration App'
version = '2.0.0'

springBoot {
    buildInfo() {
        properties {
            additional = [
                    'lastRelease': '1.0.0',
                    'description': rootProject.description
            ]
        }
    }
}

除了构建信息之外,您还可以在 application.properties 文件中设置其他信息:

management.info.env.enabled=true

app.cusomInfo=This is Custom Info
info.app.cusomInfo=${app.cusomInfo}
info.app.java-version=${java.version}
info.app.java-vendor=${java.vendor}
info.app.excluded-actuator-enpoints=${management.endpoints.web.exposure.exclude}

现在让我们看看“/actuator/info”端点的输出:
/actuator/info 附加信息

您可以观察响应中的所有配置信息。信息端点可以进一步扩展以公开 git 相关信息(如提交 ID、分支)。

最后的话:

正如我们可以通过利用 application.[properties|yaml] 文件观察到的那样,我们可以完全自定义和配置我们的执行器端点以公开有用的信息。在后续文章中,我们将了解如何创建自定义端点,并使用千分尺连接到不同的监控工具。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。