SpringBootActuator介绍-SpringBoot教程深⼊浅出系列
其他教程
1. 概述
在本⽂中,我们介绍了 Spring Boot Actuator。我们将⾸先介绍基础知识,然后详细讨论 Spring Boot 2.x 与 1.x 中可⽤的内容。
我们将学习如何在 Spring Boot 2.x 和 WebFlux 中使⽤、配置和扩展这个监控⼯具,利⽤反应式编程模型。然后我们将讨论如何使⽤ Boot 1.x 执⾏相同的操作。
Spring Boot Actuator ⾃ 2014 年 4 ⽉起与第⼀个 Spring Boot 版本⼀起可⽤。随Spring Boot 2的发布的Actuator 进⾏了重新设计,并添加了令⼈兴奋的新端点。
我们将本指南分为三个主要部分:
什么是Actuator ?
Spring Boot 2.x Actuator
Spring Boot 1.x Actuator
2. 什么是Actuator ?
本质上,Actuator 为我们的应⽤程序带来了⽣产就绪的特性。
由于这种依赖关系,监控我们的应⽤程序、收集指标、了解流量或我们的数据库状态变得微不⾜道。
这个库的主要好处是我们可以获得⽣产级⼯具,⽽⽆需⾃⼰实际实现这些功能。
Actuator 主要⽤于公开有关正在运⾏的应⽤程序的操作信息——健康、指标、信息、转储、环境等。它使⽤ HTTP 端点或 JMX bean 使我们能够与其交互。
⼀旦这种依赖关系在类路径上,我们就可以开箱即⽤的这些端点。与⼤多数 Spring 模块⼀样,我们可以通过多种⽅式轻松配置或扩展它。
2.1. ⼊门
要启⽤ Spring Boot Actuator,我们只需要将spring-boot-actuator依赖项添加到我们的包管理器中。
在 Maven 中:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
请注意,⽆论 Boot 版本如何,这仍然有效,因为 Spring Boot的BOM中指定了版本。
3. Spring Boot 2.x Actuator
在 2.x 中,Actuator 保留了它的基本意图,但简化了它的模型,扩展了它的功能,并合并了更好的默认值。
⾸先,这个版本变得与技术⽆关。它还通过将其与应⽤程序合并来简化其安全模型。
在各种变化中,重要的是要记住HTTP 请求和响应以及 Java API。
最后最新版本现在⽀持 CRUD 模型,⽽不是旧的读/写模型。
3.1. 技术⽀持
在第⼆个主要版本中,Actuator 现在与某些技术栈⽆关,⽐如在 1.x 中,它与 MVC 相关联,因此与 Servlet API 相关联。
在 2.x 中,Actuator 将其模型定义为可插拔和可扩展,⽽⽆需为此依赖 MVC。
因此,通过这个新模型,我们能够利⽤ MVC 和 WebFlux 作为底层 Web 技术。
此外,可以通过实施正确的适配器来添加即将到来的技术。
最后,JMX 仍然⽀持公开端点,⽽⽆需任何额外代码。
3.2. 重要变化
与以前的版本不同,Actuator 禁⽤了⼤多数端点。
因此,默认情况下仅有的两个可⽤是/health和/info。
如果我们想启⽤所有这些,我们可以设置posure.include=*。或者我们可以列出应该启⽤的端点。Actuator 现在与常规 App 安全规则共享安全配置,因此安全模型显⽰得更加简化了。
要调整 Actuator 安全规则,我们只需为/actuator/**添加⼀个条⽬:
@Bean
public SecurityWebFilterChain securityWebFilterChain(
ServerHttpSecurity http) {
return http.authorizeExchange()
.pathMatchers("/actuator/**").permitAll()
.anyExchange().authenticated()
.and().build();
}
我们可以在到更多详细信息。
此外默认情况下,所有 Actuator 端点现在都放在/actuator path 下。
与之前的版本⼀样,我们可以使⽤新的属性dpoints.web.base-path调整此路径。
3.3. 预定义端点
让我们来看看⼀些可⽤的端点,其中⼤部分已经在 1.x 中可⽤。
此外,还添加了⼀些端点,删除了⼀些端点,重组了⼀些端点:
/auditevents列出与安全审计相关的事件,例如⽤户登录/注销。此外,我们可以在其他字段中按主体或类型进⾏过滤。
/beans返回BeanFactory 中所有可⽤的 bean 。与/auditevents不同,它不⽀持过滤。
/conditions,以前称为 / autoconfig,围绕⾃动配置构建条件报告。
/configprops允许我们获取所有@ConfigurationProperties bean。
/env返回当前环境属性。此外,我们可以检索单个属性。
/flyway提供有关我们的 Flyway 数据库迁移的详细信息。
/health总结了我们应⽤程序的健康状态。
/heapdump从我们的应⽤程序使⽤的 JVM 构建并返回堆转储。
/info返回⼀般信息。它可能是⾃定义数据、构建信息或有关最新提交的详细信息。
/liquibase 的⾏为类似于/ flyway 但对于 Liquibase。
/logfile返回普通应⽤程序⽇志。
/loggers使我们能够查询和修改应⽤程序的⽇志记录级别。
/metrics详细说明了我们应⽤程序的指标。这可能包括通⽤指标和⾃定义指标。
/prometheus返回与前⼀个类似的指标,但格式化为与 Prometheus 服务器⼀起使⽤。
/scheduledtasks提供有关我们应⽤程序中每个计划任务的详细信息。
/sessions列出了我们使⽤ Spring Session 的 HTTP 会话。
/shutdown执⾏应⽤程序的正常关闭。
/threaddump转储底层 JVM 的线程信息。
3.4. Actuator⼊⼝端点
Spring Boot 添加了⼀个发现端点,该端点返回指向所有可⽤Actuator 端点的链接。这将有助于发现Actuator 端点及其相应的 URL。默认情况下,此发现端点可通过/actuator 端点访问。
因此,如果我们向此 URL发送GET 请求,它将返回各个端点的Actuator 链接:
{
"_links": {
"self": {
"href": "localhost:8080/actuator",
"templated": false
},
"features-arg0": {
"href": "localhost:8080/actuator/features/{arg0}",
"templated": true
},
"features": {
"href": "localhost:8080/actuator/features",
"templated": false
},
"beans": {
"href": "localhost:8080/actuator/beans",
"templated": false
},
"caches-cache": {
"href": "localhost:8080/actuator/caches/{cache}",
"templated": true
},
// truncated
}
如上所⽰,/actuator 端点在_links 字段下报告所有可⽤的Actuator 端点。
此外,如果我们配置⾃定义管理基本路径,那么我们应该使⽤该基本路径作为发现 URL。
例如,如果我们将dpoints.web.base-path 设置为/mgmt,那么我们应该向/mgmt 端点发送请求以查看链接列表。
⾮常有趣的是,当管理基本路径设置为/ 时,发现端点被禁⽤以防⽌与其他映射发⽣冲突的可能性。
3.5. 健康指标
就像在以前的版本中⼀样,我们可以轻松添加⾃定义指标。与其他 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() {
// we could use WebClient to check health reactively
return Mono.just(new Health.Builder().up().build());
}
}
健康指标的⼀个⽅便特性是我们可以将它们聚合为层次结构的⼀部分。
因此,按照前⾯的⽰例,我们可以将所有下游服务归为⼀个下游服务类别。只要每个嵌套服务都可以访问,这个类别就会是健康的。
查看我们关于健康指标的⽂章,以获得更深⼊的了解。
3.6. 健康团体
从 Spring Boot 2.2 开始,我们可以将健康指标组织成组,并将相同的配置应⽤于所有组成员。
例如,我们可以通过将其添加到我们的application.properties来创建⼀个名为custom 的健康组:
这样,⾃定义组包含diskSpace 和ping 健康指标。
现在,如果我们调⽤/actuator/health 端点,它将在 JSON 响应中告诉我们新的健康组:
{"status":"UP","groups":["custom"]}
对于健康组,我们可以看到⼀些健康指标的汇总结果。
在这种情况下,如果我们向/actuator/health/custom发送请求,则:
{"status":"UP"}
我们可以通过application.properties配置组以显⽰更多详细信息:
现在如果我们向/actuator/health/custom发送相同的请求,我们将看到更多详细信息:
{
"status": "UP",
"components": {
"diskSpace": {
"status": "UP",
"details": {
"total": 499963170816,
"free": 91300069376,
"threshold": 10485760
}
},
"ping": {
"status": "UP"
}
}
}
也可以仅为授权⽤户显⽰这些详细信息:
我们还可以⾃定义状态映射。
例如,它可以返回 207 状态代码⽽不是 HTTP 200 OK 响应:
在这⾥,如果⾃定义组状态为UP,我们告诉 Spring Boot 返回 207 HTTP 状态代码。
3.7. Spring Boot 2 中的Metrics
在 Spring Boot 2.0 中,内部指标被 Micrometer ⽀持取代,因此我们可以期待突破性的变化。如果我们的应⽤程序使⽤度量服务,例如GaugeService或CounterService,它们将不再可⽤。
相反,我们应该直接与Micrometer交互。在 Spring Boot 2.0 中,我们会得到⼀个⾃动配置的MeterRegistry类型的 bean 。
此外,Micrometer 现在是 Actuator 依赖项的⼀部分,所以只要 Actuator 依赖项在类路径中,我们就应该很好。
此外,我们将从/metrics端点获得全新的响应:
{
"names": [
"pause",
"used",
"used",
"unt",
// ...
]
}
正如我们所看到的,没有见到了那些我们在 1.x 中得到的实际指标项了。
要获得特定指标的实际值,我们现在可以导航到所需的指标,例如/actuator/pause,并获得详细响应:
{
"name": "pause",
"measurements": [
{
"statistic": "Count",
"value": 3.0
},
{
"statistic": "TotalTime",
"value": 7.9E7
},
springboot结构{
"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"
]
}
]
}
现在指标更加全⾯,不仅包括不同的值,还包括⼀些相关的元数据。
3.8. ⾃定义/info端点
该/info端点保持不变。和以前⼀样,我们可以使⽤各⾃的 Maven 或 Gradle 依赖项添加 git 详细信息:
<dependency>
<groupId>pl.project13.maven</groupId>
<artifactId>git-commit-id-plugin</artifactId>
</dependency>
同样,我们还可以使⽤ Maven 或 Gradle 插件包含构建信息,包括名称、组和版本:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>build-info</goal>
</goals>
</execution>
</executions>
</plugin>
3.9. 创建⾃定义端点
正如我们之前指出的,我们可以创建⾃定义端点。但是,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) {
(name);
}
@WriteOperation
public void configureFeature(@Selector String name, Feature feature) {
features.put(name, feature);
}
@DeleteOperation
public void deleteFeature(@Selector String name) {
}
public static class Feature {
private Boolean enabled;
// [...] getters and setters
}
}
要获取端点,我们需要⼀个 bean。在我们的⽰例中,我们为此使⽤了@Component。此外,我们需
要⽤@Endpoint装饰这个 bean 。我们端点的路径由@Endpoint的id参数决定。在我们的例⼦中,它会将请求路由到/actuator/features。
准备好后,我们可以开始使⽤以下⽅法定义操作:
@ReadOperation:它将映射到 HTTP GET。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。