Spring Boot执行器端点
Spring Boot Actuator端点允许我们监控和与我们的应用程序进行交互。Spring Actuator是Spring Boot的一个子模块,提供了内置的端点,我们可以为我们的应用程序启用和禁用。
Spring Boot Actuator 终端节点
Spring Boot的Actuator端点通过JMX和HTTP公开,大多数情况下我们使用基于HTTP的Actuator端点,因为它们易于在浏览器、CURL命令、shell脚本等中访问。一些有用的Actuator端点包括:
-
- 豆子:此端点返回我们应用程序中配置的所有豆子的列表。
-
- 环境:提供有关Spring环境属性的信息。
-
- 健康:显示应用程序的健康状况。
-
- 信息:显示应用程序的信息,我们可以在Spring环境属性中进行配置。
-
- 映射:显示所有@RequestMapping路径的列表。
-
- 关闭:允许我们优雅地关闭应用程序。
- 线程转储:提供应用程序的线程转储。
你可以从这里获取完整的Spring Actuator端点列表。
Spring Actuator 端点安全
只有“health”和“info”端点是暴露给所有人的,没有任何安全性可言,要访问其他端点,我们需要为我们的应用程序配置Spring安全性。这是非常容易实现的,我们将在教程的后半部分介绍它。
启用 Spring Actuator 端点
当我们向我们的Spring Boot项目中添加Spring Actuator依赖时,它会自动启用Actuator端点。在您的Spring应用程序中添加以下依赖项以启用Spring Boot Actuator端点。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
现在当您运行应用程序时,您将在日志中看到活动端点的映射。
2018-06-19 15:23:20.715 INFO 6493 --- [main] o.s.b.a.e.web.EndpointLinksResolver: Exposing 2 endpoint(s) beneath base path '/actuator'
2018-06-19 15:23:20.723 INFO 6493 --- [main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/actuator/health],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)
2018-06-19 15:23:20.724 INFO 6493 --- [main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/actuator/info],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)
info.app.name=Spring Actuator Example
info.app.java.version=10
info.app.type=Spring Boot
自定义执行器端点的基本路径
默认情况下,执行器端点的基本路径为/actuator,我们可以通过在应用程序属性文件中设置management.endpoints.web.base-path将其更改为任何其他值。
management.endpoints.web.base-path=/management
曝光其他执行器端点
我们可以通过属性文件启用和禁用其他执行器端点。如果您想要启用所有执行器端点,请添加以下属性。
management.endpoints.web.exposure.include=*
要仅启用特定的执行器端点,请提供端点ID列表。
management.endpoints.web.exposure.include=health,info,beans,env
Spring Security用于Actuator端点。
请注意,我们需要为我们的应用程序添加Spring Security以启用额外的端点,因为所有其他端点都需要至少基本身份验证。在您的应用程序中添加以下Spring Security依赖项。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
同时,在应用程序属性文件中添加Spring Security的用户名和密码。
spring.security.user.name=scdev
spring.security.user.password=scdev
重新启动应用程序,您将看到额外的端点被映射。
2018-06-19 16:18:22.211 INFO 6627 --- [main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/management/beans],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)
2018-06-19 16:18:22.212 INFO 6627 --- [ main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/management/env],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)
2018-06-19 16:18:22.212 INFO 6627 --- [ main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/management/env/{toMatch}],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)
Spring Actuator自定义终端
Spring框架的一个重要特点之一就是它非常容易扩展。我们可以使用@class注解在类上创建自定义的执行器端点。然后,我们必须在方法上使用@ReadOperation、@WriteOperation或@DeleteOperation注解,将它们暴露为执行器端点的bean。我们可以使用@JmxEndpoint和@WebEndpoint注解来创建特定技术的端点。以下是一个自定义的Spring执行器端点示例。
package com.Olivia.spring;
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
@Endpoint(id="myendpoint")
@Component
public class MyCustomEndpoints {
@ReadOperation
@Bean
public String hi() {
return "Hi from custom endpoint";
}
}
你是否注意到了终端点ID?我们还需要在启用的执行器终端点列表中进行配置。请在application.properties文件中更新以下属性。
management.endpoints.web.exposure.include=health,info,beans,env,myendpoint
现在当您启动应用程序时,请在日志中检查是否有此新终点进行了映射。
2018-06-19 17:06:59.743 INFO 6739 --- [main] s.b.a.e.w.s.WebMvcEndpointHandlerMapping : Mapped "{[/management/myendpoint],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" onto public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map<java.lang.String, java.lang.String>)
总结
Spring Boot Actuator 是一个生产就绪的管理和信息模块。
我们可以轻松扩展它以添加自己的API,并管理我们的应用程序。
您可以从我们的GitHub存储库中下载完整的项目。