Spring Boot Actuator:介绍和使用

Spring Boot Actuator提供一系列HTTP端点来暴露项目信息,用来监控和管理项目。在Maven中,可以添加以下依赖:

<!-- 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等,这时候不用再重复添加该依赖。

 

Actuator提供了以下端点,默认除了/shutdown都是Enabled。使用时需要加/actuator前缀,如http://localhost:8080/my-app/actuator/health。

IDDescriptionEnabled 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),还可以使用以下端点:

IDDescriptionEnabled 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端点:

management:
  endpoints:
    enabled-by-default: false
  endpoint:
    info:
      enabled: true

 

上面是启用/禁用(enable)某个端点,如果使某个端点暴露(exposure)出来,还需要再配置,默认情况下所有端点在JMX下是全部公开的,在Web下只公开/health和/info两个端点。下面是默认配置:

PropertyDefault
management.endpoints.jmx.exposure.exclude          - 
management.endpoints.jmx.exposure.include  '*'
management.endpoints.web.exposure.exclude  -                  
management.endpoints.web.exposure.include    info, health                                                             

 

下面的例子是Web下公开所有端点:

management:
  endpoints:
    web:
      exposure:
        include: '*'

 

保护Actuator HTTP端点:

最简单的方式,就是在pom.xml中添加spring-boot-starter-security。由SpringBoot Security的特性可知,系统会自动给我们创建login/logout page,还有一个user和password,此外系统还会自动给我配置一个ManagementWebSecurityConfigurerAdapter(extends WebSecurityConfigurerAdapter),配置Actuator各个Endpoint的权限。

当然我们也可以自定义一个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
    }
}

 

posted @ 2019-05-23 18:52  Storm_L  阅读(3917)  评论(1编辑  收藏  举报