Spring Boot Actuator Endpoints 讓我們能夠監控並與我們的應用程序進行交互。Spring Actuator 是 Spring Boot 的子模塊,提供了內置的端點,我們可以為我們的應用程序啟用或禁用這些端點。
Spring Boot Actuator 端點
Spring Boot Actuator 端點通過 JMX 和 HTTP 進行公開,大多數情況下,我們使用基於 HTTP 的 Actuator 端點,因為它們易於通過瀏覽器、CURL 命令、shell 腳本等進行訪問。一些有用的 Actuator 端點包括:
- beans:該端點返回配置在我們應用程序中的所有 bean 的列表。
- env:提供有關 Spring 環境屬性的信息。
- health:顯示應用程序的健康狀態。
- info:顯示應用程序的信息,我們可以在 Spring 環境屬性中進行配置。
- mappings:顯示所有 @RequestMapping 路徑的列表。
- shutdown:允許我們優雅地關閉應用程序。
- threaddump:提供應用程序的線程轉儲。
您可以從這裡獲取完整的 Spring 手動操作端點清單。
Spring 手動操作端點安全性
僅“health”和“info”端點在沒有任何安全性的情況下公開,要訪問所有其他端點,我們需要為我們的應用程序配置 Spring 安全性。這很容易實現,我們將在教程的後半部分進行介紹。
啟用 Spring 手動操作端點
當我們將 Spring 手動操作依賴添加到我們的 spring boot 項目時,它會自動啟用手動操作端點。將以下依賴項添加到您的 spring 應用程序以啟用 spring boot 手動操作端點。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
現在當您運行應用程序時,您將看到手動操作端點在日誌中被映射。
2018-06-19 15:23:20.715 INFO 6493 --- [main] o.s.b.a.e.web.EndpointLinksResolver: Exposing 2 endpoint(s) beneath base path '/actuator'
2018-06-19 15:23:20.723 INFO 6493 --- [main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/actuator/health],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)
2018-06-19 15:23:20.724 INFO 6493 --- [main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/actuator/info],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)
注意,只有兩個端點 – health
和 info
已經映射。下面的圖像顯示了這些執行器端點的輸出。
你有沒有注意到
/actuator/info
中沒有數據,這是因為我們還沒有配置它們。只需將以下屬性添加到您的 application.properties
文件中。
info.app.name=Spring Actuator Example
info.app.java.version=10
info.app.type=Spring Boot
重新啟動應用程序,您將獲得以下輸出:
自定義執行器端點基礎路徑
默認情況下,執行器端點的基礎路徑為 /actuator
,我們可以通過在應用程序屬性文件中設置 management.endpoints.web.base-path
將其更改為任何其他值。
management.endpoints.web.base-path=/management
公開其他執行器端點
我們可以通過屬性文件啟用和禁用其他執行器端點。如果要啟用所有執行器端點,請添加以下屬性。
management.endpoints.web.exposure.include=*
提供端點 ID 列表以啟用特定的執行器端點。
management.endpoints.web.exposure.include=health,info,beans,env
用於執行器端點的 Spring 安全性
請注意,我們需要將Spring 安全性添加到我們的應用程式中以啟用額外的端點,因為所有其他端點至少需要基本身份驗證。在您的應用程式中添加以下 spring 安全性依賴項。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
同時,在應用程式屬性文件中添加 spring 安全性用戶名和密碼。
spring.security.user.name=pankaj
spring.security.user.password=pankaj
重新啟動應用程式,您將看到額外的端點被映射。
2018-06-19 16:18:22.211 INFO 6627 --- [main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/management/beans],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)
2018-06-19 16:18:22.212 INFO 6627 --- [ main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/management/env],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)
2018-06-19 16:18:22.212 INFO 6627 --- [ main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/management/env/{toMatch}],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)
現在,當您嘗試訪問受保護的執行器端點時,您將需要提供登錄憑據。以下圖像顯示了
beans
和env/java.home
端點的響應。
Spring 執行器自定義端點
Spring Framework 的一個重要特點是它非常容易擴展。 我們可以使用 @Endpoint
注釋在類上創建自己的自定義執行器端點。 然後,我們必須在方法上使用 @ReadOperation
、@WriteOperation
或 @DeleteOperation
注釋,將它們公開為執行器端點 bean。 我們可以使用 @JmxEndpoint
和 @WebEndpoint
注釋創建特定於技術的端點。 這是我們自己自定義的 spring 執行器端點的示例。
package com.journaldev.spring;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
@Endpoint(id="myendpoint")
@Component
public class MyCustomEndpoints {
@ReadOperation
@Bean
public String hi() {
return "Hi from custom endpoint";
}
}
您注意到端點 ID 了嗎? 我們還需要在要啟用的執行器端點列表中配置它。 更新 application.properties
文件中的以下屬性。
management.endpoints.web.exposure.include=health,info,beans,env,myendpoint
現在,當您啟動應用程序時,請檢查日誌中是否映射了此新端點。
2018-06-19 17:06:59.743 INFO 6739 --- [main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/management/myendpoint],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)
下面的圖像顯示了在調用我們自己的自定義執行器端點時的輸出。
摘要
Spring Boot Actuator 是一個生產就緒的管理和信息模塊。 我們可以輕鬆擴展它以添加我們自己的 API 並管理我們的應用程序。
您可以從我們的 GitHub 存儲庫 下載完整的項目。
Source:
https://www.digitalocean.com/community/tutorials/spring-boot-actuator-endpoints