当我们决定用spring boot作为微服务框架时,除了它强大的快速开发功能之外,还因为它在starter POM中提供了一个特殊依赖模块spring-boot-starter-actuator。引入该模块能够自动为spring boot构建的应用提供一系列监控的端点。
初识actuator
在现有的Spring boot应用中引入该模块非常简单,只需在pom依赖中加入spring-boot-starter-actuator的依赖即可,具体如下:
org.springframework.boot
spring-boot-starter-actuator
增加依赖之后,重新启动应用。此时,我们可以在控制台看到如下输出:
上图中显示了一批端点定义,这些端点并非我们在程序中创建,而是由spring-boot-starter-actuator模块根据应用依赖和配置自动创建出来的监控和管理端点。比如我们可以访问http://localhost:8080/actuator/health接口获取如下信息:
{"status":"UP"}
完成上述配置之后,需要加application.properties文件中加入如下配置,否则会出现下文中的端点404的情况。
management.endpoints.web.exposure.include=*
原生端点
spring-boot-starter-actuator模块中有一些已经实现的原生端点,根据端点的作用,可以将端点分为以下三大类:
应用配置类:获取应用程序中加载的应用配置、环境变量、自动化配置报告等与spring boot应用相关的配置信息。
度量指标类:获取应用程序运行过程中用于监控的度量指标,比如内存信息、线程池信息、http请求统计等。
操作控制:提供了对应用的关闭等操作类功能。
应用配置类
由于spring boot为了改善传统spring应用复杂的配置内容,采取了包扫描和自动化配置的机制来加载原本集中于xml文件的各项内容,这使得我们分析应用中资源和实例的各种关系变得困难,而这类端点可以帮助我们获得一系列spring应用配置的详细报告,比如自动化配置的报告、bean创建的报告、环境属性的报告等。
/actuator/conditions:该端点用来获取应用的自动化配置报告,其中包括所有自动化配置的候选项目。同时还列出了没个候选项是否满足自动化配置的先决条件。
positiveMatches中返回的是条件匹配成功的自动化配置
negativeMatches中返回的是条件匹配不成功的自动化配置
/actuator/conditions:该端点用来获取上下文中创建的所有bean。
/actuator/configprops:该端点用来获取应用中配置的属性报告。从返回示例中,我们看到了该短信的配置信息,prefix属性代表属性的配置前缀,propertis代表各个属性的名称和值。如果我们要关闭该端点就可以使用management.health.diskspace.enabled=false来完成设置。
{
"diskSpaceHealthIndicatorProperties": {
"prefix": "management.health.diskspace",
"properties": {
"path": "/Users/wenkunzhao/IdeaProjects/spring-cloud/.",
"threshold": 10485760
}
}
...
}
/actuator/env:该端点用来获取应用所加载的配置信息。另外,为了配置的安全,对于一些类似密码的敏感信息,该端点会进行隐私保护,但我们要有让属性名中包含password、secret、key这些关键字,这样该端点在返回他们时会使用*来替代实际值。
/actuator/mappings:该端点用来返回spring mvc控制器映射关系报告。
/actuator/info:该端点用来返回应用自定义信息。默认情况下,该端点会返回空json。我们可以在application.properties文件中设置一些属性,比如下面:
info.app.name="spring-boot"
info.app.version="1.0.0"
再访问/info端点,我们可以得到如下信息:
{
"app": {
"name": "\"spring-boot\"",
"version": "\"1.0.0\""
}
}
度量指标类
/actuator/metrics:该端点可以提供应用运行状态饿完整度量指标。我们可以通过/metrics/{name}接口更细粒度的获取度量信息,比如可以通过/metrics/mem.free来获取当前可用内存数量
actuator/health:该端点可以获取应用的各类健康指标信息。在spring-boot-starter-actuator模块中自带实现了一些常用资源的检测器,这些检测器都通过HealthIndicator接口实现,并且会根据依赖关系的引入实现自动装配。如果我们需要实现自定义检测器,则需要实现HealthIndicator接口,并让spring管理。
/actuator/threaddump:该端点可以获取程序运行中的线程信息。
/actuator/httptrace:该端点用来返回基本的http跟踪信息,默认情况下,跟踪信息的存储采用org.springframework.boot.actuate.trace.InMemoryTraceRepository实现的内存方式,始终保留最近的100条请求记录。记录格式如下:
{
"traces": [{
"principal": null,
"request": {
"headers": {
"accept": [
"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
],
"accept-encoding": [
"gzip, deflate"
],
"accept-language": [
"zh-cn"
],
"connection": [
"keep-alive"
],
"host": [
"localhost:8080"
],
"upgrade-insecure-requests": [
"1"
],
"user-agent": [
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/11.1.2 Safari/605.1.15"
]
},
"method": "GET",
"remoteAddress": null,
"uri": "http://localhost:8080//actuator/trace"
},
"response": {
"headers": {},
"status": 404
},
"session": null,
"timeTaken": 1,
"timestamp": "2018-08-19T13:36:53.131Z"
}]
}
操作控制类
在原生端点中,只提供了一个用来关闭应用的端点/shutdown(在后续引入Eureka后,会引入更多端点)。可通过如下配置开启它:
#1.X
#endpoint.shutdown.enabled=true
#2.0
management.endpoint.shutdown.enabled=true
在配置了上述属性之后,只需要post访问该应用的shutdown端点即可关闭该应用,十分危险。所以真正在生产环境使用时,需要加入一定的保护机制,比如定制actuator的端点路径,整合spring security进行安全校验等。