Spring启动执行器端点

时间:2020-02-23 14:35:46  来源:igfitidea点击:

通过Spring Boot Actuator端点,我们可以监控应用程序并与之交互。
Spring Actuator是Spring Boot子模块,提供了内置端点,我们可以为应用程序启用和禁用这些端点。

Spring启动执行器端点(Spring Boot Actuator Endpoint)

Spring Boot Actuator端点通过JMX和HTTP公开,大多数时候我们使用基于HTTP的Actuator端点,因为它们可以通过浏览器,CURL命令,shell脚本等轻松访问。

一些有用的执行器端点是:

  • beans:此端点返回在我们的应用程序中配置的所有bean的列表。

  • env:提供有关Spring Environment属性的信息。

  • 运行状况:显示应用程序运行状况

  • info:显示应用程序信息,我们可以在Spring环境属性中进行配置。

  • 映射:显示所有@RequestMapping路径的列表。

  • shutdown:允许我们正常关闭应用程序。

  • threaddump:提供应用程序的线程转储。

您可以从此处获取Spring执行器端点的完整列表。

Spring执行器端点安全

仅公开"健康"和"信息"端点而没有任何安全性,为了访问所有其他端点,我们需要为弹簧安全性配置应用程序。
这很容易实现,我们将在本教程的后面部分中进行介绍。

启用Spring执行器端点

当我们将Spring Actuator Dependencies添加到我们的Spring Boot项目中时,它会自动启用执行器端点。

在spring应用程序中添加以下依赖项,以启用spring boot致动器端点。

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

现在,当您运行该应用程序时,您将看到在日志中映射了执行器端点。

2016-06-19 15:23:20.715  INFO 6493 --- [main] o.s.b.a.e.web.EndpointLinksResolver: Exposing 2 endpoint(s) beneath base path '/actuator'
2016-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>)
2016-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安全性的依赖性。

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

另外,在应用程序属性文件中添加spring security用户名和密码。

spring.security.user.name=hyman
spring.security.user.password=hyman

重新启动应用程序,您将看到正在映射的其他端点。

2016-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>)
2016-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>)
2016-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>)

现在,当您尝试访问安全的执行器端点时,您将必须提供登录凭证。

下图显示了bean和env/java.home端点的响应。

Spring执行器自定义端点

Spring Framework的一大功能是扩展非常容易。
我们可以在类上使用@Endpoint注释创建自己的自定义执行器端点。
然后,我们必须在方法上使用@ ReadOperation,@ WriteOperation或者@DeleteOperation注释,以将它们公开为执行器端点bean。

我们可以使用@JmxEndpoint和@WebEndpoint批注来创建特定于技术的端点。

这是我们自己的定制Spring执行器端点的示例。

package com.theitroad.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

现在,当您启动应用程序时,请检查日志中是否映射了该新端点。

2016-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>)