21.4 通过 Actuator 获取了解应用内部状况

Spring Boot Actuator 所完成的主要功能就是为基于 Spring Boot 的应用添加多个有用的管理端点。这些端点包括以下几个内容。

  • GET /autoconfig:描述了 Spring Boot 在使用自动配置的时候,所做出的决策;

  • GET /beans:列出运行应用所配置的 bean;

  • GET /configprops:列出应用中能够用来配置 bean 的所有属性及其当前的值;

  • GET /dump:列出应用的线程,包括每个线程的栈跟踪信息;

  • GET /env:列出应用上下文中所有可用的环境和系统属性变量;

  • GET /env/{name}:展现某个特定环境变量和属性变量的值;

  • GET /health:展现当前应用的健康状况;

  • GET /info:展现应用特定的信息;

  • GET /metrics:列出应用相关的指标,包括请求特定端点的运行次数;

  • GET /metrics/{name}:展现应用特定指标项的指标状况;

  • POST /shutdown:强制关闭应用;

  • GET /trace:列出应用最近请求相关的元数据,包括请求和响应头。

为了启用 Actuator,我们只需将 Actuator Starter 依赖添加到项目中即可。如果你使用 Groovy 编写应用并通过 Spring Boot CLI 来运行,那么可以通过 @Grab 注解来添加 Actuator Starter,如下所示:

@Grab("spring-boot-starter-actuator")

如果使用 Gradle 构建 Java 应用的话,那么在 build.gradle 的 dependencies 代码块中需要添加如下的依赖:

compile("org.springframework.boot:spring-boot-starter-actuator")

或者,在项目的 Maven pom.xml 文件中,我们可以添加如下的 <dependency>:

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

添加完 Spring Boot Actuator 之后,我们可以重新构建并启动应用,然后打开浏览器访问以上所述的端点来获取更多信息。例如,如果想要查看 Spring 应用上下文中所有的 bean,那么可以访问 http://localhost:8080/beans。如果使用 curl 命令行工具的话,所得到的结果将会如下所示(为了便于阅读,进行了格式化和删减):

$ curl http://localhost:8080/beans
[
{
"beans": [
{
"bean": "contactController",
"dependencies": [
"contactRepository
],
"resource": "null",
"scope": "singleton",
"type":"ContactController"
},
{
"bean": "contactRepository",
"dependencies": [
"jdbcTemplate"
],
"resource": "null",
"scope": "singleton",
"type":"ContactRepository"
},
{
"bean": "jdbcTemplate",
"dependencies": [],
"resource": "class path resource [...]",
"scope": "singleton",
"type": "org.springframework.jdbc.core.JdbcTemplate"
},
...
]
}
]

从这里,我们可以看到有一个 ID 为 contactController 的 bean,它依赖于名为 contactRepository 的 bean,而 contactRepository 又依赖于 jdbcTemplate bean。

因为我对输出进行了删减,所以有很多的 bean 没有展现出来,它们都包含在 “/beans” 端点所产生的 JSON 中。对于自动装配和自动配置所形成的神秘结果,这里提供了一种了解内部实现的手段。

另外一个端点也能帮助我们了解 Spring Boot 自动配置的内部情况,这就是 “/autoconfig”。这个端点所返回的 JSON 描述了 Spring Boot 在自动配置 bean 的时候所做出的决策。例如,当针对 Contacts 应用调用 “/autoconfig” 端点时,如下展现了删减后(并进行了格式化)的 JSON 结果:

$ curl http://localhost:8080/autoconfig
{
"negativeMatches": {
"AopAutoConfiguration": [
{
"condition": "OnClassCondition",
"message": "required @ConditionalOnClass classes not found:
org.aspectj.lang.annotation.Aspect,
org.aspectj.lang.reflect.Advice"
}
],
"BatchAutoConfiguration": [
{
"condition": "OnClassCondition",
"message": "required @ConditionalOnClass classes not found:
org.springf ramework.batch.core.launch.JobLauncher"
}
],
...
},
"positiveMatches": {
"ThymeleafAutoConfiguration": [
{
"condition": "OnClassCondition",
"message": "QConditionalOnClass classes found:
org.thymeleaf.spring4.SpringTemplateEngine"
}
],
"ThymeleafAutoConfiguration.DefaultTemplateResolverConfiguration": [
{
"condition": "OnBeanCondition",
"message": "©ConditionalOnMissingBean
(names: defaultTemplateResolver; SearchStrategy: all)
found no beans"
}
],
"ThymeleafAutoConfiguration.ThymeleafDefaultConfiguration": [
{
"condition": "OnBeanCondition",
"message": "OConditionalOnMissingBean (types:
org.thymeleaf.spring4.SpringTemplateEngine;
SearchStrategy: all) found no beans"
}
],
"ThymeleafAutoConfiguration.ThymeleafViewResolverConfiguration": [
{
"condition": "OnClassCondition",
"message": "OConditionalOnClass classes found:
javax.servlet.Servlet"
}
],
"ThymeleafAutoConfiguration.ThymeleafViewResolverConfiguration
#thymeleafViewResolver": [
{
"condition": "OnBeanCondition",
"message": "@ConditionalOnMissingBean (names:
thymeleafViewResolver; SearchStrategy: all)
found no beans"
}
],
...
}
}

我们可以看到,这个报告包含了两部分:一部分是没有匹配上的(negative matches),另一部分是匹配上的(positive matches)。在没有匹配的部分中,表明没有使用 AOP 和自动配置,因为在类路径中没有找到所需的类。在匹配上的部分中,我们可以看到,因为在类路径下找到了 SpringTemplateEngine,Thymeleaf 自动配置将会发挥作用。同时还可以看到,除非明确声明了默认的模板解析器、视图解析器以及模板 bean 否则的话,这些 bean 会进行自动配置。另外,只 有在类路径中能够找到 Servlet 类,才会自动配置默认的视图解析器。

“/beans” 和 “/autoconfig” 端点只是 Spring Boot Actuator 所提供的观察应用内部状况的两个样例。在本章中,我们没有足够的篇幅详细讨论每个端点,但是我建议你自行尝试这些端点,以便掌握 Actuator 都提供了哪些功能来帮助我们了解应用的内部状况。