乐趣区

关于springboot:如何启用Spring-Boot-Actuator的所有Endpoints

概述

本文将介绍如何启用 Spring Boot Actuator 的所有 Endpoints。首先从 maven 依赖开始,而后解说如何通过配置文件来管制 Endpoint(后称作端点)。最初再学习一下如何确保端点的平安。

其中 Spring Boot 1.x 和 Spring Boot 2.x 在 Actuator 的端点配置上会有肯定的区别。当呈现区别时,会进行提醒。

引入依赖

要应用 Spring Boot Actuator 须要先在我的项目中引入对应的依赖:

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

从 Spring Boot 2.x 开始,如果想通过 HTTP 的形式进行拜访,还须要引入 web starter:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.4.3</version>
</dependency>

启用并裸露端点

从 Spring Boot 2.x 开始,咱们须要手动的去启用和裸露端点。默认状况下,除了 /shutdown 之外的所有端点都是可用的,同时只有 /health 和 /info 端点是对外裸露的。即使咱们为应用程序配置了多个根上下文,所有的端点都能够通过 /actuator 来进行查找。

这意味着,一旦咱们引入了适合的 starter 到 maven 配置中,咱们便能够通过 http://localhost:8080/actuator/health 和 http://localhost:8080/actuator/info 来进行两个端点的拜访。

拜访 http://localhost:8080/actuator,返回可用的端点列表如下:

{"_links":{"self":{"href":"http://localhost:8080/actuator","templated":false},
"health":{"href":"http://localhost:8080/actuator/health","templated":false},
"info":{"href":"http://localhost:8080/actuator/info","templated":false}}}

裸露所有端点

上面通过配置来裸露除了 /shutdown 之外的所有端点,在 application.properties 中进行如下配置:

management.endpoints.web.exposure.include=*

重启,再次拜访 /actuator,能够看到除了 /shutdown 之外的其余所有端点。

{"_links":{"self":{"href":"http://localhost:8080/actuator","templated":false},
"beans":{"href":"http://localhost:8080/actuator/beans","templated":false},
"caches":{"href":"http://localhost:8080/actuator/caches","templated":false},
"health":{"href":"http://localhost:8080/actuator/health","templated":false},
"info":{"href":"http://localhost:8080/actuator/info","templated":false},
"conditions":{"href":"http://localhost:8080/actuator/conditions","templated":false},
"configprops":{"href":"http://localhost:8080/actuator/configprops","templated":false},
"env":{"href":"http://localhost:8080/actuator/env","templated":false},
"loggers":{"href":"http://localhost:8080/actuator/loggers","templated":false},
"heapdump":{"href":"http://localhost:8080/actuator/heapdump","templated":false},
"threaddump":{"href":"http://localhost:8080/actuator/threaddump","templated":false},
"metrics":{"href":"http://localhost:8080/actuator/metrics","templated":false},
"scheduledtasks":{"href":"http://localhost:8080/actuator/scheduledtasks","templated":false},
"mappings":{"href":"http://localhost:8080/actuator/mappings","templated":false}}}

裸露指定端点

一些端点可能会裸露敏感数据,所以咱们须要晓得如何细粒度去裸露端点。

management.endpoints.web.exposure.include 属性能够通过逗号分隔符来配置多个端点,比方咱们裸露 /beans 和 /loggers 端点:

management.endpoints.web.exposure.include=beans, loggers

除了蕴含具体端点之外,咱们还能够排除一些端点。比方裸露除了 /threaddump 之外的所有端点:

management.endpoints.web.exposure.include=*
management.endpoints.web.exposure.exclude=threaddump

include 和 exclude 属性均反对配置一个端点列表。exclude 属性的优先级要高于 include。

开启指定端点

上面来看一下如何细粒度的开启指定的端点。首先,须要敞开默认开启的所有端点:

management.endpoints.enabled-by-default=false

开启并裸露 /health 端点:

management.endpoint.health.enabled=true
management.endpoints.web.exposure.include=health

通过上述配置,便能够拜访 /health 端点了。

开启 Shutdown 端点

因为 /shutdown 端点比拟敏感的起因,该端点默认是不可用的。可在 application.properties 文件中通过如下配置进行启动:

management.endpoint.shutdown.enabled=true

此时,拜访 /actuator 端点,就能够在列表中看到它了。/shutdown 端点仅接管 POST 申请,能够通过如下形式优雅的敞开服务:

curl -X POST http://localhost:8080/actuator/shutdown

端点的平安

在实在的利用中,咱们通常须要对应用程序进行平安防护。基于此,咱们须要确保 Actuator 端点的平安。

首先,在应用程序中增加 security 的依赖:

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

为了最根本的平安保障,这是咱们须要做的事。增加 security starter 依赖之后,程序会主动将身份验证利用于除 /info 和 /health 之外的所有公开端点。

上面,自定义 security 以将 /actuator 端点限度为 ADMIN 角色。

首先排除默认的平安配置:

@SpringBootApplication(exclude = { 
    SecurityAutoConfiguration.class, 
    ManagementWebSecurityAutoConfiguration.class 
})

注意下 ManagementWebSecurityAutoConfiguration.class 类,它会让平安配置利用到 /actuator。

在咱们的配置类中,配置几个用户和角色,同时有一个 ADMIN 的角色能够应用:

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
    auth
      .inMemoryAuthentication()
      .withUser("user")
      .password(encoder.encode("password"))
      .roles("USER")
      .and()
      .withUser("admin")
      .password(encoder.encode("admin"))
      .roles("USER", "ADMIN");
}

SpringBoot 为咱们提供了一个不便的申请匹配器,用于咱们的 Actuator 端点。利用它能够将 /actuator 锁定为 ADMIN 角色:

http.requestMatcher(EndpointRequest.toAnyEndpoint())
  .authorizeRequests((requests) -> requests.anyRequest().hasRole("ADMIN"));

小结

通过本文,咱们学习了 Spring Boot 是如何来默认配置 Actuator 的。随后,咱们在应用程序的 application.properties 文件中定义了端点的启用、禁用和裸露。鉴于 Spring Boot 对 /shutdwon 端点的不同解决,咱们学习了如何独自启用该端点。最初,学习了如何基于 security 对端点来进行平安防护。

源码地址:https://github.com/eugenp/tut…。

博主简介:《SpringBoot 技术底细》技术图书作者,热爱钻研技术,写技术干货文章。

公众号:「程序新视界」,博主的公众号,欢送关注~

技术交换:请分割博主微信号:zhuan2quan

退出移动版