
翻譯自 spring-boot 官方文檔(版本:2.2.2.RELEASE)
Spring Boot包含了許多附加功能,可以幫助您在將應用程序推送到生產環境時監視和管理它。您可以選擇使用HTTP端點或與JMX一起管理和監視應用程序。審核、運行狀況和度量數據收集也可以自動應用於您的應用程序。
啟用生產特性
spring-boot-actuator 模塊提供所有 SpringBoot 生產特性。啟動這些特性的最簡單的方式就是引入此依賴。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
端點
actuator 端點允許你監控應用程序並與之互動。Spring Boot包含許多內置端點,允許你添加自己的端點。例如,health 端點提供基本的應用程序健康信息。
每個端點都可以啟用或禁用。這控制了端點是否被創建並且它的bean是否存在於應用程序上下文中。要遠程訪問端點,還必須通過JMX或HTTP暴露端點。大多數應用程序選擇HTTP,其中端點的ID和前綴 /actuator 被映射到URL。例如,默認情況下,health 端點映射到 /actuator/health。
以下列出了可用端點:
| ID | 說明 |
|---|---|
| auditevents | 暴露當前應用程序的審核事件信息。需要 AuditEventRepository bean |
| beans | 顯示應用程序中所有 spring bean 的完整列表。 |
| caches | 暴露可用緩存 |
| conditions | 顯示在配置和自動配置類上評估的條件,以及它們匹配或不匹配的原因。 |
| configprops | 顯示所有 @ConfigurationProperties 的整理列表。 |
| env | 暴露 Spring ConfigurableEnvironment 屬性 |
| flyway | 顯示已應用的所有 Flyway 數據庫遷移。需要 Flyway beans |
| health | 顯示應用健康信息 |
| httptrace | 顯示HTTP跟蹤信息(默認情況下,最后100個HTTP請求-響應交換)。需要 HttpTraceRepository bean |
| info | 顯示任意應用程序信息 |
| integrationgraph | 顯示了Spring集成圖。需要依賴 spring-integration-core 依賴 |
| loggers | 顯示並修改應用程序中 loggers 的配置 |
| liquibase | 顯示已應用的任何 Liquibase 數據庫遷移。需要 Liquibase bean |
| metrics | 顯示當前應用的度量信息 |
| mappings | 顯示所有 @RequestMapping 路徑的整理列表 |
| scheduledtasks | 顯示應用的定時器任務 |
| sessions | 允許從支持Spring session的 session存儲中檢索和刪除用戶 session。需要使用Spring會話的基於Servlet的web應用程序 |
| threaddump | 執行 thread dump |
如果是 web 應用(Spring MVC、Spring WebFlux、Jersey),還可以使用以下端點:
| ID | 說明 |
|---|---|
| heapdump | 返回 hprof 堆 dump 文件 |
| jolokia | 通過HTTP暴露 jmx bean(當 Jolokia 位於類路徑上時,WebFlux不可用)。需要依賴 jolokia-core |
| logfile | 返回日志文件的內容(如果已設置 logging.file.name 或 logging.file.path 屬性)。支持使用HTTP Range header 來檢索日志文件的部分內容 |
| prometheus | 以 Prometheus 服務器可以擦除的格式暴露 metric。需要依賴 micrometer-registry-prometheus |
開啟端點
默認情況下,除了 shutdown 以外的所有端點都可用。要配置端點的啟用,使用其 management.endpoint.<id>.enabled 屬性。以下示例啟用 shutdown 端點:
management.endpoint.shutdown.enabled=true
如果您希望端點啟用是選擇可用而不是選擇不可用,將 management.endpoints.enabled-by-default 屬性設置為 false ,並使用各個端點的 enabled 屬性選擇重新啟用。以下示例啟用 info 端點並禁用所有其他端點:
management.endpoints.enabled-by-default=false
management.endpoint.info.enabled=true
注意:禁用的端點將完全從應用程序上下文中刪除。如果只想更改端點暴露的技術,請改用
include和exclude屬性。
暴露端點
由於端點可能包含敏感信息,因此應仔細考慮何時暴露它們。下表顯示了內置端點的默認開啟情況:
JMX端點基本都暴露,Web端點基本不暴露(除了 health 和 info)

要更改暴露的端點,使用以下 include 和 exclude 屬性:

include 屬性列出暴露端點的id。exclude 屬性列出不應不應暴露端點的ID。 exclude 屬性優先於 include 屬性。include 和 exclude 屬性都可以配置同一個端點id。
例如,要取消通過JMX暴露所有端點,並且只暴露 health 和 info 端點,請使用以下屬性:
management.endpoints.jmx.exposure.include=health,info
* 可以用來表示所有端點。例如,要通過 HTTP 暴露除 env 和 beans 端點之外的所有內容,請使用以下屬性:
management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=env,beans
注意:* 號在YAML中有特殊含義,因此如果要包括(或排除)所有端點,請確保添加引號,如下例所示:
management:
endpoints:
web:
exposure:
include: "*"
注意:如果應用是暴露在公共環境中,強烈建議保護你的應用端點。
如果想自定義端點暴露策略,可以注冊一個 EndpointFilter bean。
保護 HTTP 端點
應該像保護其他敏感URL一樣保護HTTP端點。如果存在Spring Security,那么在默認情況下,使用 SpringSecurity 的內容協商策略來保護端點。如果希望為 HTTP 端點配置自定義安全性,例如,只允許具有特定角色的用戶訪問它們,那么 Spring Boot 提供了一些方便的 RequestMatcher 對象,可以與 Spring Security 結合使用。
典型的 Spring Security 配置可能類似於以下示例:
@Configuration(proxyBeanMethods = false)
public class ActuatorSecurity extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests((requests) ->
requests.anyRequest().hasRole("ENDPOINT_ADMIN"));
http.httpBasic();
}
}
上面的示例使用 EndpointRequest.toAnyEndpoint() 將請求與所有端點匹配,然后確保所有端點都具有 ENDPOINT_ADMIN 角色。EndpointRequest 上還提供了其他幾種匹配方法。有關詳細信息,請參閱API文檔(HTML或PDF)。
如果在防火牆后部署應用程序,您可能希望可以訪問所有 actuator 端點,而不需要身份驗證。可以通過更改 management.endpoints.web.exposure.include 屬性來執行此操作,如下所示:
management.endpoints.web.exposure.include=*
此外,如果存在Spring Security,則需要添加自定義安全配置,以允許未經身份驗證的對端點的訪問,如以下示例所示:
@Configuration(proxyBeanMethods = false)
public class ActuatorSecurity extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests((requests) ->
requests.anyRequest().permitAll());
}
}
配置端點
端點對不帶任何參數的讀取操作的響應自動緩存。要配置端點緩存響應的時間量,使用其 cache.time-to-live 屬性。以下示例將bean端點緩存的生存時間設置為10秒:
# application.properties
management.endpoint.beans.cache.time-to-live=10s
注意:
management.endpoint.<name>前綴用來唯一標識正在配置的端點。
當發出經過身份驗證的HTTP請求時,Principal被視為端點的輸入,因此,響應將不會被緩存。
Actuator web 端點超媒體
添加了一個“發現頁”,其中包含指向所有端點的鏈接。默認情況下,“發現頁”在 /actuator 可用。
配置自定義管理上下文路徑時,“發現頁”會自動從 /actuator 移動到管理上下文的根目錄。例如,如果管理上下文路徑是 /management ,那么可以從 /management 獲得發現頁。當管理上下文路徑設置為 / 時,將禁用發現頁,以防止與其他映射發生沖突。
CORS 跨域支持
跨域資源共享(CORS)是一個 W3C 規范,它允許您靈活地指定什么樣的跨域請求被授權。如果使用Spring MVC 或 Spring WebFlux,則可以配置 actuator 的 web 端點來支持此類場景。
默認情況下禁用CORS支持,並且僅在設置了 management.endpoints.web.cors.allowed-origins 屬性后才啟用。以下配置允許從 example.com 域進行 GET 和 POST 調用:
management.endpoints.web.cors.allowed-origins=https://example.com
management.endpoints.web.cors.allowed-methods=GET,POST
有關配置的完整項可以查看 CorsEndpointProperties.java
實現自定義端點
如果添加了一個使用 @Endpoint 的 @Bean,則用 @ReadOperation、@WriteOperation 或 @DeleteOperation 注解的任何方法都將自動通過JMX暴露,在web應用程序中,也可以通過HTTP暴露。端點可以使用Jersey、Spring MVC 或 Spring WebFlux 通過 HTTP 暴露。如果 Jersey 和 Spring MVC 都可用,那么將使用Spring MVC。
還可以使用 @JmxEndpoint 或 @WebEndpoint 編寫特定於技術的端點。這些端點僅限於其各自的技術。例如,@WebEndpoint 僅通過 HTTP 而不是 JMX 暴露。
可以使用 @EndpointWebExtension 和 @EndpointJmxExtension 編寫特定於技術的擴展。這些注解允許你供特定於技術的操作以擴充現有端點。
最后,如果需要訪問特定於 web 框架的功能,可以實現 Servlet 或 Spring @Controller 和 @RestController 端點,但代價是它們不能通過JMX使用,或者使用不同的web框架。
接收輸入
端點上的操作通過其參數接收輸入。當通過 web 暴露時,這些參數的值取自URL的查詢參數和JSON request body。當通過 JMX 暴露時,參數被映射到 MBean 操作的參數。默認情況下,參數是必需的。通過使用 @org.springframework.lang.Nullable 對它們進行注解,可以使它們成為可選的。
JSON請求體中的每個根屬性都可以映射到端點的一個參數。考慮以下JSON請求體:
{
"name": "test",
"counter": 42
}
這可用於調用采用String name 和 int counter 參數的寫操作。
由於端點與技術無關,因此只能在方法簽名中指定簡單類型。特別是,不支持使用定義 name 和 counter 屬性的自定義類來聲明單個參數。
注意:為了允許將輸入映射到操作方法的參數,實現端點的 Java 代碼應使用
-parameters編譯,實現端點的 Kotlin 代碼應使用-java-parameters編譯。如果使用的是 SpringBoot 的Gradle插件,或者使用的是 Maven 和spring-boot-starter-parent插件,那么這將自動發生。
輸入類型轉換
如果需要,傳遞給端點操作方法的參數將自動轉換為所需類型。在調用操作方法之前,通過 JMX 或 HTTP 請求接收的輸入將使用 ApplicationConversionService 的實例以及使用 @EndpointConverter 限定的任何 Converter 或 GenericConverter bean轉換為所需的類型。
自定義 web 端點
在 @Endpoint、@WebEndpoint 或 @EndpointWebExtension 上的操作將使用Jersey、Spring MVC 或 Spring WebFlux 通過 HTTP 自動暴露。如果Jersey和Spring MVC都可用,那么將使用Spring MVC。
Web 端點請求的 Predicates
為 web 暴露端點上的每個操作自動生成請求predicate。
path
predicate 的 path 由端點的 ID 和 web 暴露端點的基本路徑決定。默認的基本路徑是 /actuator。例如,具有ID sessions 的端點將在 predicate 中使用 /actuator/sessions 作為其路徑。
可以通過使用@Selector 注解操作方法的一個或多個參數來進一步自定義路徑。這樣的參數作為路徑變量添加到 path predicate 中。調用端點操作時,變量的值將傳遞到操作方法中。如果要捕獲所有剩余的 path 元素,可以將 @Selector(Match=ALL_REMAINING) 添加到最后一個參數中,並使其成為與 String[] 兼容的轉換類型。
HTTP 方法
predicate 的HTTP方法由操作類型決定,如下表所示:
| 操作 | HTTP 方法 |
|---|---|
| @ReadOperation | GET |
| @WriteOperation | POST |
| @DeleteOperation | DELETE |
consumes
對於使用 request body 的 @WriteOperation(HTTP POST),predicate 的 consumes 條款是 application/vnd.spring-boot.actuator.v2+json, application/json。對於所有其他操作,consumes 條款為空。
produces
predicate 的 produces 條款可以由 @DeleteOperation、@ReadOperation 和 @WriteOperation 注解的 produces 屬性確定。該屬性是可選的。如果不使用,則自動確定products條款。
如果操作方法返回 void 或 Void,則 products 條款為空。如果操作方法返回 org.springframework.core.io.Resource,則 produces 條款是 application/octet stream。對於所有其他操作,produces 條款是 application/vnd.spring-boot.actuator.v2+json, application/json。
Web 端點響應狀態
端點操作的默認響應狀態取決於操作類型(讀、寫或刪除)以及操作返回的內容(如果有)。
@ReadOperation 返回一個值,響應狀態為200(OK)。如果不返回值,則響應狀態為404(Not Found)。
如果 @WriteOperation 或 @deleteOperation 返回一個值,則響應狀態將為200(OK)。如果不返回值,則響應狀態將為204(No Content)。
如果調用的操作沒有傳必需的參數,或者參數不能轉換為必需的類型,則不會調用操作方法,響應狀態將為400(Bad Request)。
Web 端點范圍請求
HTTP 范圍請求可用於請求 HTTP 資源的一部分。當使用Spring MVC或Spring WebFlux 時,返回 org.springframework.core.io.Resource 的操作會自動支持范圍請求。
注意:使用 Jersey 時不支持范圍請求
Web 端點安全
對 web 端點或特定於 web 的端點擴展的操作可以接收當前的 java.security.Principal 或 org.springframework.boot.actuate.endpoint.SecurityContext 作為方法參數。前者通常與 @Nullable 結合使用,為經過身份驗證和未經身份驗證的用戶提供不同的行為。后者通常用於使用其 isUserInRole(String) 方法執行授權檢查。
servlet 端點
通過實現一個用 @ServletEndpoint 的類,Servlet 可以作為端點暴露出來,該類還實現了 Supplier<EndpointServlet>。Servlet 端點提供了與 Servlet 容器的更深入的集成,但以可移植性為代價。它們旨在用於將現有servlet暴露為端點。對於新端點,應盡可能首選 @Endpoint 和 @WebEndpoint 注解。
controller 端點
@ControllerEndpoint 和 @RestControllerEndpoint 可用於實現僅由Spring MVC或Spring WebFlux 暴露的端點。使用Spring MVC 和 Spring WebFlux 的標准注解(如 @RequestMapping 和 @GetMapping)的方法進行映射,端點的ID用作路徑的前綴。controller 端點提供了與Spring web框架的更深層次的集成,但以可移植性為代價。只要可能,就應該首選 @Endpoint 和 @WebEndpoint 注解。
健康信息
可以使用運行狀況信息檢查正在運行的應用程序的狀態。它經常被監控軟件用來在生產系統故障時提醒某人。health 端點暴露的信息取決於 management.endpoint.health.show-details 和 management.endpoint.health.show-components 屬性,這些屬性可以配置為以下值之一:
| 屬性名 | 說明 |
|---|---|
| never | 不顯示詳細信息 |
| when-authorized | 詳細信息僅顯示給授權用戶。可以使用 management.endpoint.health.roles 配置授權角色。 |
| always | 對所有用戶顯示詳細信息 |
默認值為 never。當用戶處於端點的一個或多個角色時,該用戶被視為已被授權。如果端點沒有配置的角色(默認),則所有經過身份驗證的用戶都被視為已授權。可以使用 management.endpoint.health.roles 屬性配置角色。
注意:如果已保護應用程序並希望使用
always,則安全配置必須允許已驗證和未驗證用戶訪問運行狀況端點。
運行狀況信息從 HealthContributorRegistry 的內容中收集(默認情況下,所有在 ApplicationContext 中定義的 HealthContributor 實例)。Spring Boot包括許多自動配置的 HealthContributors,也可以編寫自己的。
HealthContributor 可以是 HealthIndicator 或 CompositeHealthContributor。 HealthIndicator 提供實際的健康信息,包括 Status。CompositeHealthContributor 提供其他 HealthIndicator 的組合。這些貢獻者共同組成一個樹結構來表示整個系統的健康狀況。
默認情況下,最終系統運行狀況由 StatusAggregator 派生,StatusAggregator 根據狀態的有序列表對每個 HealthIndicator 的狀態進行排序。排序列表中的第一個狀態用作整體運行狀況。如果沒有 HealthIndicator 返回 StatusAggregator 已知的狀態,則使用 UNKNOWN 狀態。
注意:
HealthContributorRegistry可用於在運行時注冊和注銷運行狀況指標。
自動配置 HealthIndicator
在適當情況下,Spring Boot會自動配置以下運行 HealthIndicator:
| 類名 | 描述 |
|---|---|
| CassandraHealthIndicator | 檢查 Cassandra 數據庫是否已啟動 |
| CouchbaseHealthIndicator | 檢查 Couchbase 集群是否已啟動 |
| DiskSpaceHealthIndicator | 檢查磁盤空間是否不足 |
| ElasticSearchRestHealthContributorAutoConfiguration | 檢查 ES 集群是否已啟動 |
| HazelcastHealthIndicator | 檢查 Hazelcast 服務是否已啟動 |
| InfluxDbHealthIndicator | 檢查 InfluxDB 服務是否已啟動 |
| JmsHealthIndicator | 檢查 JMS 代理是否已啟動 |
| LdapHealthIndicator | 檢查 LDAP 服務是否已啟動 |
| MailHealthIndicator | 檢查郵件服務是否已啟動 |
| MongoHealthIndicator | 檢查 Mongo 數據庫是否已啟動 |
| Neo4jHealthIndicator | 檢查 Neo4j 數據庫是否已啟動 |
| PingHealthIndicator | 始終響應為 UP (已啟動) |
| RabbitHealthIndicator | 檢查 Rabbit 服務是否已啟動 |
| RedisHealthIndicator | 檢查 Redis 服務是否已啟動 |
| SolrHealthIndicator | 檢查 Solr 服務是否已啟動 |
注意:可以通過設置
management.health.defaults.enabled屬性來禁用它們。
寫自定義 HealthIndicator
為了提供定制化的健康信息,可以注冊實現 HealthIndicator 接口的 spring bean。需要提供 health() 方法的實現並返回一個 Health 響應。Health 響應應包含一個狀態,並且可以選擇包含要顯示的其他詳細信息。以下代碼顯示了 HealthIndicator 實現示例:
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;
@Component
public class MyHealthIndicator implements HealthIndicator {
@Override
public Health health() {
int errorCode = check(); // perform some specific health check
if (errorCode != 0) {
return Health.down().withDetail("Error Code", errorCode).build();
}
return Health.up().build();
}
}
注意:給定的
HealthIndicator的標識符是沒有HealthIndicator后綴的bean的名稱,如果存在的話。在前面的示例中,健康信息在名為my的條目中可用。
除了Spring Boot預定義的 Status 類型之外,Health 還可以返回表示新系統狀態的自定義 Status。在這種情況下,還需要提供 StatusAggregator 接口的自定義實現,或者必須使用 management.endpoint.health.status.order 配置屬性配置默認實現。
例如,假設某個 HealthIndicator 實現中正在使用代碼為 FATAL 的新 Status。要配置嚴重性順序,將以下屬性添加到應用程序屬性中:
management.endpoint.health.status.order=fatal,down,out-of-service,unknown,up
response 中的 HTTP 狀態碼反映了總體運行狀況(例如,UP 映射到200,而 OUT_OF_SERVICE 和 DOWN 映射到503)。如果通過HTTP訪問健康端點,可能還希望注冊自定義狀態映射。例如,以下屬性將 FATAL 映射到503(service unavailable):
management.endpoint.health.status.http-mapping.fatal=503
注意:如果需要更多的控制,可以定義自己的
HttpCodeStatusMapperbean。
下表顯示了內置狀態的默認狀態映射:
| 狀態 | 映射 |
|---|---|
| DOWN | SERVICE_UNAVAILABLE (503) |
| OUT_OF_SERVICE | SERVICE_UNAVAILABLE (503) |
| UP | 默認無映射, 因此狀態碼是 200 |
| UNKNOWN | 默認無映射, 因此狀態碼是 200 |
響應式 Health Indicators(健康指示器)
對於響應式應用程序,例如使用 Spring WebFlux 的應用程序,ReactiveHealthContributor 提供了一個獲取應用程序運行狀況的非阻塞協議。與傳統的 HealthContributor 類似,運行狀況信息從 ReactiveHealthContributorRegistry 的內容中收集(默認情況下,所有在 ApplicationContext 中定義的 HealthContributor 和 ReactiveHealthContributor 實例)。在彈性調度程序上執行常規的 HealthContributors 不檢查響應式 API。
注意:在響應式應用程序中,可使用
ReactiveHealthContributorRegistry在運行時注冊和注銷健康指示器。
要從響應式 API 提供定制的健康信息,可以注冊實現 ReactiveHealthIndicator 接口的 spring bean。下面的代碼顯示了一個示例 ReactiveHealthIndicator 實現:
@Component
public class MyReactiveHealthIndicator implements ReactiveHealthIndicator {
@Override
public Mono<Health> health() {
return doHealthCheck() //perform some specific health check that returns a Mono<Health>
.onErrorResume(ex -> Mono.just(new Health.Builder().down(ex).build()));
}
}
注意:要自動處理錯誤,請考慮從
AbstractReactiveHealthIndicator繼承。
自動配置 ReactiveHealthIndicators
在適當的情況下,Spring Boot 會自動配置以下 ReactiveHealthIndicators:
| 名稱 | 描述 |
|---|---|
| CassandraReactiveHealthIndicator | 檢查 Cassandra 數據庫是否啟動 |
| CouchbaseReactiveHealthIndicator | 檢查 Couchbase 集群是否啟動 |
| MongoReactiveHealthIndicator | 檢查 Mongo 數據庫是否啟動 |
| RedisReactiveHealthIndicator | 檢查 Redis 服務是否啟動 |
注意:如有必要,用響應式指示器代替常規指示器。此外,未顯式處理的任何
HealthIndicator都將自動包裝。
健康分組
有時將健康指標組織成可用於不同目的的組是有用的。例如,如果將應用程序部署到Kubernetes,可能需要一組不同的健康指標來表示您的“liveness”和“readiness”探測。
要創建運行狀況指示器分組,可以使用 management.endpoint.health.group.<name> 屬性,並指定要 include 或 exclude 的運行狀況指示器ID列表。例如,要創建僅包含數據庫指標的分組,可以定義以下內容:
management.endpoint.health.group.custom.include=db
然后可以點擊 localhost:8080/actuator/health/custom 來檢查結果。
默認情況下,分組將繼承與系統運行狀況相同的 StatusAggregator 和 HttpCodeStatusMapper 設置,也可以按組定義這些設置。如果需要,還可以覆蓋 show-details 和 roles 屬性。
management.endpoint.health.group.custom.show-details=when-authorized
management.endpoint.health.group.custom.roles=admin
management.endpoint.health.group.custom.status.order=fatal,up
management.endpoint.health.group.custom.status.http-mapping.fatal=500
注意:如果需要注冊自定義
StatusAggregator或HttpCodeStatusMapperbean以用於分組,則可以使用@Qualifier("groupname")。
應用信息
應用程序信息暴露從 ApplicationContext 中定義的所有 InfoContributor bean收集的各種信息。Spring Boo t包含許多自動配置的 InfoContributor bean,可以編寫自己的bean。
自動配置 InfoContribotors(信息貢獻者)
如果合適,以下 InfoContributor bean由 Spring Boot 自動配置:
| 名稱 | 描述 |
|---|---|
| EnvironmentInfoContributor | 暴露在 info key下的 Environment 的任意 key |
| GitInfoContributor | 如果 git.properties 文件可用,則暴露 git 信息 |
| BuildInfoContributor | 如果 META-INF/build-info.properties 文件可用,則暴露構建信息 |
注意:通過設置
management.info.defaults.enabled屬性,可以將它們全部禁用。
自定義應用信息
通過設置 info.* Spring屬性,可以自定義 info 端點暴露的數據。info key 下的所有 Environment 屬性都將自動暴露。例如,可以將以下設置添加到 application.properties 文件中:
info.app.encoding=UTF-8
info.app.java.source=1.8
info.app.java.target=1.8
注意:還可以在構建時擴展信息屬性,而不是硬編碼這些值。
假設使用Maven,可以重寫前面的示例,如下所示:
info.app.encoding=@project.build.sourceEncoding@
info.app.java.source=@java.version@
info.app.java.target=@java.version@
git commit 信息
info 端點的另一個有用特性是,它能夠發布有關項目生成時 git 源代碼倉庫狀態的信息。如果 GitProperties bean可用,那么 git.branch、git.commit.id 和 git.commit.time 屬性將被暴露。
注意:如果
git.properties文件在類路徑的根目錄下可用,則會自動配置GitPropertiesbean。有關更多詳細信息,請參閱“生成git信息”。
如果要顯示完整的git信息(即 git.properties 的完整內容),請使用 management.info.git.mode 屬性,如下所示:
management.info.git.mode=full
構建信息
如果 BuildProperties bean可用,那么info 端點也可以發布關於你的構建信息。如果類路徑中有一個 META-INF/build-info.properties 文件,就會發生這種情況。
注意:Maven 和 Gradle 插件都可以生成該文件。有關詳細信息,請參閱“生成生成信息”。
寫自定義 InfoContributors
為了提供定制的應用程序信息,可以注冊實現 InfoContributor 接口的 spring bean。
以下示例提供了一個具有單個值的示例鍵值對:
import java.util.Collections;
import org.springframework.boot.actuate.info.Info;
import org.springframework.boot.actuate.info.InfoContributor;
import org.springframework.stereotype.Component;
@Component
public class ExampleInfoContributor implements InfoContributor {
@Override
public void contribute(Info.Builder builder) {
builder.withDetail("example",
Collections.singletonMap("key", "value"));
}
}
如果使用 info 端點,則應看到包含以下附加鍵值對的響應:
{
"example": {
"key" : "value"
}
}
使用 HTTP 監控和管理
如果正在開發一個web應用程序,Spring Boot Actuator 會自動配置所有啟用的端點,使其通過 HTTP 暴露。默認約定是使用前綴為 /actuator 的端點的 id 作為URL路徑。例如,health 暴露為 /actuator/health。
注意:actuator 由 Spring MVC、Spring WebFlux 和 Jersey 提供本地支持。如果 Jersey 和 Spring MVC 都可用,那么將使用 Spring MVC。
自定義management端點路徑
有時,自定義 management 端點的前綴很有用。例如,應用程序可能已經將 /actuator 用於其他目的。可以使用 management.endpoints.web.base-path 屬性更改 management 端點的前綴,如下例所示:
management.endpoints.web.base-path=/manage
前面的 application.properties 示例將端點從 /actuator/{id} 更改為 /manage/{id}(例如 /manage/info)。
注意:除非 management 端口已配置為 使用其他HTTP端口暴露端點,否則
management.endpoints.web.base-path是基於server.servlet.context-path的相對路徑。如果配置了management.server.port,則management.endpoints.web.base-path是基於management.server.servlet.context-path的相對路徑。
如果要將端點映射到其他路徑,可以使用 management.endpoints.web.path-mapping 屬性。以下示例將 /actuator/health 映射到 /healthcheck:
# application.properties
management.endpoints.web.base-path=/
management.endpoints.web.path-mapping.health=healthcheck
自定義management服務端口
基於雲的部署,使用默認 HTTP 端口暴露 management 端點是一個明智的選擇。但是,如果應用程序在自己的數據中心內運行,可能更願意使用不同的HTTP端口來暴露端點。
可以設置 management.server.port 屬性以更改HTTP端口,如下例所示:
management.server.port=8081
注意:在Cloud Foundry上,默認情況下,應用程序僅在端口8080上接收HTTP和TCP路由請求。如果要在Cloud Foundry上使用自定義管理端口,則需要顯式設置應用程序的路由以將流量轉發到自定義端口。
配置特定management SSL
當配置為使用自定義端口時,還可以使用各種 management.server.ssl.* 屬性使用自己的SSL配置management服務器。例如,這樣做可以讓management服務器通過HTTP可用,而主應用程序使用HTTPS,如以下屬性設置所示:
server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:store.jks
server.ssl.key-password=secret
management.server.port=8080
management.server.ssl.enabled=false
或者,主服務和management服務都可以使用SSL,但使用不同的key stores,如下所示:
server.port=8443
server.ssl.enabled=true
server.ssl.key-store=classpath:main.jks
server.ssl.key-password=secret
management.server.port=8080
management.server.ssl.enabled=true
management.server.ssl.key-store=classpath:management.jks
management.server.ssl.key-password=secret
自定義management服務地址
通過設置 management.server.address 屬性,可以自定義management端點可用的地址。如果只想監聽內部或面向ops的網絡,或者只監聽本地主機的連接,那么這樣做會很有用。
注意:只有當端口與主服務器端口不同時,才能監聽其他地址。
以下 application.properties 示例不允許遠程management連接:
management.server.port=8081
management.server.address=127.0.0.1
禁用 HTTP 端點
如果不想通過HTTP暴露端點,可以將management端口設置為 -1,如下例所示:
management.server.port=-1
也可以使用 management.endpoints.web.exposure.exclude 屬性來實現,如下例所示:
management.endpoints.web.exposure.exclude=*
使用 JMX 監控和管理
Java Management Extensions(JMX)提供了監控和管理應用程序的標准機制。默認情況下,此功能未啟用,可以通過將配置屬性 spring.jmx.enabled 設置為 true 來啟用。默認情況下,SpringBoot 將管理端點暴露為 org.springframework.boot 域下的JMX MBeans。
自定義MBean名稱
MBean 的名稱通常由端點的 id 生成。例如,health 端點暴露為 org.springframework.boot:type=Endpoint, name=Health。
如果應用程序包含多個Spring ApplicationContext,則可能會發現名稱沖突。要解決此問題,可以將 spring.jmx.unique-names 屬性設置為 true,以便MBean名稱始終是唯一的。
還可以自定義端點在其下暴露的JMX域。以下設置顯示了在 application.properties 中執行此操作的示例:
spring.jmx.unique-names=true
management.endpoints.jmx.domain=com.example.myapp
禁用 JMX 端點
management.endpoints.jmx.exposure.exclude=*
通過HTTP為JMX使用Jolokia
Jolokia是一個JMX-HTTP橋梁,它提供了訪問 JMX bean的另一種方法。要使用Jolokia,需包含對 org.jolokia:jolokia-core 的依賴。
<dependency>
<groupId>org.jolokia</groupId>
<artifactId>jolokia-core</artifactId>
</dependency>
然后,可以通過將 Jolokia 或 * 添加到 management.endpoints.web.exposure.include 屬性中來暴露 Jolokia 端點。然后可以在管理HTTP服務器上使用 /actuator/jolokia 訪問它。
自定義Jolokia
Jolokia有許多設置,傳統上可以通過設置servlet參數來配置這些設置。使用Spring Boot,可以使用 application.properties 文件。為此,在參數前面加上 management.endpoint.jolokia.config.,如下例所示:
management.endpoint.jolokia.config.debug=true
禁用Jolokia
如果使用Jolokia但不希望Spring Boot對其進行配置,如下設置:
management.endpoint.jolokia.enabled=false
Loggers
Spring Boot Actuator 能夠在運行時查看和配置應用程序的日志級別。可以查看整個列表或單個 logger 的配置,該配置由顯式配置的日志記錄級別和日志框架為其提供的有效 logging level 組成。這些 level 可以是:
- TRACE
- DEBUG
- INFO
- WARN
- ERROR
- FATAL
- OFF
- null
null 表示沒有顯式配置。
配置 Logger
要配置給定的 logger,將部分實體 POST 到資源的URI,如下例所示:
{
"configuredLevel": "DEBUG"
}
注意:要“重置”logger的特定級別(並改用默認配置),可以將null值作為
configuredLevel傳遞。
指標
Spring Boot Actuator為Micrometer提供依賴管理和自動配置,Micrometer 是一個支持多種監視系統的應用程序度量門面(外觀模式,相當於slf4j 與 logback),包括:
- AppOptics
- Atlas
- Datadog
- Dynatrace
- Elastic
- Ganglia
- Graphite
- Humio
- Influx
- JMX
- KairosDB
- New Relic
- Prometheus
- SignalFx
- Simple(in-memory)
- StatsD
- Wavefront
啟動
Spring Boot 自動配置一個復合的 MeterRegistry,並為在類路徑上找到的每個受支持的實現向復合添加一個注冊表。在運行時類路徑中依賴於 micrometer-registry-{system} 就足夠讓Spring Boot配置注冊表。
大多數注冊中心都有共同的特點。例如,即使 Micrometer 注冊表實現位於類路徑上,也可以禁用特定注冊。例如,要禁用 Datadog:
management.metrics.export.datadog.enabled=false
Spring Boot還將向 Metrics 類上的全局靜態組合注冊表添加任何自動配置的注冊,除非明確告訴它不要:
management.metrics.use-global-registry=false
在向注冊表注冊任何 meter (儀表)之前,可以注冊任意數量的 MeterRegistryCustomizer bean以進一步配置注冊表,例如應用公共標記:
@Bean
MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {
return registry -> registry.config().commonTags("region", "us-east-1");
}
通過指定更加具體泛型類型,可以將自定義應用於特定的注冊表實現:
@Bean
MeterRegistryCustomizer<GraphiteMeterRegistry> graphiteMetricsNamingConvention() {
return registry -> registry.config().namingConvention(MY_CUSTOM_CONVENTION);
}
設置就緒后,可以在組件中插入 MeterRegistry 並注冊 metrics:
@Component
public class SampleBean {
private final Counter counter;
public SampleBean(MeterRegistry registry) {
this.counter = registry.counter("received.messages");
}
public void handleMessage(String message) {
this.counter.increment();
// handle message implementation
}
}
Spring Boot 還配置了內置的工具(即 MeterBinder 實現),可以通過配置或專用的注解標記來控制這些工具。
支持監控系統
略
支持指標(metrics)
如果可用,Spring Boot將注冊以下核心指標:
- JVM 指標,利用率報告:
- 各種內存和緩存池
- 與 GC(垃圾收集)相關的統計信息
- 線程利用率
- 記載/卸載類的數量
- CPU 指標
- 文件描述符指標
- Kafka 消費指標
- Log4j2 指標:記錄每個 Log4j2 日志級別的事件數
- Logback 指標:記錄每個級別 Log4j2 日志級別的事件數
- Uptime 指標:報告正常運行時間的指標和表示應用程序絕對啟動時間的固定指標
- Tomcat 指標:要注冊所有 tomcat 指標,必須將
server.tomcat.mbeanregistry.enabled設置為true - Spring 集成指標
Spring MVC 指標
自動配置允許檢測Spring MVC處理的請求。當 management.metrics.web.server.request.autotime.enabled 為 true 時,將對所有請求執行此檢測。或者,當設置為 false 時,可以通過向請求處理方法添加 @Timed 來啟用檢測:
@RestController
@Timed // ①
public class MyController {
@GetMapping("/api/people")
@Timed(extraTags = { "region", "us-east-1" }) // ②
@Timed(value = "all.people", longTask = true) // ③
public List<Person> listPeople() { ... }
}
①:controller 類,用於對 controller 中的每個請求處理程序啟用計時。
②:為單個端點啟用的方法。如果在類上有它,則這里不是必要的,但可以用於進一步自定義此特定端點的計時器。
③:使用參數為 longtask = true 的方法為該方法啟用長任務計時器。長任務計時器需要單獨的度量名稱,並且可以與短任務計時器堆疊在一起。
默認情況下,使用名稱 http.server.requests 生成指標。可以通過設置 management.metrics.web.server.request.metric-name 屬性自定義名稱。
默認情況下,與 Spring MVC 相關的指標標簽有以下信息:
| 標簽 | 說明 |
|---|---|
exception |
處理請求時引發的任何異常的簡單類名。 |
method |
請求方法(例如 GET 或 POST) |
outcome |
基於響應狀態碼的請求結果。1xx是信息性的,2xx是成功的,3xx是重定向,4xx是客戶端錯誤,5xx是服務器錯誤 |
status |
響應的HTTP狀態碼(例如,200 或 500) |
uri |
如果可能,在變量替換之前請求的URI模板(例如,/api/person/{id}) |
要自定義標簽,需提供一個實現 WebMvcTagsProvider 的 @Bean。
Spring WebFlux 指標
自動配置允許檢測由 WebFlux controller 和功能處理程序處理的所有請求。
默認情況下,使用 http.server.requests 生成指標。可以通過設置 management.metrics.web.server.request.metric-name 屬性自定義名稱。
默認情況下,與WebFlux相關的度量標簽有以下信息:(與Spring WVC 一樣)
| 標簽 | 說明 |
|---|---|
exception |
處理請求時引發的任何異常的簡單類名。 |
method |
請求方法(例如 GET 或 POST) |
outcome |
基於響應狀態碼的請求結果。1xx是信息性的,2xx是成功的,3xx是重定向,4xx是客戶端錯誤,5xx是服務器錯誤 |
status |
響應的HTTP狀態碼(例如,200 或 500) |
uri |
如果可能,在變量替換之前請求的URI模板(例如,/api/person/{id}) |
要自定義標簽,需提供一個實現 WebFluxTagsProvider 的 @Bean。
Jersey 服務指標
略
HTTP Client 指標
Spring Boot Actuator 管理 RestTemplate 和 WebClient 的檢測。為此,必須注入自動配置的生成器並使用它創建實例:
- 用於構建
RestTemplate的RestTemplateBuilder - 用於構建
WebClient的WebClient.Builder
也可以手動應用負責此檢測的自定義程序,即 MetricsRestTemplateCustomizer 和 MetricsWebClientCustomizer。
默認情況下,使用 http.client.requests 生成指標。可以通過設置 management.metrics.web.client.request.metric-name 屬性自定義名稱。
默認情況下,由檢測客戶端生成的指標標簽有以下信息:
| 標簽 | 說明 |
|---|---|
clientName |
URI 的 host 部分 |
method |
請求方法(例如 GET 或 POST) |
outcome |
基於響應狀態碼的請求結果。1xx是信息性的,2xx是成功的,3xx是重定向,4xx是客戶端錯誤,5xx是服務器錯誤 |
status |
響應的HTTP狀態碼(例如,200 或 500) |
uri |
如果可能,在變量替換之前請求的URI模板(例如,/api/person/{id}) |
要自定義標簽,並且根據你選擇的客戶端,可以提供一個實現 RestTemplateExchangeTagsProvider 或 WebClientExchangeTagsProvider 的 @Bean。其中有一些方便的靜態函數。
緩存指標
自動配置在啟動時啟用所有可用 Cache 的檢測,並以 cache 為指標前綴。緩存檢測是為一組基本的度量標准而標准化的。此外,還提供了特定於緩存的指標。
支持以下緩存庫:
- Caffeine
- EhCache 2
- Hazelcast
- 任何兼容的JCache(JSR-107)實現
指標由緩存的名稱和從 bean 名稱派生的 CacheManager 的名稱進行標記。
注意:只有啟動時可用的緩存才綁定到注冊表。對於在啟動階段之后動態或以編程方式創建的緩存,需要顯式注冊。
CacheMetricsRegistrarbean 可用於簡化該過程。
DataSource 指標
自動配置啟用所有可用 DataSource 對象的檢測,這些對象的指標以 jdbc.connections 為前綴。數據源儀表的結果是表示池中當前活躍(active)、空閑(idle)、最大允許(maximum allowed)和最小允許(minimum allowed)連接的儀表。
指標也由基於 bean 名稱計算的 DataSource 的名稱進行標記。
注意:默認情況下,Spring Boot為所有受支持的數據源提供元數據;如果喜愛的數據源不受現成支持,則可以添加其他
DataSourcePoolMetadataProviderbean。有關示例,請參閱DataSourcePoolMetadataProvidersConfiguration配置。
此外,Hikari 特定的指標也以 hikaricp 前綴暴露。每個指標都由池的名稱標記(可以用 spring.datasource.name 控制)。
Hibernate 指標
自動配置允許檢測所有可用的Hibernate EntityManagerFactory 實例,這些實例使用名為 hibernate 的指標啟用了統計信息。
指標也由從bean名稱派生的 EntityManagerFactory 的名稱進行標記。
要啟用統計信息,標准JPA屬性 hibernate.generate_statistics 必須設置為 true。可以在自動配置的 EntityManagerFactory 上啟用該功能,如下例所示:
spring.jpa.properties.hibernate.generate_statistics=true
RabbitMQ 指標
自動配置將使用名為 rabbitmq 的指標啟用所有可用 RabbitMQ 連接工廠的檢測。
注冊自定義metrics(指標)
要注冊自定義指標,將 MeterRegistry 注入組件,如下例所示:
class Dictionary {
private final List<String> words = new CopyOnWriteArrayList<>();
Dictionary(MeterRegistry registry) {
registry.gaugeCollectionSize("dictionary.size", Tags.empty(), this.words);
}
// …
}
如果發現在組件或應用程序之間反復插入一組指標,則可以將該組封裝在 MeterBinder 實現中。默認情況下,來自所有 MeterBinder bean的指標將自動綁定到Spring管理的 MeterRegistry。
定制個別metrics(指標)
如果需要將自定義應用於特定的 Meter 實例,可以使用 io.micrometer.core.instrument.config.MeterFilter 接口。默認情況下,所有 MeterFilter bean都將自動應用於 micrometer MeterRegistry.Config。
例如,如果要將以 com.example 開頭的所有meter(儀表) ID的 mytag.region 標簽重命名為 mytag.area,可以執行以下操作:
@Bean
public MeterFilter renameRegionTagMeterFilter() {
return MeterFilter.renameTag("com.example", "mytag.region", "mytag.area");
}
公共標簽
公共標簽通常用於操作環境(如主機、實例、區域、堆棧等)上的維度向下鑽取。公共標記應用於所有儀表,可以配置為如下示例所示:
management.metrics.tags.region=us-east-1
management.metrics.tags.stack=prod
上面的示例將 region 和 stack 標簽分別添加到值為 us-east-1 和 prod 的所有儀表。
注意:如果使用Graphite,公共標簽的順序很重要。由於使用這種方法無法保證公共標簽的順序,建議 Graphite 用戶定義一個自定義
MeterFilter。
每個儀表的屬性
除了 MeterFilter beans之外,還可以使用屬性在每個儀表的基礎上應用一組有限的定制。每個儀表自定義適用於以給定名稱開頭的所有儀表 ID。例如,下面將禁用以 example.remote 開頭的ID的任何儀表
management.metrics.enable.example.remote=false
以下屬性允許按儀表自定義:
| 屬性 | 說明 |
|---|---|
management.metrics.enable |
是否拒絕儀表發出任何指標 |
management.metrics.distribution.percentiles-histogram |
是否發布適合計算可聚合(跨維度)百分位近似的直方圖。 |
management.metrics.distribution.minimum-expected-value, management.metrics.distribution.maximum-expected-value |
通過限制期望值的范圍,發布更少的直方圖桶。 |
management.metrics.distribution.percentiles |
發布應用程序中計算的百分比值 |
management.metrics.distribution.sla |
發布包含由sla定義的桶的累積直方圖 |
有關百分位直方圖、百分位和sla背后概念的更多詳細信息,請參閱
micrometer 文檔的“直方圖和百分位”部分。
指標端點
Spring Boot提供了一個 metrics 端點,可用於診斷性地檢查應用程序收集的指標。默認情況下,端點不可用,必須暴露,有關詳細信息,請參閱暴露端點。
導航到 /actuator/metrics 將顯示可用儀表名稱的列表。可以通過提供特定儀表的名稱作為選擇器(例如 /actuator/metrics/jvm.memory.max)來深入查看該儀表的信息。
注意:在這里使用的名稱應該與代碼中使用的名稱匹配,而不是在為它所傳送到的監視系統規范化命名約定之后使用的名稱。換句話說,如果由於 Prometheus 中的下划線命名約定,
jvm.memory.max在 Prometheus 中顯示為jvm_memory_max,則在檢查指標端點中的儀表時,仍應使用jvm.memory.max作為選擇器。
還可以在URL的末尾添加任意數量的 tag=KEY:VALUE 查詢參數,以便在儀表上按維度向下鑽取,例如 /actuator/metrics/jvm.memory.max?tag=area:nonheap。
報告的測量值是與儀表名稱匹配的所有儀表和已應用的任何標簽的統計值之和。因此,在上面的示例中,返回的“值”統計量是堆的“代碼緩存”、“壓縮類空間”和“元區域”區域的最大內存足跡的總和。如果只想看到“元區域”的最大大小,可以添加一個額外的 tag=id:Metaspace,即 /actuator/metrics/jvm.memory.max?tag=area:nonheap&tag=id:Metaspace。
審計
一旦Spring Security發揮作用,Spring Boot Actuator 就有一個靈活的審計框架來發布事件(默認情況下,“驗證成功”、“失敗”和“拒絕訪問”異常)。此功能對於報告和實現基於身份驗證失敗的鎖定策略非常有用。
可以通過在應用程序的配置中提供 AuditEventRepository 類型的bean來啟用審核。為了方便起見,Spring Boot提供了一個 InMemoryAuditEventRepository。InMemoryAuditEventReportory 的功能有限,建議僅在開發環境中使用它。對於生產環境,請考慮創建自己的替代 AuditEventRepository 實現。
自定義審計
要自定義已發布的安全事件,可以提供自己的 AbstractAuthenticationAuditListener 和 AbstractAuthorizationAuditListener 實現。
還可以為業務事件使用審計服務。為此,將 AuditEventRepository bean注入自己的組件並直接使用它,或者使用 Spring ApplicationEventPublisher 發布 AuditApplicationEvent(通過實現 ApplicationEventPublisherAware)。
HTTP Tracing(調用鏈)
可以通過在應用程序的配置中提供 HttpTraceRepository 類型的bean來啟用HTTP Tracing。為了方便起見,SpringBoot 提供了一個 InMemoryHttpTraceRepository,默認情況下,它存儲最后100個請求-響應的追蹤。默認情況下。與其他跟蹤解決方案相比, InMemoryHttpTraceRepository 功能有限,建議僅在開發環境中使用。對於生產環境,建議使用生產就緒 tracing 或可觀測性解決方案,如 Zipkin 或 Spring Cloud Sleuth。或者,創建自己的 HttpTraceRepository 來滿足需求。
httptrace 端點可用於獲取有關存儲在 HttpTraceRepository 中的請求-響應的信息。
自定義 HTTP Tracing
要自定義每個 trace 中包含的項,使用 management.trace.http.include 配置屬性。對於高級自定義,注冊自己的 HttpExchangeTracer 實現。
進程監控
在 spring-boot 模塊中,可以找到兩個類來創建通常對進程監視有用的文件:
ApplicationPidFileWriter創建一個包含應用程序PID的文件(默認情況下,在文件名為application.pid的應用程序目錄中)。WebServerPortFileWriter創建一個(或多個)文件,其中包含正在運行的web服務器的端口(默認情況下,在文件名為application.port的應用程序目錄中)。
默認情況下,這些寫入程序未激活,但可以啟用:
- 通過擴展配置
- 以編程方式
擴展配置方式
在 META-INF/spring.factories 文件中,可以激活編寫PID文件的監聽器,如下:
org.springframework.context.ApplicationListener=\
org.springframework.boot.context.ApplicationPidFileWriter,\
org.springframework.boot.web.context.WebServerPortFileWriter
編程方式
還可以通過調用 SpringApplication.addListeners() 方法並傳遞適當的 Writer 對象來激活監聽器。此方法還允許自定義 Writer 構造函數中的文件名和路徑。
支持 Cloud Foundry
Spring Boo 的 actuator 模塊包括在部署到兼容的 Cloud Foundry 實例時激活的附加支持。/cloudfoundryapplication 路徑提供了到所有 @Endpoint bean的安全路由。
擴展的支持使 Cloud Foundry 管理ui(例如可以用來查看已部署應用程序的web應用程序)得到了 Spring Boot actuator 信息的增強。例如,應用程序狀態頁可能包含完整的運行狀況信息,而不是典型的“運行”或“停止”狀態。
注意:普通用戶無法直接訪問
/cloudfoundryapplication路徑。要使用端點,必須隨請求一起傳遞有效的 UAA 令牌。
禁用擴展Cloud Foundry Actuator 支持
如果要完全禁用 /cloudfoundryapplication 端點,可以將以下設置添加到 application.properties文件中:
management.cloudfoundry.enabled=false
Cloud Foundry 自簽名證書
默認情況下,/cloudfoundryapplication 端點的安全驗證對各種Cloud Foundry服務進行SSL調用。如果 Cloud Foundry UAA 或雲控制器服務使用自簽名證書,則需要設置以下屬性:
management.cloudfoundry.skip-ssl-validation=true
自定義上下文路徑
如果服務器的上下文路徑已配置為/,則Cloud Foundry 端點在應用程序的根目錄中將不可用。例如,如果 server.servlet.context-path=/app,那么 Cloud Foundry 端點將在 /app/cloudfoundryapplication/* 上可用。
如果希望 Cloud Foundry 端點始終在 /cloudfoundryapplication/* 處可用,則無論服務器的上下文路徑如何,都需要在應用程序中顯式配置它。根據使用的web服務器,配置將有所不同。對於Tomcat,可以添加以下配置:
@Bean
public TomcatServletWebServerFactory servletWebServerFactory() {
return new TomcatServletWebServerFactory() {
@Override
protected void prepareContext(Host host, ServletContextInitializer[] initializers) {
super.prepareContext(host, initializers);
StandardContext child = new StandardContext();
child.addLifecycleListener(new Tomcat.FixContextListener());
child.setPath("/cloudfoundryapplication");
ServletContainerInitializer initializer = getServletContextInitializer(getContextPath());
child.addServletContainerInitializer(initializer, Collections.emptySet());
child.setCrossContext(true);
host.addChild(child);
}
};
}
private ServletContainerInitializer getServletContextInitializer(String contextPath) {
return (c, context) -> {
Servlet servlet = new GenericServlet() {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
ServletContext context = req.getServletContext().getContext(contextPath);
context.getRequestDispatcher("/cloudfoundryapplication").forward(req, res);
}
};
context.addServlet("cloudfoundry", servlet).addMapping("/*");
};
}
資料
官方文檔
公眾號:逸飛兮(專注於 Java 領域知識的深入學習,從源碼到原理,系統有序的學習)

