Spring Boot Actuator Endpoints 允许我们监视和与我们的应用程序交互。Spring Actuator 是 Spring Boot 的一个子模块,提供了内置的端点,我们可以为我们的应用程序启用和禁用。
Spring Boot Actuator Endpoints
Spring Boot Actuator Endpoints 暴露在 JMX 和 HTTP 上,大多数情况下我们使用基于 HTTP 的 Actuator 端点,因为它们易于通过浏览器、CURL 命令、shell 脚本等进行访问。一些有用的 actuator 端点包括:
- beans:此端点返回我们应用程序中配置的所有 bean 的列表。
- env:提供有关 Spring 环境属性的信息。
- health:显示应用程序的健康状况。
- info:显示应用程序信息,我们可以在 Spring 环境属性中进行配置。
- mappings:显示所有 @RequestMapping 路径的列表。
- shutdown:允许我们优雅地关闭应用程序。
- threaddump:提供应用程序的线程转储。
您可以从这里获取完整的Spring执行器端点列表。
Spring执行器端点安全
仅“health”和“info”端点在没有任何安全性的情况下公开,要访问所有其他端点,我们需要为我们的应用程序配置Spring安全性。这非常容易实现,我们将在教程的后部分介绍。
启用Spring执行器端点
当我们向Spring Boot项目添加Spring执行器依赖项时,它会自动启用执行器端点。将下面的依赖项添加到您的Spring应用程序中,以启用Spring Boot执行器端点。
<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>)
请注意,只有两个端点 – health
和 info
已经映射。下图显示了这些执行器端点的输出。
你注意到了
/actuator/info
中没有数据,这是因为我们还没有配置它们。只需将以下属性添加到您的 application.properties
文件中。
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安全性
请注意,我们需要为我们的应用程序添加Spring安全性以启用额外的端点,因为所有其他端点都至少需要基本身份验证。在您的应用程序中添加以下依赖项以获取Spring安全性。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
还要在应用程序属性文件中添加Spring安全性的用户名和密码。
spring.security.user.name=pankaj
spring.security.user.password=pankaj
重新启动应用程序,您将看到额外的端点被映射。
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>)
现在,当您尝试访问受保护的执行器端点时,您将需要提供登录凭据。以下图像显示了
beans
和env/java.home
端点的响应。
Spring执行器自定义端点
Spring Framework的一个重要特性是它非常容易扩展。我们可以使用@Endpoint
注解在类上创建自定义的执行器端点。然后,我们必须在方法上使用@ReadOperation
、@WriteOperation
或@DeleteOperation
注解将它们暴露为执行器端点bean。我们可以使用@JmxEndpoint
和@WebEndpoint
注解创建特定于技术的端点。下面是一个自定义的Spring执行器端点的示例。
package com.journaldev.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执行器是一个生产就绪的管理和信息模块。我们可以轻松扩展它以添加我们自己的API并管理我们的应用程序。
您可以从我们的GitHub存储库下载完整的项目。
Source:
https://www.digitalocean.com/community/tutorials/spring-boot-actuator-endpoints