Spring Boot 提供了运行时的应用监控和管理功能,我们可以通过http、JMX进行操作。
全部章节传送门:
Spring Boot学习笔记(一):Spring Boot 入门基础
Spring Boot学习笔记(二):Spring Boot 运行原理
Spring Boot学习笔记(三):Spring Boot Web开发
Spring Boot学习笔记(四):Spring Boot 数据访问
Spring Boot学习笔记(五):Spring Boot 企业级开发
Spring Boot学习笔记(六):Spring Boot 应用监控
常见端点介绍
Spring Boot 2.0提供的常用端点如下所示。
序号 | 端点名 | 描述 | 默认开启(Web) | 默认开启(JMX) |
---|---|---|---|---|
1 | actuator | 所有端点的列表,需加入spring HATEOAS支持 | 是 | 是 |
2 | auditevents | 显示应用暴露的审计事件 (比如认证进入、订单失败) | 是 | 否 |
3 | info | 显示应用的基本信息 | 是 | 是 |
4 | health | 显示应用的健康状态 | 是 | 是 |
5 | metrics | 显示应用多样的度量信息 | 否 | 是 |
6 | loggers | 显示和修改配置的loggers | 否 | 是 |
7 | logfile | 返回log file中的内容(如果logging.file或者logging.path被设置) | 否 | 不适用 |
8 | httptrace | 显示HTTP足迹,最近100个HTTP request/repsponse | 否 | 是 |
9 | env | 显示当前的环境特性 | 否 | 是 |
10 | flyway | 显示数据库迁移路径的详细信息 | 否 | 是 |
11 | shutdown | 让你逐步关闭应用 | 否 | 是 |
12 | mappings | 显示所有的@RequestMapping路径 | 否 | 是 |
13 | scheduledtasks | 显示应用中的调度任务 | 否 | 是 |
14 | threaddump | 执行一个线程dump | 否 | 不适用 |
15 | heapdump | 返回一个GZip压缩的JVM堆dump | 否 | 不适用 |
配置端点
默认情况下,所有的端点都是打开的,除了 shutdown 端点。可以通过 management.endpoint.
的值设置为true
或者false
。
例如,想要打开 shutdown 端点,可以在application.properties中配置:
management.endpoint.shutdown.enabled=true
默认情况下,所有的端点都可以通过JMX查看,而只有health端点和info端点可以通过HTTP查看。我们可以通过配置进行修改。
management.endpoints.web.exposure.include=health,info
management.endpoints.web.exposure.exclude=
management.endpoints.jmx.exposure.include=*
management.endpoints.jmx.exposure.exclude=
查看端点
创建 Spring Boot 项目,添加 Actuator、Web和HATEOAS依赖。
4.0.0
org.springframework.boot
spring-boot-starter-parent
2.1.3.RELEASE
com.wyk
actuatordemo
0.0.1-SNAPSHOT
actuatordemo
Demo project for Spring Boot Actustor
1.8
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-starter-hateoas
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
在application.properties中添加配置信息。
# 开启所有端点允许HTTP查看
management.endpoints.web.exposure.include=*
# 显示详细健康信息
management.endpoint.health.show-details=always
然后运行程序,即可查看端点信息。
登录 http://localhost:8080/actuator 。
登录 http://localhost:8080/actuator/health 查看端点信息。
除了shutdown端点需要POST方式查看,其他端点均可直接查看。
还可以通过JMX对应用进行管理和监控。在控制台输入 jconsole即可进入JMX。
然后选择我们的程序进入界面,然后在MBean标签的org.springframework.boot域下可以对程序进行监控和管理。
自定义端点
自定义端点需要使用如下注释。
- @Endpoint 是构建 rest 的唯一路径。不同请求的操作,调用时缺少必需参数,或者使用无法转换为所需类型的参数,则不会调用操作方法,响应状态将为400(错误请求)
- @ReadOperation = GET 响应状态为 200 如果没有返回值响应 404(资源未找到)。
- @WriteOperation = POST 响应状态为 200 如果没有返回值响应 204(无响应内容)
- @DeleteOperation = DELETE 响应状态为 200 如果没有返回值响应 204(无响应内容)
依旧使用上面的工程,添加一个实体类。
package com.wyk.actuatordemo;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.boot.actuate.endpoint.annotation.WriteOperation;
import org.springframework.stereotype.Component;
@Endpoint(id="status")
@Component
public class StatusEndpoint {
private String status;
@ReadOperation
public String getStatus() {
return status;
}
@WriteOperation
public void setStatus(String status) {
this.status = status;
}
}
然后修改运行类。
package com.wyk.actuatordemo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@SpringBootApplication
@RestController
public class ActuatordemoApplication {
@Autowired
StatusEndpoint statusEndpoint;
public static void main(String[] args) {
SpringApplication.run(ActuatordemoApplication.class, args);
}
@RequestMapping("/change")
public String changeStatus(String status) {
//StatusEndpoint statusEndpoint = new StatusEndpoint();
statusEndpoint.setStatus(status);
return "OK";
}
}
运行程序,打开 http://localhost:8080/actuator/status, 这时候会报404,是因为status没有值。
再打开一个窗口,输入 http://localhost:8080/change?status=123 , 这时候再打开 http://localhost:8080/actuator/status ,就可以看到了。
自定义 HealthIndicator
Health 信息是从 AppliciationContext 中所有的 HealthIndicator 的 Bean 中收集的, Spring 内置的HealthIndicator 如下所示。
名称 | 描述 |
---|---|
CassandraHealthIndicator | 检查 Cassandra 数据库是否启动。 |
DiskSpaceHealthIndicator | 检查磁盘空间不足。 |
DataSourceHealthIndicator | 检查是否可以获得连接 DataSource。 |
ElasticsearchHealthIndicator | 检查 Elasticsearch 集群是否启动。 |
InfluxDbHealthIndicator | 检查 InfluxDB 服务器是否启动。 |
JmsHealthIndicator | 检查 JMS 代理是否启动。 |
MailHealthIndicator | 检查邮件服务器是否启动。 |
MongoHealthIndicator | 检查 Mongo 数据库是否启动。 |
Neo4jHealthIndicator | 检查 Neo4j 服务器是否启动。 |
RabbitHealthIndicator | 检查 Rabbit 服务器是否启动。 |
RedisHealthIndicator | 检查 Redis 服务器是否启动。 |
SolrHealthIndicator | 检查 Solr 服务器是否已启动。 |
要实现自己的 HealthIndicator 只需要实现 HealthIndicator 类。
package com.wyk.actuatordemo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
public class StatusHealth implements HealthIndicator {
@Autowired
StatusEndpoint statusEndpoint;
@Override
public Health health() {
String status = statusEndpoint.getStatus();
if(status == null || !status.equals("123")) {
return Health.down().withDetail("Error", "Not Running").build();
}
return Health.up().build();
}
}
运行程序,打开 http://localhost:8080/actuator/health 查看。