一、简介
1.问题提出:
1> 当应用部署到生产环境时,需要各种运维相关的功能的支持,包括性能指标、运行信息和应用管理等。所有这些功能都有很多技术和开源库可以实现。
2> Spring Boot 对这些运维相关的功能进行了整合,形成了一个功能完备和可定制的功能集,称之为 Actuator。
2.解决方案:
只需要在 POM 文件中增加对 “org.springframe.boot:spring-boot-starter-actuator” 的依赖就可以添加 Actuator。Actuator 在添加之后,会自动暴露一些 HTTP 服务来提供这些信息。
这些 HTTP 服务的说明如 表 2 。
表 2. Spring Boot Actuator 所提供的 HTTP 服务
名称 | 说明 | 是否包含敏感信息 |
autoconfig | 显示 Spring Boot 自动配置的信息。 | 是 |
beans | 显示应用中包含的 Spring bean 的信息。 | 是 |
configprops | 显示应用中的配置参数的实际值。 | 是 |
dump | 生成一个 thread dump。 | 是 |
env | 显示从 ConfigurableEnvironment 得到的环境配置信息。 | 是 |
health | 显示应用的健康状态信息。 | 否 |
info | 显示应用的基本信息。 | 否 |
metrics | 显示应用的性能指标。 | 是 |
mappings | 显示 Spring MVC 应用中通过“ @RequestMapping”添加的路径映射。 | 是 |
shutdown | 关闭应用。 | 是 |
trace | 显示应用相关的跟踪(trace)信息。 | 是 |
1> 对于表 2中的每个服务,通过访问名称对应的 URL 就可以获取到相关的信息。
-----如访问“/info”就可以获取到 info 服务对应的信息。
2> 服务是否包含敏感信息说明了该服务暴露出来的信息是否包含一些比较敏感的信息,从而确定是否需要添加相应的访问控制,而不是对所有人都公开。
3> 所有的这些服务都是可以配置的,比如通过改变名称来改变相应的 URL。下面对几个重要的服务进行介绍。
二、几个HTTP 服务介绍
health 服务
作用:
1> Spring Boot 默认提供了对应用本身、关系数据库连接、MongoDB、Redis 和 Rabbit MQ 的健康状态的检测功能。
2> 当应用中添加了 DataSource 类型的 bean 时,Spring Boot 会自动在 health 服务中暴露数据库连接的信息。
3> 应用也可以提供自己的健康状态信息,如代码清单 7 所示。
清单 7. 自定义 health 服务
@Component
public class AppHealthIndicator implements HealthIndicator {
@Override
public Health health() {
return Health.up().build();
}
}
使用自定义Heath服务:
应用只需要实现 org.springframework.boot.actuate.health.HealthIndicator 接口,并返回一个 org.springframework.boot.actuate.health.Health 对象,就可以通过 health 服务来获取所暴露的信息。如 代码清单 8 所示。
清单 8. health 服务返回的结果
{"status":"UP","app":{"status":"UP"},"db":{"status":"UP","database":"HSQL Database Engine","hello":1}}
2.info 服务
1> info 服务所暴露的信息是完全由应用来确定的。
2> 应用中任何以“info.”开头的配置参数会被自动的由 info 服务来暴露。
3> 只需要往 application.properties 中添加以“info.”开头的参数即可,
如 代码清单 9 所示。
清单 9. 添加 info 服务所需配置参数的属性文件
info.app_name=My First Spring Boot Application
info.app_version=1.0.0
当访问“/info”时,访问的 JSON 数据如 代码清单 10 所示。
清单 10. Info 服务返回的结果
{"app_name":"My First Spring Boot Application","app_version":"1.0.0"}
3.metrics 服务
作用:当访问 metrics 服务时,可以看到 Spring Boot 通过 SystemPublicMetrics 默认提供的一些系统的性能参数值,包括内存、CPU、Java 类加载和线程等的基本信息。
1.应用可以记录其他所需要的信息,Spring Boot 默认提供了两种类型的性能指标记录方式: gauge 和 counter。
1> gauge 用来记录单个绝对数值
2> counter 用来记录增量或减量值。
--------比如在一个 Web 应用中,可以用 counter 来记录当前在线的用户数量。当用户登录时,把 counter 的值加 1;当用户退出时,把 counter 的值减 1。 代码清单 11 给出了一个示例。
清单 11. 自定义的 metrics 服务
@RestController
public class GreetingsController {
@Autowired
private CounterService counterService;
@RequestMapping("/greet")
public String greet() {
counterService.increment("myapp.greet.count");
return "Hello!";
}
}
在 代码清单 11 中添加了对 Spring Boot 提供的 CounterService 的依赖。
-------当 greet 方法被调用时,会把名称为“myapp.greet.count”的计数器的值加 1。也就是当用户每次访问“/greet”时,该计算器就会被加 1。
注意:除了 CounterService 之外,还可以使用 GaugeService 来记录绝对值。
4.使用 JMX 进行管理
1. Actuator 不方便的地方
1> 添加 Actuator 后所暴露的 HTTP 服务只能提供只读的信息。
2> 如果需要对应用在运行时进行管理,则需要用到 JMX。
2.Spring Boot 默认提供了 JMX 管理的支持,用来解决以上问题
1> 只需要通过 JDK 自带的 JConsole 连接到应用的 JMX 服务器,就可以看到在域“org.springframework.boot”中 mbean。
2> 可以通过 Spring 提供的 @ManagedResource、@ManagedAttribute 和 @ManagedOperation 注解来创建应用自己的 mbean。