Spring Boot 生产级的特性
Spring Boot 有许多开箱即用的模块或者说插件,其中 spring-boot-actuator
提供了大量的生产级的特性。添加 spring-boot-starter-actuator
的 maven 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
端点
Actuator 模块提供一系列的 HTTP 请求,这些请求都是 GET 类型的,不带任何请求参数,可用通过他们获取 Spring Boot 应用程序的相关信息。这些入口就是 端点 (Endpoint)
ID | 描述 |
---|---|
auditevents | 公开当前应用程序的审计事件信息 |
beans | 获取 Spring bean 的完整列表 |
caches | 获取可用的缓存 |
conditions | 显示自动配置类的评估和配置条件,以及它们匹配或不匹配的原因。 |
configprops | 显示配置项信息(通过@ConfigurationProperties 配置) |
env | 获取 Spring 应用的环境变量信息 ConfigurableEnvironment |
flyway | 显示已应用的Flyway数据库迁移信息 |
health | 显示应用健康检查信息 |
httptrace | 显示HTTP跟踪信息(默认情况下,最新100个HTTP请求) |
info | 显示当前应用信息 |
integrationgraph | 显示 Spring 集成图 |
loggers | 显示和修改应用程序中记录器的配置 |
liquibase | 显示已应用的Liquibase数据库迁移的信息 |
metrics | 显示当前应用程序的“度量”指标信息 |
mappings | 显示所有@RequestMapping 的映射路径信息 |
scheduledtasks | 显示应用程序中的任务计划 |
sessions | 允许从Spring Session支持的会话存储中检索和删除用户会话。使用Spring Session对响应式Web应用程序的支持时不可用 |
shutdown | 允许应用程序正常关闭(默认情况下不开启这个端点) |
threaddump | 执行线程转储 |
访问这些端点需要 前缀 /actuator/
+ 加上端点ID(spring boot 2.0之后需要加上 /actuator/),如 health 端点映射路径为 /actuator/health
端点启用和关闭
默认情况下,除 shutdown
的所有端点都是开启的,我们可以根据实际情况自由的控制哪些端点启用,哪些关闭,甚至还可以修改默认的端点名称。
配置端点的启用
management.endpoint.<id>.enabled
,如启用 shutdown
端点
management.endpoint.shutdown.enabled=true
如果想要端点启用是选择加入而不是选择退出,将management.endpoints.enabled-by-default
属性设置 为false
,并使用各个端点 enabled
属性重新加入。以下示例启用info
端点并禁用所有其他端点
management.endpoints.enabled-by-default=false
management.endpoint.info.enabled=true
暴露端点
暴露端点
我们启动了 spring boot 之后,在浏览器地址栏中分别输入:
http://localhost:8080/actuator/health
http://localhost:8080/actuator/beans
前面说默认情况下大部分端点都是开启的,那为何端点 health 是可以访问到的,而端点 beans 确不行呢?
原因是这些端点往往显示的都是项目的敏感信息,默认情况下,在 Web 下,Spring Boot 只会暴露 info h和 health 这两个端点,其余的都不暴露
想要改变暴露的端点,要使用 include
和 exclude
属性
属性 | 默认 |
---|---|
management.endpoints.jmx.exposure.exclude | |
management.endpoints.jmx.exposure.include | * |
management.endpoints.web.exposure.exclude | |
management.endpoints.web.exposure.include | info, health |
为了让 Actuator 暴露端点,可以配置
management.endpoints.web.exposure.include=health,info,beans
这样就可以访问 beans 端点了(http://localhost:8080/actuator/beans
)
暴露端点的安全性问题
在默认情况下,Actuator 对敏感信息是除了health 和 info 端点, 其余端点都是不暴露的。虽然可以通过配置 application.properties 这样的方式可以进行访问,但是这样的方式从安全的角度来说是非常不利的
可以使用 Spring Security 配置用户和角色,来解决这些敏感信息的访问权限问题,引入spring-boot-starter-security , 然后配置用户和角色
@Configuration
public class ActuatorSecurity extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests()
.anyRequest().hasRole("ENDPOINT_ADMIN")
.and()
.httpBasic();
}
}
上面的示例用于 EndpointRequest.toAnyEndpoint()
将请求与任何端点进行匹配,然后确保所有端点都具有该ENDPOINT_ADMIN
角色。其他几种匹配方法也可用EndpointRequest
这个时候可以配置application.properties:
management.endpoints.web.exposure.include=*
通过这样的配置就可以把所有的端点都暴露出来,只是在Spring Security 中,对应保护的端点需
要拥有对应的权限才可以进行访问