Spring Boot Actuator集成,难的是灵活运用!

简介: Spring Boot Actuator集成,难的是灵活运用!

前言

曾经看到Spring Boot Actuator这个框架时,一直在想,它到底有什么作用呢?虽然知道它提供了很多端点,有助于应用程序的监控和管理,但如果没有直接的实践案例,还是很难有说服力的。

直到上篇文章《微服务架构:Nacos本地缓存 PK 微服务优雅下线》中讲到可以利用其中Actuator定义的端点来达到微服务的优雅下线效果,才发现Actuator是真的很有用。

那么本文便基于Spring Boot系统如何集成Actuator,如何使用,以及如何自定义一个端点(Endpoint)来展开。

Spring Boot Actuator简介

Spring Boot Actuator是Spring Boot提供用于对应用系统进行自省和监控的功能模块,基于此开发人员可以方便地对应用系统某些监控指标进行查看、统计、审计、指标收集等。Actuator提供了基于Http端点或JMX来管理和监视应用程序。

刚接触Actuator朋友通常会有一个疑惑,Actuator可以通过Http端点进行访问,那么它与Spring Web提供的@Controller的对外服务有什么区别呢?它们都可以通过Http的方式让外部来访问应用程序,但功能的定义边界不同。就像上面说的Actuator通常用于应用程序本身运行情况的监控和操作,而@Controller更多的是业务层面运用。通过与@Controller这么一对照,你可能更容易理解Actuator的作用了。

Actuator默认功能

Actuator提供了一些默认的REST接口,基于这些接口我们可以很方便的了解应用程序的运行状况。其中某些端口比较敏感,需要在指定的权限下才能进行访问。

通过Actuator可以监控应用程序的Health健康信息、Info应用信息、HTTP Request跟踪信息、Metrics信息、@RequestMapping的路径信息、应用程序的各种配置信息、程序请求的次数时间等各种信息。

这里暂且不做具体端点的解释,因为不同的版本还是有所出入的。先来看一下将所有的端点打开,然后访问http://localhost:8080/actuator 能够看到的端点信息。image.png至于你所使用的版本包含哪些端点,也采用同样的方法来进行查看。

Spring Boot的集成

将Spring Boot Actuator集成到Spring Boot项目中是非常方便的,只需在pom文件中添加对应的依赖即可:

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

这里采用的是Spring Boot 2.2.2.RELEASE版本。启动项目,访问http://localhost:8080/actuator 就可以看到目前可访问的端口列表信息了:

{
"_links": {
"self": {
"href": "http://localhost:8080/actuator",
"templated": false
},
"health-path": {
"href": "http://localhost:8080/actuator/health/{*path}",
"templated": true
},
"health": {
"href": "http://localhost:8080/actuator/health",
"templated": false
},
"info": {
"href": "http://localhost:8080/actuator/info",
"templated": false
}
}
}

可以看出,当前版本默认支持self、health-path、health和info端点信息的访问,其他信息是未对外开放的。

此时,如果需要查看像前面提到的全部的端点,可在application配置文件中进行如下配置:

management:
  endpoints:
    web:
      exposure:
        include: '*'
    jmx:
      exposure:
        include: '*'

这样便可以看到所有的端点了。此种方式是针对Spring Boot 2.0以后的版本才起效。需要注意的是配置中的*是需要添加单引号或双引号的。

另外,这种形式的配置也是不推荐的。这样会将所有的端点对外暴露,而没有进行权限验证。建议的模式是,使用到哪些端点,直接在include中明确指出。同时,敏感操作还需要进行认证。

指定配置的形式如下:

management:
  endpoints:
    web:
      exposure:
        include: health,info
    jmx:
      exposure:
        include: health,info

不同的端点通过英文逗号分隔即可。

Endpoint的数据结构

其实最开始我们已经看了/actuator返回的数据结构了,这便是端点self的信息。在/actuator的返回信息中还可以看到其他可访问的端点的地址,比如这里访问http://localhost:8080/actuator/health ,结构如下:

{
"status": "UP"
}

端点返回的结果为JSON格式,上面返回了status为UP的状态,也就是说系统处于健康运行当中。当然,针对其他端点的访问,返回结果基本一致,这里就不逐一展示了。

停服操作

在上面的端点中,你会发现并没有关闭服务的端点。是的,默认情况下,即使include设置为“*”,依旧没有开启shutdown这类影响服务的操作。

针对这类操作,我们先要设置其可用:

management:
  endpoint:
    shutdown:
      enabled: true
  endpoints:
    web:
      exposure:
        include: '*'
    jmx:
      exposure:
        include: '*'

此时,再访问/actuator就可以看到/shutdown端点对应的路径了http://localhost:8080/actuator/shutdown 。

通过curl命令或postman等发送一个post请求到该端点:

curl -X "POST" "http://localhost:8080/actuator/shutdown"

执行之后,发现服务被关停了。类似停服的操作还有很多,比如restart、pause、restart等。可根据具体版本进行配置,目前版本只发现有shutdown端点,未restart、pause、restart等端点的配置项。

通过上述方式,SpringBoot应用可以优雅的关闭,但是存在很大的安全隐患,如果知道了ip、端口号后就可以模拟该请求停止服务了,因此需要增加一些安全限制。

  • management.endpoints.web.base-path 自定义shutdown的请求路径;
  • management.server.address 设置为本地ip,防止远程访问该连接进行关闭服务;
  • management.server.port 自定义shutdown请求路径的端口号;

调整后的配置文件如下:

management:
  endpoint:
    shutdown:
      enabled: true
  endpoints:
    web:
      exposure:
        include: '*'
    jmx:
      exposure:
        include: '*'
  server:
    # 自定义端口
    port: 8080
    # 不允许远程管理连接,安全性考虑
    address: 127.0.0.1

当然,如果此种方式并不适合你,还可以考虑引入spring-boot-starter-security,通过Spring Security来保证Actuator Endpoints的安全,此时再访问时就需要用户名和密码的验证了。关于Spring Security在本篇文章就不再拓展。

自定义Endpoint

默认的端点虽然可以满足大多数的需求,但一些特殊的需求还是需要能够支持自定义端点的。自定义 Endpoint 端点,只需要在我们的新建Bean上使用 @Endpoint 注解即可, Bean 中的方法就可以通过 JMX 或者 HTTP 公开。除此之外,还可以使用 @JmxEndpoint 或 @WebEndpoint 编写 EndPoint。但这些 EndPoint 仅限于各自的公开方式。例如,@WebEndpoint 仅通过HTTP公开,而不通过JMX公开。

那么是不是类中所有的方法都支持对外公开呢?很明显不是的。Actuator提供了三个用于方法上的注解,只有加三个注解的方法才支持对外公开,并且每个注解都有支持它的HTTP method。

@ReadOperation对应HTTP的GET请求,@WriteOperation对应HTTP的POST请求,@DeleteOperation对应HTTP的DELETE请求。

来看一个简单的使用实例:

@Component
@Endpoint(id = "my")
public class EndpointCustom {
   @ReadOperation
   public String endpointCustomRead(String content) {
      return "请求的内容: " + content;
   }
   @WriteOperation
   public String endpointCustomWrite(String content) {
      return "写的内容: " + content;
   }
   @DeleteOperation
   public String endpointCustomDelete(String content) {
      return "删除的内容: " + content;
   }
}

对应GET请求:

curl -X GET http://localhost:8080/actuator/my?content=endpointGet

执行之后,会返回信息“请求的内容: endpointGet”。

同样的POST请求为:

curl -X POST http://localhost:8080/actuator/my?content=endpointPost

DELETE请求为:

curl -X DELETE http://localhost:8080/actuator/my?content=endpointDELETE

上面只是简单自定义实例,根据具体的业务场景,可以定义更加丰富的端点实现。

小结

通过本篇我们了解了Spring Boot集成 Actuator的基本操作。集成起来非常简单,因为Spring Boot已经帮我们做了大多数的事情,我们只需要有针对性的进行配置即可。对于预定义端点无法满足业务需求的情况,还可以通过自定义的形式来实现特殊化处理。学习Actuator最重要的点在于知道它的运用场景。

本文完整源码地址:https://github.com/secbr/springboot-all/tree/master/springboot-actuator

目录
相关文章
|
1月前
|
Java Maven Docker
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用
|
7天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
18 2
|
1月前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
54 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
1月前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
92 1
|
1月前
|
存储 前端开发 Java
Spring Boot 集成 MinIO 与 KKFile 实现文件预览功能
本文详细介绍如何在Spring Boot项目中集成MinIO对象存储系统与KKFileView文件预览工具,实现文件上传及在线预览功能。首先搭建MinIO服务器,并在Spring Boot中配置MinIO SDK进行文件管理;接着通过KKFileView提供文件预览服务,最终实现文档管理系统的高效文件处理能力。
270 11
|
1月前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
61 2
|
1月前
|
Java Spring
springboot 学习十一:Spring Boot 优雅的集成 Lombok
这篇文章是关于如何在Spring Boot项目中集成Lombok,以简化JavaBean的编写,避免冗余代码,并提供了相关的配置步骤和常用注解的介绍。
96 0
|
1月前
|
监控 数据可视化 Java
springBoot:actuator&admin 图形可视化&spring 打包 (七)
本文介绍了Spring Boot Actuator及其图形化管理界面Spring Boot Admin的使用方法,包括依赖导入、服务端与客户端配置、以及如何打包为JAR和WAR文件并部署。通过这些步骤,可以实现应用的监控和管理功能。
|
3月前
|
Java Spring 监控
Spring Boot Actuator:守护你的应用心跳,让监控变得触手可及!
【8月更文挑战第31天】Spring Boot Actuator 是 Spring Boot 框架的核心模块之一,提供了生产就绪的特性,用于监控和管理 Spring Boot 应用程序。通过 Actuator,开发者可以轻松访问应用内部状态、执行健康检查、收集度量指标等。启用 Actuator 需在 `pom.xml` 中添加 `spring-boot-starter-actuator` 依赖,并通过配置文件调整端点暴露和安全性。Actuator 还支持与外部监控工具(如 Prometheus)集成,实现全面的应用性能监控。正确配置 Actuator 可显著提升应用的稳定性和安全性。
127 0
|
3月前
|
测试技术 Java Spring
Spring 框架中的测试之道:揭秘单元测试与集成测试的双重保障,你的应用真的安全了吗?
【8月更文挑战第31天】本文以问答形式深入探讨了Spring框架中的测试策略,包括单元测试与集成测试的有效编写方法,及其对提升代码质量和可靠性的重要性。通过具体示例,展示了如何使用`@MockBean`、`@SpringBootTest`等注解来进行服务和控制器的测试,同时介绍了Spring Boot提供的测试工具,如`@DataJpaTest`,以简化数据库测试流程。合理运用这些测试策略和工具,将助力开发者构建更为稳健的软件系统。
59 0