Spring Boot Actuator端點

Spring Boot Actuator Endpoints 讓我們能夠監控並與我們的應用程序進行交互。Spring Actuator 是 Spring Boot 的子模塊,提供了內置的端點,我們可以為我們的應用程序啟用或禁用這些端點。

Spring Boot Actuator 端點

Spring Boot Actuator 端點通過 JMX 和 HTTP 進行公開,大多數情況下,我們使用基於 HTTP 的 Actuator 端點,因為它們易於通過瀏覽器、CURL 命令、shell 腳本等進行訪問。一些有用的 Actuator 端點包括:

  1. beans:該端點返回配置在我們應用程序中的所有 bean 的列表。
  2. env:提供有關 Spring 環境屬性的信息。
  3. health:顯示應用程序的健康狀態。
  4. info:顯示應用程序的信息,我們可以在 Spring 環境屬性中進行配置。
  5. mappings:顯示所有 @RequestMapping 路徑的列表。
  6. shutdown:允許我們優雅地關閉應用程序。
  7. 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>)

注意,只有兩個端點 – healthinfo 已經映射。下面的圖像顯示了這些執行器端點的輸出。 你有沒有注意到 /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>)

現在,當您嘗試訪問受保護的執行器端點時,您將需要提供登錄憑據。以下圖像顯示了beansenv/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