zoukankan      html  css  js  c++  java
  • SpringBoot 2 Actuator Endpoint

    创建Maven 项目:

    POM 中加入 actuator 依赖,来获取应用程序的实时运行数据。

      <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>

    POM全文如下:

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.study</groupId>
      <artifactId>springboot-monitor</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      
       <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
           <version>2.1.1.RELEASE</version>
            <relativePath />
        </parent>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
            
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
            
    
    
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-configuration-processor</artifactId>
                <optional>true</optional>
            </dependency>
        </dependencies>
    
        <build>
    
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    </project>

    创建启动类Application

    package com.actuator.simple;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
         SpringApplication.run(Application.class, args);
        }
    }

    默认情况下,只有 如下 3 个 actuator 端口暴露出来:

     

     在application.yml 中,开启 shutdown 端点,并暴露 shutdown 、health 和 info端口:

    server:
      port: 8090
    management:
      endpoint: 
        shutdown:
          enabled: true
      endpoints:
        web:
          exposure:
            include: shutdown,health,info
                                

     调用 shutdown 端点:

     在yaml 中配置暴露所有端点:

    server:
      port: 8090
    management:
      endpoint: 
        shutdown:
          enabled: true
      endpoints:
        web:
          exposure:
            include: "*"
                                

    在pom.xml 中加入如下security依赖:

                   <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-security</artifactId>
            </dependency>

    并配置保护Actuator Endpoint,开启HttpBasic, 并在application.yml 中创建role为ACTUATOR 的 User。

    package com.actuator.simple;
    
    import org.springframework.boot.actuate.autoconfigure.security.servlet.EndpointRequest;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    
    @Configuration
    public class ActuatorSecurity extends WebSecurityConfigurerAdapter{
    
        /* 
         * need to add http.csrf().disable(); to call actuator/shutdown successfully
         * https://stackoverflow.com/questions/50689032/spring-boot-actuator-shutdown-endpoint-forbidden
         */
        @Override
        protected void configure(HttpSecurity http) throws Exception {
        //protect all Actuator endpoints,such as actuator/health, actuator/info
        http.requestMatcher(EndpointRequest.toAnyEndpoint()).authorizeRequests().anyRequest().hasRole("ACTUATOR").and().httpBasic().and().csrf().disable();
        
        }
    } 

     注意此处我们关闭了 CSRF protection,以使 POST /actuator/shutdown 方法得以执行,否则,调用

     POST  /actuator/shutdown 会得到403 Forbidden Error。

    Cross Site Request Forgery Protection 
    Since SpringBoot relies on Spring security's defaults, CSRF protection is turned by default. This means that the actuator endpoints that require a POST( SHUTDOWN and LOGGERS endpoints) PUT or DELETE will get a 403 forbidden error when the default security configuration is in use.
    
    [Note]
    It's recommended that disabling CSRF protection completely ONLY IF you are creating a service that is used by non-browser clients.

    management.endpoint.health.show-details 的值默认是never,即不显示 health 端点的 details 信息。

    当将  management.endpoint.health.show-details  设为 when_authorized 或  always  时, 可看到health 端点的 details 信息。

    此时,application.yml 如下:

    server:
      port: 8090
    management:
      endpoint: 
        health:
    #     show-details: never(default) / when-authorized / always
          show-details: when-authorized 
        shutdown:
          enabled: true
      endpoints:
        web:
          exposure:
            include: shutdown,health,info
    spring:
      security:
        user:
          name: xluffy
          password: 123
          roles: ACTUATOR
                    
                                

    调用  /actuator/health ,并提供application.yml 中设定的用户名 、密码,此时可看到health 端点的 details 信息

     SpringBoot会根据classpath 中的依赖自动配置HealthIndicator: 例,如果在 pom.xml 中加入了如下Redis 依赖,并启动Redis Server,此时的 health 端点信息如下:

     <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
            
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
            </dependency>

     此处,有3 个 HealthIndicator,分别是 HealthIndicator 、 DiskSpaceHealthIndicator 、RedisHealthIndicator

    对于HealthIndicator 如果如下继承该类,

    package com.actuator.simple;
    
    import org.springframework.boot.actuate.health.Health;
    import org.springframework.boot.actuate.health.HealthIndicator;
    import org.springframework.stereotype.Component;
    @Component
    public class CustomHealth implements HealthIndicator {
    
        @Override
        public Health health() {
        
        return Health.outOfService().withDetail("msg", "服务中断...").build();
        }
    
    }

    则 Health 端点的信息如下:

    当在application.yml 中加入

    info:
      author:
        name: xluffy

    以及配置build-info goal 时,

                 <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <executions>
                      <execution>
                        <goals>
                          <goal>build-info</goal>
                        </goals>
                      </execution>
                    </executions>
                </plugin>

    可以看到如下信息:

    git-commit-id-plugin 可以将Git 信息暴露到 actuator/info 端口,前提是需要build project(maven clean  package)
    Add this to plugins section of pom.xml. maven will generate this file during build ./target/classes/git.properties.
    Spring will read contents of this file and include it in the response of /actuator/info
    此时的application.yml 是:
    server:
      port: 8090
    management:
      info:
        git:
    #      mode: full
          mode: simple
      endpoint: 
        health:
    #     show-details: never(default) / when-authorized / always
          show-details: when-authorized 
        shutdown:
          enabled: true
      endpoints:
        web:
          exposure:
            include: shutdown,health,info
    spring:
      security:
        user:
          name: xluffy
          password: 123
          roles: ACTUATOR
    info:
      author:
        name: xluffy
                  
                    
                                
    <plugin> 
    <groupId>pl.project13.maven</groupId>
    <artifactId>git-commit-id-plugin</artifactId>
    </plugin>

  • 相关阅读:
    线圈与触发器
    线圈
    sourceinsight 宏
    linu  micro time
    删除 .svn 文件夹
    !!!
    ACE_MAIN
    窗体的一些主要属性
    http协议的几个概念
    保留每个name的最新日期的数据
  • 原文地址:https://www.cnblogs.com/luffystory/p/12378734.html
Copyright © 2011-2022 走看看