1. 程式人生 > >不學無數——SpringBoot入門Ⅷ

不學無數——SpringBoot入門Ⅷ

SpringBoot--Actuator

1. 初識Actuator

在開發過程中,專案被放置到生產伺服器上執行時,有可能需要我們全方位的監控應用服務的執行情況。此時SpringBoot提供了Actuator模組進行監控和管理

2. 使用方法

在gradle中新增依賴

compile("org.springframework.boot:spring-boot-starter-actuator")

然後啟動專案後會發現在啟動中發現如下的輸出資訊

這些端點資訊是暴露在外面的原生資訊,例如此時訪問http://localhost:8080/health會發現在網站中輸出如下資訊

SpringBoot2.0中對映的地址是/actuator/health

{
	"status": "UP",
	"diskSpace": {
		"status": "UP",
		"total": 250685575168,
		"free": 172327690240,
		"threshold": 10485760
	},
	"db": {
		"status": "UP",
		"database": "MySQL",
		"hello": 1
	}
}

3. 端點介紹

Actuator的端點能夠進行監控和管理應用。SpringBoot有許多的內嵌的端點,如果還需要其他的也可以自己新增。例如health端點提供了基本的應用健康資訊。

每一個獨立的端點都可以進行選擇暴露或者不暴露,預設情況下有些端點是開啟的,如果不想暴露的話,那麼可以在配置檔案中進行配置endpoints + . + name,舉例如下:

endpoints.env.enabled=false

下面給出幾個端點的簡單介紹

端點名 描述 是否預設暴露
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

3.1 自定義info端點資訊

在添加了Actuator進行訪問info端點的時候,我們會發現頁面中顯示了一個空的json資訊。如果想要顯示資訊的話,那麼可以在配置檔案中通過設定info.*進行賦值,例如:

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"
}

4. 自定義端點

有時候自帶的端點資訊不符合我們的需求,需要我們自定義一些端點資訊。在自定義端點資訊之前我們需要看一下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"
}

5. 參考文章