Spring Boot Actuator提供一系列HTTP端點來暴露項目信息,用來監控和管理項目。在Maven中,能夠添加如下依賴:web
<!-- Spring boot starter: actuator --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
[注] 在某些包中已經自動綁定了Spring Boot Actuator包,好比一些Cloud包spring-cloud-starter-security,spring-cloud-starter-netflix-eureka-server等,這時候不用再重複添加該依賴。spring
Actuator提供瞭如下端點,默認除了/shutdown都是Enabled。使用時須要加/actuator前綴,如http://localhost:8080/my-app/actuator/health。數據庫
ID | Description | Enabled by default |
---|---|---|
auditevents | 顯示當前應用程序的審計事件信息 | Yes |
beans | 顯示應用上下文中建立的全部Bean | Yes |
caches | 獲取緩存信息 | Yes |
conditions | 顯示配置類和自動配置類(configuration and auto-configuration classes) 的狀態及它們被應用或未被應用的緣由 | Yes |
configprops | 該端點用來獲取應用中配置的屬性信息報告 (全部@ConfigurationProperties的集合列表) | Yes |
env | 獲取應用全部可用的環境屬性報告。包括: 環境變量、JVM屬性、應用的配置配置、命令行中的參數 | Yes |
flyway | 顯示數據庫遷移路徑(若是有) | Yes |
health | 顯示應用的健康信息 | Yes |
httptrace | 返回基本的HTTP跟蹤信息。 (默認最多100 HTTP request-response exchanges). | Yes |
info | 返回一些應用自定義的信息,咱們能夠在application.properties 配置文件中經過info前綴來設置這些屬性:info.app.name=spring-boot-hello | Yes |
integrationgraph | Shows the Spring Integration graph. | Yes |
loggers | Shows and modifies the configuration of loggers in the application. | Yes |
liquibase | Shows any Liquibase database migrations that have been applied. | Yes |
metrics | 返回當前應用的各種重要度量指標,好比:內存信息、線程信息、垃圾回收信息等 | Yes |
mappings | 返回全部Spring MVC的控制器映射關係報告 (全部@RequestMapping路徑的集合列表) | Yes |
scheduledtasks | 顯示應用程序中的計劃任務 | Yes |
sessions | 容許從Spring會話支持的會話存儲中檢索和刪除(retrieval and deletion) 用戶會話。使用Spring Session對反應性Web應用程序的支持時不可用 | Yes |
shutdown | 容許應用以優雅的方式關閉(默認狀況下不啓用) | No |
threaddump | 執行一個線程dump | Yes |
若是使用web應用(Spring MVC, Spring WebFlux, 或者 Jersey),還可使用如下端點:緩存
ID | Description | Enabled by default |
---|---|---|
heapdump | 返回一個GZip壓縮的hprof堆dump文件 | Yes |
jolokia | 經過HTTP暴露JMX beans(當Jolokia在類路徑上時,WebFlux不可用) | Yes |
logfile | 返回日誌文件內容(若是設置了logging.file或logging.path屬性的話), 支持使用HTTP Range頭接收日誌文件內容的部分信息 | Yes |
prometheus | 以能夠被Prometheus服務器抓取的格式顯示metrics信息 | Yes |
若是要啓用/禁用某個端點,可使用management.endpoint.<id>.enabled屬性:服務器
management:
endpoint:
shutdown:
enabled: true
另外能夠經過management.endpoints.enabled-by-default來修改全局端口默認配置,好比下面禁用全部端點只啓用info端點:session
management: endpoints: enabled-by-default: false endpoint: info: enabled: true
上面是啓用/禁用(enable)某個端點,若是使某個端點暴露(exposure)出來,還須要再配置,默認狀況下全部端點在JMX下是所有公開的,在Web下只公開/health和/info兩個端點。下面是默認配置:app
Property | Default |
---|---|
management.endpoints.jmx.exposure.exclude | - |
management.endpoints.jmx.exposure.include | '*' |
management.endpoints.web.exposure.exclude | - |
management.endpoints.web.exposure.include | info, health |
下面的例子是Web下公開全部端點:ide
management:
endpoints:
web:
exposure:
include: '*'
保護Actuator HTTP端點:spring-boot
最簡單的方式,就是在pom.xml中添加spring-boot-starter-security。由SpringBoot Security的特性可知,系統會自動給咱們建立login/logout page,還有一個user和password,此外系統還會自動給我配置一個ManagementWebSecurityConfigurerAdapter(extends WebSecurityConfigurerAdapter),配置Actuator各個Endpoint的權限。ui
固然咱們也能夠自定義一個WebSecurityConfigurerAdapter配置本身的user和authority。
package com.mytools; import org.springframework.boot.actuate.autoconfigure.security.servlet.EndpointRequest; import org.springframework.boot.actuate.health.HealthEndpoint; import org.springframework.boot.actuate.info.InfoEndpoint; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.factory.PasswordEncoderFactories; import org.springframework.security.crypto.password.PasswordEncoder; @Configuration public class MyWebSecurityConfigurer extends WebSecurityConfigurerAdapter { @Bean public PasswordEncoder passwordEncoder() { return PasswordEncoderFactories.createDelegatingPasswordEncoder(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { //@formatter:off PasswordEncoder encoder = new BCryptPasswordEncoder(); auth.inMemoryAuthentication() .withUser("user1").password("{bcrypt}" + encoder.encode("password1")).roles("ADMIN","EUREKA") .and() .withUser("user2").password("{bcrypt}" + encoder.encode("password2")).roles("EUREKA"); //@formatter:on } @Override protected void configure(HttpSecurity http) throws Exception { // comes from ManagementWebSecurityAutoConfiguration and ManagementWebSecurityConfigurerAdapter //@formatter:off http.authorizeRequests() .requestMatchers(EndpointRequest.to(HealthEndpoint.class, InfoEndpoint.class)).permitAll() .anyRequest().authenticated() .and() .formLogin().and() .httpBasic(); //@formatter:on } }