• Spring Boot Actuator的配置和用法
  • 发布于 2个月前
  • 254 热度
    0 评论
  • 顾及谁
  • 24 粉丝 33 篇博客
  •   
Spring Boot Actuator (API Documentation)模块提供了生产级别的功能,比如健康检查、审计、指标收集、HTTP跟踪等,帮助我们更好地管理 Spring Boot 应用。 
初始化Actuator配置
当前使用 Spring Boot 2.3.12 RELEASE 版本。
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
在完成引入依赖后,将相关配置写入(不配置也能直接用)
# 堆代码 duidaima.com
#监控器 Actuator
management:
  # 端点开放控制
  endpoint:
    # 打开 shutdown 接口,默认的时候仅有它是 false
    shutdown:
      enabled: true
# 端点全局配置
  endpoints:
    web:
    # 配置开放所有端点
      exposure:
        include: "*"
      # 修改访问路径 2.0之前默认是/; 2.0及以后默认是/actuator可以通过这个属性值修改
      base-path: /actuator
重启项目后,访问接口/actuator可以获取到当前 Actuator 对外开放的接口列表,则算是接入成功。
{
    "_links": {
        "self": {
            "href": "http://127.0.0.1:23003/portal/actuator",
            "templated": false
        },
        "beans": {
            "href": "http://127.0.0.1:23003/portal/actuator/beans",
            "templated": false
        },
        "caches-cache": {
            "href": "http://127.0.0.1:23003/portal/actuator/caches/{cache}",
            "templated": true
        },
        "caches": {
            "href": "http://127.0.0.1:23003/portal/actuator/caches",
            "templated": false
        },
        "health": {
            "href": "http://127.0.0.1:23003/portal/actuator/health",
            "templated": false
        },
        "health-path": {
            "href": "http://127.0.0.1:23003/portal/actuator/health/{*path}",
            "templated": true
        },
        "info": {
            "href": "http://127.0.0.1:23003/portal/actuator/info",
            "templated": false
        },
        "scheduledtasks": {
            "href": "http://127.0.0.1:23003/portal/actuator/scheduledtasks",
            "templated": false
        },
        "mappings": {
            "href": "http://127.0.0.1:23003/portal/actuator/mappings",
            "templated": false
        }
    }
}
各端点功能
HTTP方法 Endpoint(端点) 功能描述
GET /actuator 查看有哪些 Actuator endpoint 是开放的
GET /actuator/auditevent 查看 audit 的事件,例如权限认证、订单失败,需要搭配 Spring security 使用
GET /actuator/beans 查看当前容器中全部的 bean,以及他们的依赖关系
GET /actuator/conditions 查看自动配置的结果,记录哪些自动配置条件已经通过,哪些没有
GET /actuator/configprops 查看注入带有 @ConfigurationProperties 注解的 properties 值(包含默认值)
GET /actuator/env (常用) 查看全部环境,可以看到 SpringBoot 加载了哪些 properties,以及這些 properties 的值(但是会自动使用*隐藏 key、password、secret 等关键字的 properties 的值,保护配置信息不泄露)
GET /actuator/flyway 查看 flyway DB 的 migration 信息
GET /actuator/health (常用) 查看当前 SpringBoot 运行的健康指数,值由 HealthIndicator 的实现类提供(所以可以自定义一些健康指标)
GET /actuator/heapdump 取得 JVM 当前的 heap dump,可以下载一份文档
GET /actuator/mappings 查看全部的 endpoint(包含 Actuator 的),以及他们和 Controller 的关联
GET /actuator/metrics(常用) 查看有哪些应用指标可以看(ex: jvm.memory.max、system.cpu.usage),要再使用 /actuator/metrics/{metric.name} 分別查看各指标的详情
GET /actuator/scheduledtasks 查看定时任务信息
POST /actuator/shutdown 唯一需要使用POST请求的端点,可以关闭当前应用。


Actuator端点安全认证配置
一般可以利用 Actuator配置文件将对外开放端口,修改与当前应用接口不一致,或将端点的映射路劲修改,来保证它的安全。
# 端口
server:
  port: 8080
spring:
  application:
    # 应用名称
    name: Spring-boot-actuator-test
management:
  endpoints:
    web:
      exposure:
        # 打开所有的监控点
        include: "*"
      # 默认值:http://localhost:8080/actuator/*
      # 配置后:http://localhost:8080/monitor/*
      base-path: /monitor
  endpoint:
    shutdown:
      enabled: true
  # 可以自定义端口
  server:
    port: 8089
完全依赖服务器防火墙策略进行安全保障,有种赌他找不到的意思。而官方推荐使用与 Spring Security 结合使用,也可以使用其他安全认证组件,我这边提供一个 Shiro 过滤器进行校验方法。
添加 Shiro 依赖
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>${shiro.version}</version>
</dependency>
定义一个非常简单配置类 ShiroConfig
@Configuration
public class ShiroConfig {

    @Bean("shiroFilter")
    public ShiroFilterFactoryBean shiroFilter() {
        ShiroFilterFactoryBean filter = new ShiroFilterFactoryBean();
        filter.setSecurityManager(new DefaultWebSecurityManager());
        // 堆代码 duidaima.com
        // 配置过滤器
        Map<String, Filter> filters = new HashMap<>();
        filters.put("actuatorAuth", new ActuatorAuthFilter());
        filter.setFilters(filters);
        // 配置过滤路径
        Map<String, String> filterMap = new LinkedHashMap<>();
        filterMap.put("/actuator/**", "actuatorAuth");
        filter.setFilterChainDefinitionMap(filterMap);
        return filter;
    }
}
Actuator 权限认证过滤器
/**
 * Actuator安全认证过滤器
 *
 * 堆代码 duidaima.com
 */
@Component
public class ActuatorAuthFilter extends AccessControlFilter {

    @Override
    protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) {
        return verify(servletRequest);
    }

    @Override
    protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) {
        // 返回异常信息,自己改造
        PrintWriter writer = null;
        try {
            writer = servletResponse.getWriter();
            writer.print(JSON.toJSONString("Unauthorized Access Actuator API"));
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            if (writer != null) {
                writer.close();
            }
        }
        return false;
    }

    /**
     * 密码校验
     *
     * @param request  请求信息
     * @return {@Link boolean}
     * @author XueHongren
     * @date 16:22 2023/5/29
     **/
    private boolean verify(ServletRequest request) {
        // 从配置文件中获取密钥参数
        boolean enabled = Boolean.parseBoolean(SpringUtil.getProperty("management.auth.enabled"));
        String password = SpringUtil.getProperty("management.auth.password");
        // 未开启认证,直接跳过
        if (!enabled) {
            return true;
        }
        // 检查请求头是否包含该请求参数
        String actuatorPassword = ((HttpServletRequest) request).getHeader("自定义请求头Key");
        if (StrUtil.isBlank(actuatorPassword)) {
            return false;
        }
        // 判断配置密码是否一致
        return actuatorPassword.equals(password);
    }
}
配置文件密钥参数
#监控器 Actuator
management:
  #  是否开启自定义的安全认证
  auth:
    enabled: true
    password: 123456
此时发起请求后,会通过过滤器 ActuatorAuthFilter 校验请求头中是否包含 Actuator 相关密钥,随后再进行校验,若需要动态的,可以自行添加接口,生成限时的密钥存入Redis中进行管理。

用户评论