Actuator 端点:Spring Boot 应用监控与管理利器

Actuator 端点:Spring Boot 应用监控与管理利器

各位观众,欢迎来到今天的“码农脱口秀”!今天我们要聊聊 Spring Boot 家族里一位低调却实力非凡的成员——Actuator。 啥?Actuator? 听起来像变形金刚里的某个小角色? 错!它可是个能帮你监控和管理 Spring Boot 应用的超级英雄!

想象一下,你辛辛苦苦开发了一个 Spring Boot 应用,部署上线后,就开始提心吊胆,担心它会不会突然罢工,性能是不是出了问题,内存有没有泄漏。 别慌!有了 Actuator,你就像拥有了一个全天候的监控室,可以随时掌握应用的健康状况,还能远程控制应用的各种功能。

接下来,就让我们一起深入了解一下 Actuator 这个“监控利器”,看看它到底能帮我们做些什么。

Actuator 是什么?

简单来说,Actuator 是 Spring Boot 提供的一组预定义的 HTTP 端点,用于监控和管理 Spring Boot 应用。 通过这些端点,你可以获取应用的健康信息、度量指标、配置信息、日志信息等,还可以执行一些管理操作,比如刷新配置、关闭应用等。

你可以把 Actuator 想象成你家里的智能家居控制面板,通过它你可以查看各个房间的温度、湿度,控制灯光、窗帘,甚至还能远程启动咖啡机。

引入 Actuator

要使用 Actuator,只需要在你的 Spring Boot 项目中添加 spring-boot-starter-actuator 依赖即可。

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

添加依赖后,Spring Boot 会自动配置 Actuator,并暴露一些默认的端点。你可以通过访问这些端点来获取应用的信息。

常用端点一览

Actuator 提供了很多非常有用的端点,下面列举一些常用的端点:

端点 描述
/actuator/health 显示应用的健康状况。
/actuator/info 显示应用的自定义信息,比如版本号、构建时间等。
/actuator/metrics 显示应用的各种度量指标,比如内存使用情况、CPU 使用率、请求响应时间等。
/actuator/loggers 查看和修改应用的日志级别。
/actuator/env 显示应用的配置信息,包括环境变量、系统属性、配置文件等。
/actuator/beans 显示应用中所有的 Spring Bean。
/actuator/mappings 显示应用中所有的请求映射。
/actuator/shutdown 关闭应用(默认禁用,需要手动开启)。
/actuator/threaddump 显示应用的线程转储信息。
/actuator/heapdump 生成应用的堆转储文件。

健康检查:/actuator/health

/actuator/health 端点用于显示应用的健康状况。 它会检查应用依赖的各种组件(比如数据库、消息队列)是否正常工作,并返回一个总体健康状态。

访问 /actuator/health 端点,你会得到类似下面的 JSON 响应:

{
  "status": "UP"
}

status 字段表示应用的健康状态,UP 表示应用正常运行。 如果应用依赖的某个组件出现问题,status 字段可能会变成 DOWN,同时还会提供更详细的错误信息。

你还可以自定义健康检查逻辑,通过实现 HealthIndicator 接口,你可以添加自己的健康检查项。

import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;

@Component
public class MyHealthIndicator implements HealthIndicator {

    @Override
    public Health health() {
        int errorCode = check(); // 执行自定义检查逻辑
        if (errorCode != 0) {
            return Health.down().withDetail("Error Code", errorCode).build();
        }
        return Health.up().build();
    }

    private int check() {
        // 在这里编写你的健康检查逻辑
        // 比如检查某个文件是否存在,或者检查某个服务的可用性
        // 如果一切正常,返回 0,否则返回一个错误码
        return 0;
    }
}

上面的代码定义了一个名为 MyHealthIndicator 的健康检查器,它实现了 HealthIndicator 接口。 health() 方法是健康检查的入口,它会调用 check() 方法执行自定义的检查逻辑,并根据检查结果返回一个 Health 对象。

应用信息:/actuator/info

/actuator/info 端点用于显示应用的自定义信息,比如版本号、构建时间等。 你可以在 application.propertiesapplication.yml 文件中配置这些信息。

info.app.name=My Awesome App
info.app.version=1.0.0
info.app.description=A simple Spring Boot application

配置完成后,访问 /actuator/info 端点,你会得到类似下面的 JSON 响应:

{
  "app": {
    "name": "My Awesome App",
    "version": "1.0.0",
    "description": "A simple Spring Boot application"
  }
}

你还可以通过实现 InfoContributor 接口,以编程方式添加应用信息。

import org.springframework.boot.actuate.info.Info;
import org.springframework.boot.actuate.info.InfoContributor;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

@Component
public class MyInfoContributor implements InfoContributor {

    @Override
    public void contribute(Info.Builder builder) {
        Map<String, Object> details = new HashMap<>();
        details.put("developers", new String[]{"Alice", "Bob"});
        details.put("license", "Apache 2.0");
        builder.withDetail("my-app", details);
    }
}

上面的代码定义了一个名为 MyInfoContributor 的信息贡献器,它实现了 InfoContributor 接口。 contribute() 方法用于添加应用信息,它接收一个 Info.Builder 对象,你可以使用它来添加各种信息。

度量指标:/actuator/metrics

/actuator/metrics 端点用于显示应用的各种度量指标,比如内存使用情况、CPU 使用率、请求响应时间等。 Actuator 使用 Micrometer 库来收集和暴露这些指标。

访问 /actuator/metrics 端点,你会得到一个包含所有可用指标名称的列表。 你可以通过指定指标名称来获取该指标的详细信息。

例如,要获取 jvm.memory.used 指标的详细信息,可以访问 /actuator/metrics/jvm.memory.used 端点。 你会得到类似下面的 JSON 响应:

{
  "name": "jvm.memory.used",
  "description": "The amount of used memory",
  "baseUnit": "bytes",
  "measurements": [
    {
      "statistic": "VALUE",
      "value": 2.147483648E8
    }
  ],
  "availableTags": []
}

name 字段表示指标的名称,description 字段表示指标的描述,baseUnit 字段表示指标的单位,measurements 字段包含指标的测量值。

你还可以自定义度量指标,通过使用 @Timed 注解或 MeterRegistry 对象,你可以收集自己的业务指标。

import io.micrometer.core.annotation.Timed;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    @Timed("my.service.execution.time")
    public String doSomething() {
        // 模拟耗时操作
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        return "Done!";
    }
}

上面的代码使用 @Timed 注解来标记 doSomething() 方法,Micrometer 会自动收集该方法的执行时间,并将其暴露为 my.service.execution.time 指标。

日志管理:/actuator/loggers

/actuator/loggers 端点用于查看和修改应用的日志级别。 你可以通过访问该端点来获取当前应用的日志配置,还可以动态地修改某个 logger 的日志级别。

访问 /actuator/loggers 端点,你会得到一个包含所有 logger 名称和日志级别的列表。 你可以通过指定 logger 名称来获取该 logger 的详细信息。

例如,要获取 com.example.myapp logger 的详细信息,可以访问 /actuator/loggers/com.example.myapp 端点。 你会得到类似下面的 JSON 响应:

{
  "configuredLevel": null,
  "effectiveLevel": "INFO"
}

configuredLevel 字段表示该 logger 配置的日志级别,effectiveLevel 字段表示该 logger 实际生效的日志级别。 如果 configuredLevelnull,表示该 logger 没有配置日志级别,它会继承父 logger 的日志级别。

你可以通过发送 POST 请求到 /actuator/loggers/{name} 端点来修改 logger 的日志级别。 请求体应该包含一个 configuredLevel 字段,表示要设置的日志级别。

{
  "configuredLevel": "DEBUG"
}

环境信息:/actuator/env

/actuator/env 端点用于显示应用的配置信息,包括环境变量、系统属性、配置文件等。 通过访问该端点,你可以了解应用的运行环境,还可以查看配置文件的内容。

访问 /actuator/env 端点,你会得到一个包含所有配置源和配置属性的列表。 配置源按照优先级排序,优先级高的配置源会覆盖优先级低的配置源。

你可以通过指定配置属性的名称来获取该属性的详细信息。

例如,要获取 spring.datasource.url 属性的详细信息,可以访问 /actuator/env/spring.datasource.url 端点。

注意: 默认情况下,敏感信息(比如数据库密码)会被屏蔽。 你可以通过配置 management.endpoint.env.keys-to-sanitize 属性来指定要屏蔽的配置属性。

Bean 信息:/actuator/beans

/actuator/beans 端点用于显示应用中所有的 Spring Bean。 通过访问该端点,你可以了解应用中所有的 Bean 定义,以及它们的依赖关系。

访问 /actuator/beans 端点,你会得到一个包含所有 Bean 定义的列表。 每个 Bean 定义都包含 Bean 的名称、类型、依赖关系等信息。

请求映射:/actuator/mappings

/actuator/mappings 端点用于显示应用中所有的请求映射。 通过访问该端点,你可以了解应用中所有的 URL 路由,以及它们对应的处理方法。

访问 /actuator/mappings 端点,你会得到一个包含所有请求映射的列表。 每个请求映射都包含 URL 模式、HTTP 方法、处理方法等信息。

关闭应用:/actuator/shutdown

/actuator/shutdown 端点用于关闭应用。 默认情况下,该端点是禁用的,需要手动开启。

要开启 /actuator/shutdown 端点,需要在 application.propertiesapplication.yml 文件中配置 management.endpoint.shutdown.enabled=true

警告: 开启 /actuator/shutdown 端点后,任何人都可以通过访问该端点来关闭应用。 因此,在生产环境中应该谨慎使用该端点,最好是添加安全认证。

线程转储:/actuator/threaddump

/actuator/threaddump 端点用于显示应用的线程转储信息。 线程转储信息可以帮助你诊断应用的性能问题,比如死锁、线程阻塞等。

访问 /actuator/threaddump 端点,你会得到一个包含所有线程信息的文本。 每个线程信息都包含线程的名称、ID、状态、堆栈信息等。

堆转储:/actuator/heapdump

/actuator/heapdump 端点用于生成应用的堆转储文件。 堆转储文件可以帮助你诊断应用的内存问题,比如内存泄漏、内存溢出等。

访问 /actuator/heapdump 端点,你会得到一个堆转储文件,你可以使用专业的工具(比如 MAT)来分析该文件。

注意: 生成堆转储文件会消耗大量的系统资源,因此在生产环境中应该谨慎使用该端点。

安全性

默认情况下,Actuator 端点是公开的,任何人都可以访问。 在生产环境中,为了保证应用的安全性,应该对 Actuator 端点进行安全认证。

你可以使用 Spring Security 来保护 Actuator 端点。 首先,需要在你的项目中添加 spring-boot-starter-security 依赖。

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

然后,你需要配置 Spring Security,指定哪些用户可以访问 Actuator 端点。

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/actuator/**").hasRole("ACTUATOR") // 只有具有 ACTUATOR 角色的用户才能访问 Actuator 端点
                .anyRequest().permitAll()
                .and()
                .httpBasic();
    }
}

上面的代码配置了 Spring Security,只有具有 ACTUATOR 角色的用户才能访问 Actuator 端点。

你还需要配置一个用户,并为其分配 ACTUATOR 角色。 你可以在 application.propertiesapplication.yml 文件中配置用户。

spring.security.user.name=admin
spring.security.user.password=password
spring.security.user.roles=ACTUATOR

配置完成后,访问 Actuator 端点时,需要提供用户名和密码。

自定义端点

除了 Spring Boot 提供的默认端点之外,你还可以自定义端点,以暴露自己的业务信息或执行自己的管理操作。

要自定义端点,你需要创建一个类,并使用 @Endpoint 注解标记它。 然后,你需要定义一个或多个方法,并使用 @ReadOperation@WriteOperation@DeleteOperation 注解标记它们,分别表示读操作、写操作和删除操作。

import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

@Component
@Endpoint(id = "my-endpoint")
public class MyEndpoint {

    @ReadOperation
    public Map<String, String> hello() {
        Map<String, String> result = new HashMap<>();
        result.put("message", "Hello from my endpoint!");
        return result;
    }
}

上面的代码定义了一个名为 MyEndpoint 的自定义端点,它包含一个名为 hello() 的读操作。 你可以通过访问 /actuator/my-endpoint 端点来执行该操作。

小结

Actuator 是 Spring Boot 提供的一组强大的工具,可以帮助你监控和管理 Spring Boot 应用。 通过使用 Actuator,你可以了解应用的健康状况、度量指标、配置信息、日志信息等,还可以执行一些管理操作。

但是,在使用 Actuator 时,需要注意安全性,避免敏感信息泄露。 另外,应该谨慎使用一些具有破坏性的端点,比如 /actuator/shutdown

希望今天的“码农脱口秀”能帮助你更好地了解 Actuator。 记住,Actuator 是你的得力助手,它可以让你更好地掌控你的 Spring Boot 应用。

最后,送给大家一句至理名言:“代码虐我千百遍,我待代码如初恋!” 感谢大家收看,我们下期再见!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注