在開發過程當中,項目被放置到生產服務器上運行時,有可能須要咱們全方位的監控應用服務的運行狀況。此時SpringBoot提供了Actuator模塊進行監控和管理html
在gradle中添加依賴java
compile("org.springframework.boot:spring-boot-starter-actuator")
而後啓動項目後會發如今啓動中發現以下的輸出信息spring
這些端點信息是暴露在外面的原生信息,例如此時訪問http://localhost:8080/health
會發如今網站中輸出以下信息json
在
SpringBoot2.0
中映射的地址是/actuator/health
服務器
{ "status": "UP", "diskSpace": { "status": "UP", "total": 250685575168, "free": 172327690240, "threshold": 10485760 }, "db": { "status": "UP", "database": "MySQL", "hello": 1 } }
Actuator的端點可以進行監控和管理應用。SpringBoot有許多的內嵌的端點,若是還須要其餘的也能夠本身添加。例如health端點提供了基本的應用健康信息。app
每個獨立的端點均可以進行選擇暴露或者不暴露,默認狀況下有些端點是開啓的,若是不想暴露的話,那麼能夠在配置文件中進行配置endpoints + . + name
,舉例以下:ide
endpoints.env.enabled=false
下面給出幾個端點的簡單介紹spring-boot
端點名 | 描述 | 是否默認暴露 |
---|---|---|
autoconfig | 展現出全部自動配置的報告,展現自動配置的先決條件,而且分段展現出配置成功的和配置失敗的,而且展現出緣由,其中positiveMatches 是自動化配置成功的,negativeMatches 是自動化配置不成功的 |
true |
beans | 該端點用來獲取應用上下文中建立的全部Bean | true |
configprops | 展現出來全部@ConfigurationProperties 的屬性信息 |
true |
dump | 暴露出程序運行中的線程信息 | true |
env | 它用來獲取應用全部可用的環境屬性報告。包括:環境變量、JVM屬性、應用的配置配置、命令行中的參數 | true |
health | 用來獲取應用的各種健康指標信息 | true |
info | 該端點用來返回一些應用自定義的信息。默認狀況下,該端點只會返回一個空的json內容。咱們能夠在application.properties 配置文件中經過info前綴來設置一些屬性 |
true |
metrics | 該端點用來返回當前應用的各種重要度量指標,好比:內存信息、線程信息、垃圾回收信息等 | true |
mappings | 展現出全部的@RequestMapping 路徑 |
true |
trace | 該端點用來返回基本的HTTP跟蹤信息。默認狀況下,跟蹤信息的存儲採用 | true |
在添加了Actuator進行訪問info端點的時候,咱們會發現頁面中顯示了一個空的json信息。若是想要顯示信息的話,那麼能夠在配置文件中經過設置info.*
進行賦值,例如:gradle
info.app.encoding=UTF-8 info.app.java.source=1.8 info.app.java.target=1.8
這是訪問localhost:8080/info
能夠發現以下信息網站
{ "app": { "java": { "target": "1.8", "source": "1.8" }, "encoding": "UTF-8" }, "name": "BuXueWuShu" }
有時候自帶的端點信息不符合咱們的需求,須要咱們自定義一些端點信息。在自定義端點信息以前咱們須要看一下Endpoint
這個SpringBoot中的類。
public interface Endpoint<T> { //暴露在外的Id值,例如health、env String getId(); //控制Id信息是否暴露 boolean isEnabled(); //用於權限的控制 boolean isSensitive(); //訪問Id值返回的信息 T invoke(); }
發現暴露出來的端點都是實現了Endpoint
這個類,例如trace
這個端點。
@ConfigurationProperties(prefix = "endpoints.trace") public class TraceEndpoint extends AbstractEndpoint<List<Trace>> { private final TraceRepository repository; /** * Create a new {@link TraceEndpoint} instance. * @param repository the trace repository */ public TraceEndpoint(TraceRepository repository) { super("trace"); Assert.notNull(repository, "Repository must not be null"); this.repository = repository; } @Override public List<Trace> invoke() { return this.repository.findAll(); } }
而後發如今spring.factories
文件中自動配置了
org.springframework.boot.actuate.autoconfigure.EndpointAutoConfiguration,\
點進去之後發如今其中已經自動將默認的端點注入進Spring容器中了
@Bean @ConditionalOnMissingBean -- 表示在容器中沒有此實體Bean時建立 public TraceEndpoint traceEndpoint() { return new TraceEndpoint(this.traceRepository == null ? new InMemoryTraceRepository() : this.traceRepository); }
所以自定義端點也是相似的原理,咱們作個簡單的以下:
public class MyEndPoint implements Endpoint { @Override public String getId() { return "buxuewushu"; } @Override public boolean isEnabled() { return true; } @Override public boolean isSensitive() { return true; } @Override public Object invoke() { User user=new User(); user.setName("不學無數"); user.setAddress("HeNan"); return user; } }
將其放入spring.factories
自動注入進容器中
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.FirstSpringBoot.EndPoint.MyEndPoint
而後啓動項目輸入localhost:8080/buxuewushu
出現如下的信息
{ "name": "不學無數", "address": "HeNan" }