Spring Boot 生產級的特性java
Spring Boot 有許多開箱即用的模塊或者說插件,其中 spring-boot-actuator
提供了大量的生產級的特性。添加 spring-boot-starter-actuator
的 maven 依賴:web
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
Actuator 模塊提供一系列的 HTTP 請求,這些請求都是 GET 類型的,不帶任何請求參數,可用經過他們獲取 Spring Boot 應用程序的相關信息。這些入口就是 端點 (Endpoint)spring
ID | 描述 |
---|---|
auditevents |
公開當前應用程序的審計事件信息 |
beans |
獲取 Spring bean 的完整列表 |
caches |
獲取可用的緩存 |
conditions |
顯示自動配置類的評估和配置條件,以及它們匹配或不匹配的緣由。 |
configprops |
顯示配置項信息(經過@ConfigurationProperties 配置) |
env |
獲取 Spring 應用的環境變量信息 ConfigurableEnvironment |
flyway |
顯示已應用的Flyway數據庫遷移信息 |
health |
顯示應用健康檢查信息 |
httptrace |
顯示HTTP跟蹤信息(默認狀況下,最新100個HTTP請求) |
info |
顯示當前應用信息 |
integrationgraph |
顯示 Spring 集成圖 |
loggers |
顯示和修改應用程序中記錄器的配置 |
liquibase |
顯示已應用的Liquibase數據庫遷移的信息 |
metrics |
顯示當前應用程序的「度量」指標信息 |
mappings |
顯示全部@RequestMapping 的映射路徑信息 |
scheduledtasks |
顯示應用程序中的任務計劃 |
sessions |
容許從Spring Session支持的會話存儲中檢索和刪除用戶會話。使用Spring Session對響應式Web應用程序的支持時不可用 |
shutdown |
容許應用程序正常關閉(默認狀況下不開啓這個端點) |
threaddump |
執行線程轉儲 |
訪問這些端點須要 前綴 /actuator/
+ 加上端點ID(spring boot 2.0以後須要加上 /actuator/),如 health 端點映射路徑爲 /actuator/health
數據庫
默認狀況下,除 shutdown
的全部端點都是開啓的,咱們能夠根據實際狀況自由的控制哪些端點啓用,哪些關閉,甚至還能夠修改默認的端點名稱。瀏覽器
配置端點的啓用緩存
management.endpoint.<id>.enabled
,如啓用 shutdown
端點安全
management.endpoint.shutdown.enabled=true
若是想要端點啓用是選擇加入而不是選擇退出,將management.endpoints.enabled-by-default
屬性設置 爲false
,並使用各個端點 enabled
屬性從新加入。如下示例啓用info
端點並禁用全部其餘端點session
management.endpoints.enabled-by-default=false management.endpoint.info.enabled=true
咱們啓動了 spring boot 以後,在瀏覽器地址欄中分別輸入:app
http://localhost:8080/actuator/health
maven
http://localhost:8080/actuator/beans
前面說默認狀況下大部分端點都是開啓的,那爲什麼端點 health 是能夠訪問到的,而端點 beans 確不行呢?
緣由是這些端點每每顯示的都是項目的敏感信息,默認狀況下,在 Web 下,Spring Boot 只會暴露 info h和 health 這兩個端點,其他的都不暴露
想要改變暴露的端點,要使用 include
和 exclude
屬性
屬性 | 默認 |
---|---|
management.endpoints.jmx.exposure.exclude |
|
management.endpoints.jmx.exposure.include |
* |
management.endpoints.web.exposure.exclude |
|
management.endpoints.web.exposure.include |
info, health |
爲了讓 Actuator 暴露端點,能夠配置
management.endpoints.web.exposure.include=health,info,beans
這樣就能夠訪問 beans 端點了(http://localhost:8080/actuator/beans
)
在默認狀況下,Actuator 對敏感信息是除了health 和 info 端點, 其他端點都是不暴露的。雖然能夠經過配置 application.properties 這樣的方式能夠進行訪問,可是這樣的方式從安全的角度來講是很是不利的
可使用 Spring Security 配置用戶和角色,來解決這些敏感信息的訪問權限問題,引入spring-boot-starter-security , 而後配置用戶和角色
@Configuration public class ActuatorSecurity extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests() .anyRequest().hasRole("ENDPOINT_ADMIN") .and() .httpBasic(); } }
上面的示例用於 EndpointRequest.toAnyEndpoint()
將請求與任何端點進行匹配,而後確保全部端點都具備該ENDPOINT_ADMIN
角色。其餘幾種匹配方法也可用EndpointRequest
這個時候能夠配置application.properties:
management.endpoints.web.exposure.include=*
經過這樣的配置就能夠把全部的端點都暴露出來,只是在Spring Security 中,對應保護的端點需 要擁有對應的權限才能夠進行訪問