actuaotr是spring boot項目中很是強大的一個功能,有助於對應用程序進行監控和管理,經過restful api請求來監管、審計、收集應用的運行狀況,針對微服務而言它是必不可少的一個環節。java
Endpointslinux
actuator的核心部分,它用來監視應用程序及交互,spring-boot-actuator中已經內置了很是多的Endpoints(health、info、beans、httptrace、shutdown)等等,同時也容許咱們本身擴展本身的端點web
spring boot 2.0中的端點和以前版本有較大不一樣,使用時須要注意。另外端點的監控機制也有很大不一樣,啓用了不表明能夠直接訪問,還須要將其暴露出來,傳統的management.security管理已被標記爲不推薦。redis
內置Endpointsspring
id | desc | Sensitive |
---|---|---|
auditevents |
顯示當前應用程序的審計事件信息 | Yes |
beans |
顯示應用Spring Beans的完整列表 | Yes |
caches |
顯示可用緩存信息 | Yes |
conditions |
顯示自動裝配類的狀態及及應用信息 | Yes |
configprops |
顯示全部 @ConfigurationProperties 列表 | Yes |
env |
顯示 ConfigurableEnvironment 中的屬性 | Yes |
flyway |
顯示 Flyway 數據庫遷移信息 | Yes |
health |
顯示應用的健康信息(未認證只顯示status ,認證顯示所有信息詳情) |
No |
info |
顯示任意的應用信息(在資源文件寫info.xxx便可) | No |
liquibase |
展現Liquibase 數據庫遷移 | Yes |
metrics |
展現當前應用的 metrics 信息 | Yes |
mappings |
顯示全部 @RequestMapping 路徑集列表 | Yes |
scheduledtasks |
顯示應用程序中的計劃任務 | Yes |
sessions |
容許從Spring會話支持的會話存儲中檢索和刪除用戶會話。 | Yes |
shutdown |
容許應用以優雅的方式關閉(默認狀況下不啓用) | Yes |
threaddump |
執行一個線程dump | Yes |
httptrace |
顯示HTTP跟蹤信息(默認顯示最後100個HTTP請求 - 響應交換) | Yes |
導入依賴數據庫
在pom.xml中添加spring-boot-starter-actuator的依賴api
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
若是須要訪問info接口來獲取maven中的屬性內容請記得添加以下內容瀏覽器
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>build-info</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
屬性配置緩存
在application.yml文件中配置actuator的相關配置,其中info開頭的屬性,就是訪問info端點中顯示的相關內容,值得注意的十spring boot2.x中,默認只開放了info、health兩個端點,其他的須要本身經過配置management.endpoints.web.exposure.include屬性來加載(有include天然就有exclude)。若是想單獨操做某個端點可使用management.endpoint.端點.enabled屬性進行啓用或者禁用。springboot
info: head: head body: body management: endpoints: web: exposure: #加載全部的端點,默認只加載了info、health include: '*' endpoint: health: show-details: always #能夠關閉指定的端點 shutdown: enabled: false
測試
啓動項目,瀏覽器輸入:http://localhost:8080/actuator/info
{"head":"head","body":"body"}
自定義
上面不少都是配置相關的,以及自帶的一些端點,在實際應用中又時候默認並不能知足咱們的需求。
默認裝配HealthIndicators
下列是依賴spring-boot-xxx-starter後相關HealthIndicator的實現(經過management.health.defaults.enabled屬性能夠禁用他們),但想要獲取一些額外的信息時,自定義的做用就體現出來了。
CassandraHealthIndicator |
檢查 Cassandra 數據庫是否啓動。 |
DiskSpaceHealthIndicator |
檢查磁盤空間不足。 |
DataSourceHealthIndicator |
檢查是否能夠得到鏈接 DataSource 。 |
ElasticsearchHealthIndicator |
檢查 Elasticsearch 集羣是否啓動。 |
InfluxDbHealthIndicator |
檢查 InfluxDB 服務器是否啓動。 |
JmsHealthIndicator |
檢查 JMS 代理是否啓動。 |
MailHealthIndicator |
檢查郵件服務器是否啓動。 |
MongoHealthIndicator |
檢查 Mongo 數據庫是否啓動。 |
Neo4jHealthIndicator |
檢查 Neo4j 服務器是否啓動。 |
RabbitHealthIndicator |
檢查 Rabbit 服務器是否啓動。 |
RedisHealthIndicator |
檢查 Redis 服務器是否啓動。 |
SolrHealthIndicator |
檢查 Solr 服務器是否已啓動。 |
健康端點(第一種方式)
實現HealthIndicator接口,根據本身的須要判斷返回的狀態是UP仍是DOWN,功能簡單。
import org.springframework.boot.actuate.health.Health; import org.springframework.boot.actuate.health.HealthIndicator; import org.springframework.stereotype.Component; @Component("my1") public class MyHealthIndicator implements HealthIndicator { private static final String VERSION = "v1.0.0"; @Override public Health health() { int code = 0; if(code != 0){ Health.down().withDetail("code",code).withDetail("version",VERSION).build(); } return Health.up().withDetail("code",code).withDetail("version",VERSION).up().build(); } }
輸入測試地址:http://localhost:8080/actuator/health
{ "status": "DOWN", "details": { "my1": { "status": "UP", "details": { "code": 0, "version": "v1.0.0" } }, "diskSpace": { "status": "UP", "details": { "total": 499963174912, "free": 419999891456, "threshold": 10485760 } }, "redis": { "status": "DOWN", "details": { "error": "org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to localhost:6379" } } }
能夠看到當前項目的健康程度,因爲沒有開啓linux虛擬機中的redis因此發生異常了,平時啓動項目時不去執行是不會報錯的
健康端點(第二種方式)
繼承AbstractHealthIndicator抽象類,重寫doHealthCheck方法,功能比第一種要強大一點點,默認的DataSourceHealthIndicator、RedisHealthIndicator都是這種寫法,內容回調中還作了異常的處理。
import org.springframework.boot.actuate.health.AbstractHealthIndicator; import org.springframework.boot.actuate.health.Health; import org.springframework.stereotype.Component; /** * 功能更強大,AbstractHealthIndicator實現了HealthIndicator接口 */ @Component("my2") public class MyAbstractHealthIndicator extends AbstractHealthIndicator { private static final String VERSION = "v1.0.1"; @Override protected void doHealthCheck(Health.Builder builder) throws Exception { int code = 0; if(code != 0){ builder.down().withDetail("code",code).withDetail("version",VERSION).build(); } builder.withDetail("code",code).withDetail("version",VERSION).up().build(); } }
測試 localhost:8080/actuator/health
{ "status": "DOWN", "details": { "my2": { "status": "UP", "details": { "code": 0, "version": "v1.0.1" } }, "my1": { "status": "UP", "details": { "code": 0, "version": "v1.0.0" } }, "diskSpace": { "status": "UP", "details": { "total": 499963174912, "free": 419977666560, "threshold": 10485760 } }, "redis": { "status": "DOWN", "details": { "error": "org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to localhost:6379" } } } }
定義本身的端點
info、health都是spring-boot-actuator內置的,真正要實現本身的端點還得經過@Endpoint、@ReadOperator、@WriteOperation、@DeleteOperation。
不一樣請求的操做,調用時缺乏必須參數,或者使用沒法轉換爲所需類型的參數,則不會調用操做方法,響應狀態爲400(錯誤請求)
@Endpoint 構建rest api的惟一路徑
@ReadOperation GET請求,響應狀態爲200 若是沒有返回值響應404(資源未找到)
@WriteOperation POST請求,響應狀態爲200若是沒有返回值響應204(無響應內容)
@DeleteOperation DELETE請求,響應狀態爲200若是沒有返回值響應204(無響應內容)
import org.springframework.boot.actuate.endpoint.annotation.Endpoint; import org.springframework.boot.actuate.endpoint.annotation.ReadOperation; import java.util.HashMap; import java.util.Map; @Endpoint(id = "name") public class MyEndPoint { @ReadOperation public Map<String,String> test(){ Map<String,String> result = new HashMap<>(); result.put("name","name"); result.put("age","20"); return result; } }
而後在啓動類中注入bean
import com.code.springbootactuator.endpoint.MyEndPoint; import org.springframework.boot.SpringApplication; import org.springframework.boot.actuate.autoconfigure.endpoint.condition.ConditionalOnEnabledEndpoint; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @SpringBootApplication public class SpringbootActuatorApplication { public static void main(String[] args) { SpringApplication.run(SpringbootActuatorApplication.class, args); } @Configuration static class MyEndpointConfiguration{ @Bean @ConditionalOnMissingBean @ConditionalOnEnabledEndpoint public MyEndPoint myEndPoint(){ return new MyEndPoint(); } } }
測試
啓動項目 輸入測試地址:http://localhost:8080/actuator/name
{"name":"name","age":"20"}