- Spring Boot包含很多其他的特性,它們可以幫你監(jiān)控和管理發(fā)布到生產(chǎn)環(huán)境的應(yīng)用。你可以選擇使用HTTP端點,JMX或遠程shell(SSH或Telnet)來管理和監(jiān)控應(yīng)用。審計(Auditing),健康(health)和數(shù)據(jù)采集(metrics gathering)會自動應(yīng)用到你的應(yīng)用。
開啟production-ready特性
spring-boot-actuator模塊提供了Spring Boot所有的production-ready特性。啟用該特性的最簡單方式就是添加對spring-bootstarter-actuator ‘Starter POM’的依賴。
執(zhí)行器(Actuator)的定義:執(zhí)行器是一個制造業(yè)術(shù)語,指的是用于移動或控制東西的一個機械裝置。一個很小的改變就能讓執(zhí)行器產(chǎn)生大量的運動。
-
基于Maven的項目想要添加執(zhí)行器只需添加下面的'starter'依賴:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies> 對于Gradle,使用下面的聲明:
dependencies {
compile("org.springframework.boot:spring-boot-starter-actuator")
}
端點
執(zhí)行器端點允許你監(jiān)控應(yīng)用及與應(yīng)用進行交互。Spring Boot包含很多內(nèi)置的端點,你也可以添加自己的。例如,health端點提供了應(yīng)用的基本健康信息。
端點暴露的方式取決于你采用的技術(shù)類型。大部分應(yīng)用選擇HTTP監(jiān)控,端點的ID映射到一個URL。例如,默認情況下,health端點將被映射到/health。
下面的端點都是可用的:
| ID | 描述 | 敏感(Sensitive) |
|---|---|---|
| autoconfig | 顯示一個auto-configuration的報告,該報告展示所有auto-configuration候選者及它們被應(yīng)用或未被應(yīng)用的原因 | true |
| beans | 顯示一個應(yīng)用中所有Spring Beans的完整列表 | true |
| configprops | 顯示一個所有@ConfigurationProperties的整理列表 | true |
| dump | 執(zhí)行一個線程轉(zhuǎn)儲 | true |
| env | 暴露來自Spring ConfigurableEnvironment的屬性 | true |
| health | 展示應(yīng)用的健康信息(當(dāng)使用一個未認證連接訪問時顯示一個簡單的'status',使用認證連接訪問則顯示全部信息詳情) | false |
| info | 顯示任意的應(yīng)用信息 | false |
| metrics | 展示當(dāng)前應(yīng)用的'指標(biāo)'信息 | true |
| mappings | 顯示一個所有@RequestMapping路徑的整理列表 | true |
| shutdown | 允許應(yīng)用以優(yōu)雅的方式關(guān)閉(默認情況下不啟用) | true |
| trace | 顯示trace信息(默認為最新的一些HTTP請求) | true |
注:根據(jù)一個端點暴露的方式,sensitive參數(shù)可能會被用做一個安全提示。例如,在使用HTTP訪問sensitive端點時需要提供用戶名/密碼(如果沒有啟用web安全,可能會簡化為禁止訪問該端點)。
自定義端點
-
使用Spring屬性可以自定義端點。你可以設(shè)置端點是否開啟(enabled),是否敏感(sensitive),甚至它的id。例如,下面的application.properties改變了敏感性和beans端點的id,也啟用了shutdown。
endpoints.beans.id=springbeans endpoints.beans.sensitive=false endpoints.shutdown.enabled=true
注:前綴 endpoints + . + name 被用來唯一的標(biāo)識被配置的端點。
- 默認情況下,除了shutdown外的所有端點都是啟用的。如果希望指定選擇端點的啟用,你可以使用endpoints.enabled屬性。
例如,下面的配置禁用了除info外的所有端點:
endpoints.enabled=false
endpoints.info.enabled=true
健康信息
健康信息可以用來檢查應(yīng)用的運行狀態(tài)。它經(jīng)常被監(jiān)控軟件用來提醒人們生產(chǎn)系統(tǒng)是否停止。health端點暴露的默認信息取決于端點是如何被訪問的。對于一個非安全,未認證的連接只返回一個簡單的'status'信息。對于一個安全或認證過的連接其他詳細信息也會展示(具體參考Section 41.6, “HTTP Health endpoint access restrictions” )。
健康信息是從你的ApplicationContext中定義的所有HealthIndicator beans收集過來的。Spring Boot包含很多auto-configured的HealthIndicators,你也可以寫自己的。
安全與HealthIndicators
HealthIndicators返回的信息常常性質(zhì)上有點敏感。例如,你可能不想將數(shù)據(jù)庫服務(wù)器的詳情發(fā)布到外面。因此,在使用一個未認證的HTTP連接時,默認只會暴露健康狀態(tài)(health status)。如果想將所有的健康信息暴露出去,你可以把endpoints.health.sensitive設(shè)置為false。
為防止'拒絕服務(wù)'攻擊,Health響應(yīng)會被緩存。你可以使用 endpoints.health.time-to-live 屬性改變默認的緩存時間(1000毫秒)。
自動配置的HealthIndicators
- 下面的HealthIndicators會被Spring Boot自動配置(在合適的時候):
| 名稱 | 描述 |
|---|---|
| DiskSpaceHealthIndicator | 低磁盤空間檢測 |
| DataSourceHealthIndicator | 檢查是否能從DataSource獲取連接 |
| MongoHealthIndicator | 檢查一個Mongo數(shù)據(jù)庫是否可用(up) |
| RabbitHealthIndicator | 檢查一個Rabbit服務(wù)器是否可用(up) |
| RedisHealthIndicator | 檢查一個Redis服務(wù)器是否可用(up) |
| SolrHealthIndicator | 檢查一個Solr服務(wù)器是否可用(up) |
編寫自定義HealthIndicators
- 想提供自定義健康信息,你可以注冊實現(xiàn)了HealthIndicator接口的Spring beans。你需要提供一個health()方法的實現(xiàn),并返回一個Health響應(yīng)。Health響應(yīng)需要包含一個status和可選的用于展示的詳情。
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;
@Component
public class MyHealth implements HealthIndicator {
@Override
public Health health() {
int errorCode = check(); // perform some specific health check
if (errorCode != 0) {
return Health.down().withDetail("Error Code", errorCode).build();
}
return Health.up().build();
}
}
除了Spring Boot預(yù)定義的Status類型,Health也可以返回一個代表新的系統(tǒng)狀態(tài)的自定義Status。在這種情況下,需要提供一個HealthAggregator接口的自定義實現(xiàn),或使用management.health.status.order屬性配置默認的實現(xiàn)。
例如,假設(shè)一個新的,代碼為FATAL的Status被用于你的一個HealthIndicator實現(xiàn)中。為了配置嚴重程度,你需要將下面的配置添加到application屬性文件中:
management.health.status.order: DOWN, OUT_OF_SERVICE, UNKNOWN, UP
- 如果使用HTTP訪問health端點,你可能想要注冊自定義的status,并使用HealthMvcEndpoint進行映射。例如,你可以將FATAL映射為HttpStatus.SERVICE_UNAVAILABLE。
自定義應(yīng)用info信息
- 通過設(shè)置Spring屬性info.*,你可以定義info端點暴露的數(shù)據(jù)。所有在info關(guān)鍵字下的Environment屬性都將被自動暴露。例如,你可以將下面的配置添加到application.properties:
info.app.name=MyService
info.app.description=My awesome service
info.app.version=1.0.0
Git提交信息
info端點的另一個有用特性是,當(dāng)項目構(gòu)建完成后,它可以發(fā)布關(guān)于你的git源碼倉庫狀態(tài)的信息。如果在你的jar中包含一個git.properties文件,git.branch和git.commit屬性將被加載。
對于Maven用戶, spring-boot-starter-parent POM包含一個能夠產(chǎn)生git.properties文件的預(yù)配置插件。只需要簡單的將下面的聲明添加到你的POM中:
<build>
<plugins>
<plugin>
<groupId>pl.project13.maven</groupId>
<artifactId>git-commit-id-plugin</artifactId>
</plugin>
</plugins>
</build>
- 對于Gradle用戶可以使用一個相似的插件gradle-git,盡管為了產(chǎn)生屬性文件可能需要稍微多點工作。