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 應用十分重要。該組件是一個生產級別的工具,咱們不該該忽略它。
關注公衆號:碼農小胖哥 獲取更多資訊