Spring Boot Actuator 端点
Spring Boot Actuator Endpoints 可让我们监控应用程序并与其交互。Spring Actuator 是Spring Boot 的一个子模块,提供我们可以为应用程序启用和禁用的内置端点。
Spring Boot Actuator 端点
Spring Boot Actuator Endpoints 通过JMX和 HTTP公开,大多数时候我们使用基于 HTTP 的 Actuator 端点,因为它们易于通过浏览器、CURL 命令、shell 脚本等访问。一些有用的执行器端点是:
- beans:此端点返回我们的应用程序中配置的所有 bean 的列表。
- env:提供有关 Spring 环境属性的信息。
- health:显示应用程序健康状况
- info:显示应用程序信息,我们可以在 Spring 环境属性中配置这一点。
- mapping:显示所有@RequestMapping路径的列表。
- shutdown:允许我们正常关闭应用程序。
- threaddump:提供应用程序的线程转储。
您可以从这里获取弹簧执行器端点的完整列表。
Spring Actuator 端点安全
只有“health”和“info”端点是公开的,没有任何安全性,为了访问所有其他端点,我们需要为应用程序配置 Spring Security。这很容易实现,我们将在本教程的后面部分介绍它。
启用弹簧执行器端点
当我们将 Spring Actuator 依赖项添加到我们的 Spring Boot 项目时,它会自动启用执行器端点。将以下依赖项添加到您的 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 Security
请注意,我们需要将Spring Security添加到我们的应用程序中以启用其他端点,因为所有其他端点至少需要基本身份验证。在您的应用程序中添加以下 Spring Security 依赖项。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
Also, add spring security username and password in application properties file.
spring.security.user.name=pankaj
spring.security.user.password=pankaj
Restart the application and you will see additional endpoints being mapped.
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>)
Now when you will try to access the secured actuator endpoints, you will have to provide login credentials. Below images shows the response of beans
and env/java.home
endpoints.
Spring Actuator Custom Endpoints
One of the great features of Spring Framework is that it’s very easy to extend. We can create our own custom actuator endpoints using @Endpoint
annotation on a class. Then we have to use @ReadOperation
, @WriteOperation
, or @DeleteOperation
annotations on the methods to expose them as actuator endpoint bean. We can create technology-specific Endpoints using @JmxEndpoint
and @WebEndpoint
annotations. Here is an example of our own custom spring actuator endpoint.
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";
}
}
Did you notice the endpoint id? We also need to configure this in the list of actuator endpoints to be enabled. Update following properties in application.properties
file.
management.endpoints.web.exposure.include=health,info,beans,env,myendpoint
Now when you will start the application, check for this new endpoint being mapped in the logs.
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>)
Below image shows the output when we invoke our custom actuator endpoint.
Summary
Spring Boot Actuator is a production ready management and information module. We can easily extend it to add our own APIs and manage our application.
You can download the complete project from our GitHub Repository.