Spring Boot Actuator 是 Spring Boot 自带的一个功用模块,供给了一组已经开箱即用的出产环境下常用的特性和服务,比如运用程序的健康检查、信息露出、衡量搜集、日志记录等。在实践项目中,Actuator 能够协助咱们快速了解运用程序的运转状况和性能瓶颈。

1. Actuator 的入门及装备

1.1 安装和运用 Actuator

咱们能够经过 Maven 或 Gradle 将 Actuator 增加到咱们的 Spring Boot 运用程序中。Maven 的依靠如下:

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

Gradle 的依靠如下:

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

增加依靠后,咱们只需求发动咱们的运用程序即可开始运用 Actuator。默许情况下,Actuator 会向运用程序露出以下 URI:

  • /actuator/auditevents:显现当时装备的审阅事情信息
  • /actuator/beans:显现运用程序中一切 Bean 的完好称号列表
  • /actuator/conditions:显现主动装备类及其运用情况的信息
  • /actuator/configprops:显现一切 Spring Boot 装备文件及其对应值的详细信息
  • /actuator/env:显现运用程序当时环境变量和特点的详细信息
  • /actuator/flyway:显现 Flyway 数据库搬迁信息的详细信息
  • /actuator/health:显现运用程序的健康状况
  • /actuator/info:显现运用程序相关信息
  • /actuator/mappings:显现 Spring MVC 控制器映射的详细信息
  • /actuator/metrics:显现各种 JVM 目标、计数器和衡量数据的详细信息
  • /actuator/prometheus:将目标露出为 Prometheus 格式,以便在 Grafana 或其他监控体系中运用
  • /actuator/scheduledtasks:显现运用程序中一切调度使命的详细信息
  • /actuator/sessions:答应检查和失效会话 ID
  • /actuator/shutdown:封闭运用程序(需求参加 actuator/shutdown 装备)

1.2 Actuator 的根本装备

Actuator 默许是敞开的,并露出一切端点,咱们乃至能够在浏览器中直接拜访上面说到的 URI。但是,在出产环境中,咱们通常不期望一切端点都对外露出。这时,咱们需求对 Actuator 进行一些装备。

application.propertiesapplication.yml 文件中增加如下装备:

# 封闭详细某个端点,格式为management.endpoint.<id>.enabled=false
management.endpoint.shutdown.enabled=true
# 敞开一切端点的基础功用,格式为management.endpoints.<id>.<option-name>
management.endpoints.web.exposure.include=*

上述装备将封闭 shutdown 端点,并开放一切端点。除了以上参量,还能够经过 management.server.port 装备 Actuator 的 HTTP 端口和 management.server.ssl 装备 SSL。

2. Actuator 的端点

Actuator 中各个端点描述如下:

2.1 /actuator/health

该端点供给有关运用程序健康状况的详细信息。经过检查数据库、缓存、音讯代理等检查资源的状况,Health Indicators 能够确定运用程序是否正常运转。默许情况下,该端点显现以下信息:

{
    "status": "UP"
}

假如运用程序是正常运转的,它会回来 UP,否则将回来 DOWN,并向用户供给有关错误的详细信息。

2.2 /actuator/info

该端点展现与运用程序相关的任何附加信息。如:版本,构建时刻等。在运用程序拜访时,回来一个自定义 JSON 格式的呼应。能够经过在 application.ymlapplication.properties 文件中增加键值对来定制信息。

例如:

info.app.name=My Application
info.app.description=A demo application
info.app.version=1.0.0

拜访该端点,将回来如下呼应:

{
    "app": {
        "description": "A demo application",
        "name": "My Application",
        "version": "1.0.0"
    }
}

2.3 /actuator/metrics

该端点供给了能够搜集和监控的衡量目标的详细信息。Spring Boot 供给了一些默许的衡量目标,如体系 CPU 运用率、内存运用情况、HTTP 恳求推迟等。此外,Spring Boot 还支撑运用 Micrometer 框架创立自定义的衡量目标。

/actuator/metrics 端点下,有许多子途径,每个子途径中包括一些衡量项。例如,咱们能够检查 Tomcat 正在监听的连接数和活动线程数等:

{
    "connections": {
        "active": 13,
        "max": 1000,
        "total": 29
    },
    "threads": {
        "daemon": 7,
        "total": 22
    }
}

2.4 /actuator/beans

该端点供给了运用程序一切 Bean 的完好列表,包括它们的相关信息。需求注意的是,Actuator 只显现由 Spring IOC 容器办理的 Bean 信息。

2.5 /actuator/env

该端点展现运用程序当时环境变量和特点的详细信息。能够运用 /actuator/env/<key> 端点获取指定 key 的值,也能够经过 POST 恳求,修改或增加特点。

2.6 /actuator/mappings

该端点供给了一切 Spring MVC 控制器映射的详细信息,包括恳求 URL、处理器办法、HTTP 办法等等,并依照优先级递减的次序进行排序。例如,如下代码:

@RestController
@RequestMapping("/hello")
public class HelloController {
    @GetMapping("/world")
    public String greeting() {
        return "Hello, world!";
    }
}

拜访 /actuator/mappings ,将回来:

{
    "contexts": {
        "application": {
            "mappings": {
                "dispatcherServlets": {
                    "dispatcherServlet": {
                        "mvcHandlerMappings": {
                            "/hello": {
                                "methods": [],
                                "params": {},
                                "headers": {},
                                "consumes": [],
                                "produces": [],
                                "custom": {}
                            },
                            "/hello/world": {
                                "bean": "helloController",
                                "method": "greeting",
                                "beanType": "com.example.demo.HelloController",
                                "args": [],
                                "responseDetails": {
                                    "status": 200,
                                    "headers": {},
                                    "content": {
                                        "id": "1",
                                        "name": "Tom"
                                    }
                                },
                                "methods": [
                                    "GET"
                                ],
                                "params": {},
                                "headers": {},
                                "consumes": [],
                                "produces": [],
                                "custom": {}
                            },
                            ...
                        }
                    }
                }
            }
        }
    }
}

2.7 /actuator/auditevents

该端点供给了一切 Spring Boot 运用程序所执行的审阅事情的详细信息,包括事情称号、类型、时刻戳和调用者等。此外,还支撑经过 Spring Security 的安全审阅事情等。

2.8 /actuator/flyway

该端点展现 Flyway 数据库搬迁信息的详细信息,包括已运用搬迁的版本和状况等。

2.9 /actuator/scheduledtasks

该端点展现运用程序中一切调度使命的详细信息。

2.10 /actuator/sessions

该端点答应检查和失效会话 ID。

3. 自定义 Actuator 端点

除了运用 Actuator 默许端点之外,咱们还能够根据自己的事务需求自定义 Actuator 端点。

3.1 编写自定义 Endpoints

自定义 Actuator 端点需求完结 Endpoint 接口,并重写 getId()invoke() 办法。例如,以下代码完结了一个名为 MyEndpoint 的自定义端点:

@Component
public class MyEndpoint implements Endpoint<Map<String, Object>> {
    @Override
    public String getId() {
        return "my-endpoint";
    }
    @Override
    public Map<String, Object> invoke() {
        Map<String, Object> result = new HashMap<>();
        result.put("name", "My name is Actuator");
        return result;
    }
}

3.2 露出自定义 Endpoints

完结自定义 Endpoints 后,咱们需求经过设置来揭露它们。在 application.yml 中增加以下内容:

management:
  endpoints:
    web:
      exposure:
        include: my-endpoint

这将答应咱们经过拜访 /actuator/my-endpoint 端点来检查自定义的端点信息。

4. Actuator 的监控和办理功用

4.1 装备衡量目标

Actuator 供给了很多衡量目标,但默许只包括一些 JVM 层面的目标。假如咱们需求检测自己运用程序的衡量目标,那么能够运用 Micrometer 库来协助咱们完结。它是一个跨衡量体系和时刻序列数据库的工具库,支撑多种后端存储如 Prometheus、Graphite 和 InfluxDB。运用 Micrometer,咱们能够在 Actuator 中创立自定义衡量目标:

import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.stereotype.Component;
@Component
public class CustomMetrics {
    private final MeterRegistry meterRegistry;
    private final Counter requestsCounter;
    public CustomMetrics(MeterRegistry meterRegistry) {
        this.meterRegistry = meterRegistry;
        this.requestsCounter = Counter.builder("custom_requests_counter")
                .description("A counter for counting custom requests.")
                .register(meterRegistry);
    }
    public void incrementRequests() {
        requestsCounter.increment();
    }
}

在上述代码中,咱们创立了一个名为 CustomMetrics 的类,它是一个 Spring bean,并运用 MeterRegistry 注册了一个名为 custom_requests_counter 的衡量计数器。此外,还定义了一个 incrementRequests() 办法,以便咱们能够在代码中增加恳求计数器。咱们还能够增加其他类型的目标,如 GaugeTimerDistributionSummary

4.2 监控和办理运用程序

Actuator 还供给了一些有用的监控和办理功用,让咱们能够更方便地盯梢和办理运用程序。

4.2.1 健康检查

Actuator 的 /actuator/health 端点供给了运用程序的健康状况,咱们能够经过检查该端点来确定运用程序是否正常运转。假如运用程序出现毛病,该端点将显现 DOWN 状况,并供给有关错误的详细信息。

4.2.2 人物和权限

Actuator 支撑根据人物的拜访控制,能够约束某些用户或组的拜访。能够经过设置 management.endpoint.<id>.roles 特点装备端点的人物。例如,以下代码将 /actuator/shutdown 端点约束为 ADMIN 人物:

management.endpoint.shutdown.roles=ADMIN

4.2.3 外部装备

Actuator 能够经过外部装备文件进行装备。能够在外部装备文件中设置以下键来控制 Actuator 的行为:

  • management.endpoints.enabled-by-default:是否启用一切端点(默许为 true)
  • management.endpoints.jmx.exposure.exclude:要扫除的端点 JMX MBean 称号
  • management.endpoint.<id>.enabled:指定是否启用特定端点
  • management.endpoint.<id>.sensitive:指定特定端点是否包括敏感信息

4.2.4 采样周期

Actuator 还支撑将某些端点的采样周期设置为非默许值,以在必定时刻距离内定期轮询信息。能够经过 management.endpoint.<id>.time-to-live 特点装备采样周期。例如,以下代码将 /actuator/metrics 端点的采样周期设置为 30 秒:

management.endpoint.metrics.time-to-live=30s

5. Actuator 的安全维护

在出产环境中,Actuator 的安全维护非常重要。Actuator 支撑根据 Spring Security 的安全维护,能够运用 Spring Security 装备来授权 Actuator 端点的拜访。

5.1 增加 Spring Security 依靠

要运用 Spring Security,咱们需求在项目中增加以下 Maven 依靠:

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

5.2 装备 Spring Security

完结依靠增加后,咱们需求装备 Spring Security,以维护 Actuator 端点。以下是一个简略的 Spring Security 装备示例:

@Configuration
@EnableWebSecurity
public class ActuatorSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .requestMatchers(EndpointRequest.to("health", "info")).permitAll()
            .requestMatchers(EndpointRequest.toAnyEndpoint()).hasRole("ACTUATOR")
            .and().httpBasic();
    }
}

在上述代码中,咱们创立了一个名为 ActuatorSecurityConfig 的 Spring Security 装备类,并装备了 /actuator/health/actuator/info 端点的揭露拜访权限。对于其他端点,则需求用户具有 ACTUATOR 人物才干拜访。此外,还启用了 HTTP 根本身份验证,以便在调用受维护的端点时要求用户进行身份验证。

5.3 增加用户和人物

完结 Spring Security 装备后,咱们还需求为 Actuator 增加用户和人物。能够经过在 application.propertiesapplication.yml 文件中设置以下键来装备用户名、密码和人物:

spring.security.user.name=actuator
spring.security.user.password=actuator-password
spring.security.user.roles=ACTUATOR

在上述装备中,咱们创立了一个名为 actuator、密码为 actuator-password,且具有 ACTUATOR 人物的用户。