Spring Boot 提供了不少开箱即用的starter,其中有一款很是特别的starter——actuator 。它是用来对Spring Boot 应用进行监控、指标采集、管理,并提供一些颇有用的端点(endpoint)来实现上述功能。这有助于咱们对Spring Boot 应用进行监视和管理。咱们本文将探讨Spring Boot 2.x下的actuator的一些知识点。java
像其它starter同样,经过很是简单的依赖集成便可开箱即用。咱们经过在项目中引入(以maven为例):web
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
Actuator的核心是端点(endpoint),咱们经过端点来获取应用的一些监控信息或者经过端点来改变系统的一些状态。Actuator中内置了很是多的端点:spring
id | 描述 | 默认是否启用 |
---|---|---|
auditevents | 显示当前应用程序的审计事件信息 | Yes |
beans | 显示应用Spring Beans的完整列表 | Yes |
caches | 显示可用缓存信息 | Yes |
conditions | 显示自动装配类的状态及及应用信息 | Yes |
configprops | 显示全部 @ConfigurationProperties 列表 | Yes |
env | 显示 ConfigurableEnvironment 中的属性 | Yes |
flyway | 显示 Flyway 数据库迁移信息 | Yes |
health | 显示应用的健康信息(未认证只显示status,认证显示所有信息详情) | Yes |
info | 显示任意的应用信息 | Yes |
liquibase | 展现Liquibase 数据库迁移 | Yes |
metrics | 展现当前应用的 metrics 信息 | Yes |
mappings | 显示全部 @RequestMapping 路径集列表 | Yes |
scheduledtasks | 显示应用程序中的计划任务 | Yes |
sessions | 容许从Spring会话支持的会话存储中检索和删除用户会话。 | Yes |
shutdown | 容许应用以优雅的方式关闭(默认状况下不启用) | No |
threaddump | 执行一个线程dump | Yes |
httptrace | 显示HTTP跟踪信息(默认显示最后100个HTTP请求 - 响应交换) | Yes |
heapdump | 返回一个GZip压缩的hprof堆dump文件 | Yes |
prometheus | Prometheus服务器抓取的格式显示metrics信息 | Yes |
默认状况下除了shutdown
是关闭的其它端点都是启用的。个别端点的启用依赖其余组件,好比咱们上篇文章介绍的Prometheus。咱们能够在Spring Boot 配置文件中经过配置(id参见上表)management.endpoint.<id>.enabled
来配置端点是否启用。数据库
另外咱们能够经过management.endpoints.enabled-by-default
来修改全局端口默认配置,如下示例启用info端点并禁用全部其余端点:缓存
# 先设置全部的端点默认为关闭 management.endpoints.enabled-by-default=false # 而后开启info 端点 management.endpoint.info.enabled=true
特别须要咱们注意的是,以上只是咱们开启的端点功能,并不意味咱们把这些端点暴露给应用以外的环境中去。暴露的配置规则是 management.endpoints.<web|jmx>.exposure.<include|exclude>
咱们以web为例,经过如下方式来暴露web端点:安全
# * 为暴露全部web端点,若是暴露的是一个列表请使用端点 id 并以逗号隔开 management.endpoints.web.exposure.include='*'
一样的若是咱们要排除一些web端点请用 management.endpoints.web.exposure.exclude
来配置。咱们能够经过/actuator
来列举暴露的端点。固然这个路径取决于咱们对management.endpoints.web.basePath
的配置。服务器
对于生产环境来讲端点都是敏感的。咱们固然不但愿非法的访问端点,特别如/shutdown
这种端点。咱们能够经过上面3.一、3.2进行关闭、封闭操做。也可直接配置management.server.port=-1
来关闭管理端点。或者确保在外面的安全框架诸如Spring security的控制之下。即保证 EndpointRequest.toAnyEndpoint()
的安全性。session
Spring Boot 2.x 开始,Actuator支持CRUD模型,而不是旧的RW(读/写)模型。咱们能够按照两种策略来自定义:app
经过在一个端点类(必须是Spring Bean)上添加上面其中一个来代表该类是一个端点类。 在类的方法使用@ReadOperation,@WriteOperation或@DeleteOperation,这分别会映射到Http中的 GET、POST、DELETE(对http来讲)。 如下是咱们自定义的一个端点:框架
@Component @Endpoint(id = "features") public class FeaturesEndpoint { private Map<String, Feature> features = new ConcurrentHashMap<>(); @ReadOperation public Map<String, Feature> features() { return features; } @ReadOperation public Feature feature(@Selector String name) { return features.get(name); } @WriteOperation public void configureFeature(@Selector String name, Feature feature) { features.put(name, feature); } @DeleteOperation public void deleteFeature(@Selector String name) { features.remove(name); } public static class Feature { private Boolean enabled; // [...] getters and setters } }
注意请务必保证端点的id在该应用中惟一。
假设咱们想要确保咱们的应用程序的生产实例永远不是SNAPSHOT版本。咱们决定经过更改返回此信息的Actuator端点(/info)来完成此操做。若是咱们的应用程序刚好是SNAPSHOT。咱们将得到不一样的HTTP状态代码。
咱们可使用@EndpointExtension
或其更具体的@EndpointWebExtension
、@EndpointJmxExtension
轻松扩展预约义端点的行为:
@Component @EndpointWebExtension(endpoint = InfoEndpoint.class) public class InfoWebEndpointExtension { private InfoEndpoint delegate; // standard constructor @ReadOperation public WebEndpointResponse<Map> info() { Map<String, Object> info = this.delegate.info(); Integer status = getStatus(info); return new WebEndpointResponse<>(info, status); } private Integer getStatus(Map<String, Object> info) { // return 5xx if this is a snapshot return 200; } }
运维应用监控依赖于对应用度量(metric)指标的抽取。Spring Boot 2.x中的Actuator 对Micrometer的自动配置。 甚至咱们能够经过一个叫MeterRegistry
的Spring Bean来注册一个自定义的metric指标。咱们能够经过/actuator/metrics
端点获取全部的metric指标。 也能够经过/actuator/metrics/{metricName}
来获取具体度量的元数据。
Micrometer 是一个应用度量门面类库,相似SLF4。后面我会专门写一篇文章来介绍这个知识点。请关注个人公众号:Felordcn 以保证第一时间获取相关的知识。
本文咱们介绍了Spring Boot 2.x中Actuator 组件。该组件能够帮助咱们来获取系统的一些元信息和一些监控度量指标。对于Spring Boot 应用十分重要。该组件是一个生产级别的工具,咱们不该该忽略它。
关注公众号:码农小胖哥 获取更多资讯