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中进行管理。