Spring Boot Actuator端点通过 JMX 和HTTP 公开暴露给外界访问,大多数时候我们使用基于HTTP的Actuator端点,因为它们很容易通过浏览器、CURL命令、shell脚本等方式访问。
Spring Boot Actuator 提供了对单个 Spring Boot 应用的监控,信息包含应用状态、内存、线程、堆栈等,比较全面的监控了 Spring Boot 应用的整个生命周期,可以有效的帮我解决众多服务的健康检查、指标监控问题、配置管理、日志聚合问题、异常排查问题等等。
Spring Boot 的 Actuator 提供了很多生产级的特性,比如监控和度量Spring Boot 应用程序。
Actuator 的这些特性可以通过众多 REST 接口、远程 shell 和 JMX 获得。
要启用 Actuator 的端点,只要在项目中引入 Actuator 的依赖即可。对于 Maven 依赖,引入的依赖是这样的:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
一些比较有用的执行器端点是:
获得Spring执行器端点的完整列表 。
https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator.endpoints
Spring Boot Actuator 的关键特性是在应用程序里提供众多 Web 接口,通过它们了解应用程序运行时的内部状况。Actuator 提供了 13 个接口,可以分为三大类:配置接口、度量接口和其它接口,具体如下表所示。
HTTP 方法 | 路径 | 描述 |
---|---|---|
GET | /autoconfig | 提供了一份自动配置报告,记录哪些自动配置条件通过了,哪些没通过 |
GET | /configprops | 描述配置属性(包含默认值)如何注入Bean |
GET | /beans | 描述应用程序上下文里全部的Bean,以及它们的关系 |
GET | /dump | 获取线程活动的快照 |
GET | /env | 获取全部环境属性 |
GET | /env/{name} | 根据名称获取特定的环境属性值 |
GET | /health | 报告应用程序的健康指标,这些值由HealthIndicator的实现类提供 |
GET | /info | 获取应用程序的定制信息,这些信息由info打头的属性提供 |
GET | /mappings | 描述全部的URI路径,以及它们和控制器(包含Actuator端点)的映射关系 |
GET | /metrics | 报告各种应用程序度量信息,比如内存用量和HTTP请求计数 |
GET | /metrics/{name} | 报告指定名称的应用程序度量值 |
POST | /shutdown | 关闭应用程序,要求endpoints.shutdown.enabled设置为true |
GET | /trace | 提供基本的HTTP请求跟踪信息(时间戳、HTTP头等) |
当我们将Spring Actuator Dependencies添加到我们的依赖,然后启动项目,它会自动启用执行器端点,只有两个端点 - health 并 info 已映射。
注意:只有“/health”和“/info”端点暴露在没有任何安全性的情况下,为了访问其他端点我们需要配置Spring安全或者直接暴露接口。
o.s.b.a.e.web.EndpointLinksResolver : Exposing 2 endpoint(s) beneath base path '/actuator'
/actuator/info下是没有数据的,这是因为我们还没有配置它们。 只需在 application.yml文件中添加以下属性即可
info:
# 自定义
app:
name: Spring Actuator Example
java:
version: 1.8
type: Spring Boot
author: your name
重新启动应用程序,就能够获得上面信息了。
默认情况下,执行器端点的基本路径是 /actuator ,我们可以通过 management.endpoints.web.base-path 在应用程序属性文件中 设置将其更改为任何其他值 。
management:
endpoints:
web:
base-path: /actuator
我们可以通过属性文件启用和禁用其他执行器端点。
如果要启用所有执行器端点,请添加以下属性。
# 健康显示全部信息
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: always
要仅启用特定的执行器端点,请提供端点ID列表。
include: health,info,beans,env
因为其他端点信息的敏感性,我们需要将 Spring Security 依赖添加到我们的应用程序中,让其他端点至少需要基本的身份验证。
在应用程序中为spring security添加以下依赖项。
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-securityartifactId>
dependency>
另外,在应用程序属性文件中添加spring安全性用户名和密码。
spring.security.user.name=root
spring.security.user.password=root
重新启动应用程序。
现在,当尝试访问安全的执行器端点时,你必须提供登录凭据。
Spring Framework的一个重要特性是它很容易扩展。 我们可以使用 @Endpoint 类上的注释 创建自己的自定义执行器端点 。 然后我们必须 在方法上使用 @ReadOperation , @WriteOperation 或 @DeleteOperation 注释将它们公开为执行器端点bean。
我们可以使用 @JmxEndpoint 和 @WebEndpoint 注释 创建特定于技术的端点 。
以下是我们自定义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 文件中的 以下属性 。
include: health,info,beans,env,myendpoint
现在,当你启动应用程序时,请检查日志中映射的新端点。
访问:ip:port/actuator/myendpoint
codecentric的Spring Boot Admin是一个社区项目,用于管理和监视您的Spring Boot®应用程序。这些应用程序在我们的Spring Boot Admin Client中注册(通过HTTP),或者是通过Spring Cloud®(例如Eureka,Consul)发现的。 UI只是Spring Boot Actuator端点之上的Vue.js应用程序。
Spring Boot Admin提供了很多服务治理方面的功能,利用它能节省我们很多在治理服务方面的时间和精力Spring Boot Admin提供了如下功能(包括但不限于):
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>de.codecentricgroupId>
<artifactId>spring-boot-admin-starter-serverartifactId>
<version>2.2.2version>
dependency>
<dependency>
<groupId>de.codecentricgroupId>
<artifactId>spring-boot-admin-starter-clientartifactId>
<version>2.2.2version>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
@SpringBootApplication
@EnableDiscoveryClient
@EnableAdminServer
public class AdminServerApplication {
public static void main(String[] args) {
SpringApplication.run(AdminServerApplication.class,args);
}
}
没有注册中心则无需配置
有注册中心只需要注册即可,
admin-server会自动去注册中心拉去其他应用的健康信息。
eureka:
instance:
prefer-ip-address: true
client:
serviceUrl:
defaultZone: http://root:root@localhost:8761/eureka/
spring:
application:
name: 14-admin-server
security:
user:
password: root
name: root
server:
port: 8900
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>de.codecentricgroupId>
<artifactId>spring-boot-admin-starter-clientartifactId>
<version>2.2.2version>
dependency>
@SpringBootApplication
@EnableDiscoveryClient
public class XXXApplication {
public static void main(String[] args) {
SpringApplication.run(AdminServerApplication.class,args);
}
}
没有注册中心则需要以下配置
spring:
boot:
admin:
client:
url: http://ip:port
username: root
password: root
# 健康显示全部信息
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: ALWAYS
有注册中心,admin-server会自动去注册中心拉取当前应用的健康信息。
eureka:
client:
serviceUrl:
defaultZone: http://root:root@localhost:8761/eureka/
instance:
prefer-ip-address: true # 显示ip
# 健康显示全部信息
management:
endpoints:
web:
exposure:
include: '*'
endpoint:
health:
show-details: ALWAYS