Spring Boot Actuator:介紹和使用

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
    }
}
相關文章
相關標籤/搜索