05. Springboot admin集成Actuator(一)

目录

1、前言

2、Actuator监控端点

2.1、健康检查

2.2、信息端点

2.3、环境信息

2.4、度量指标

2.5、日志文件查看

2.6、追踪信息

2.7、Beans信息

2.8、Mappings信息

3、快速使用

2.1、添加依赖

2.2、添加配置文件

2.3、启动程序

4、自定义端点Endpoint

5、自定义health

6、附录

7、小结


1、前言

Spring Boot Actuator是Spring Boot提供的一个用于监控和管理应用程序的扩展模块。Actuator通过HTTP端点和JMX(Java Management Extensions)提供了一系列功能,包括查看应用程序的运行状况、度量指标、日志、追踪和应用信息。它为开发人员和运维人员提供了方便的手段来监控和管理Spring Boot应用。

2、Actuator监控端点

Actuator提供了一系列内置的端点(EndPoints)用于查看应用程序的运行状况、运行情况、指标等信息。其中主要提供了如下一些端点:

2.1、健康检查

**HTTP端点:`/actuator/health`。**提供了应用程序的健康状态,包括磁盘空间、数据库连接等信息。健康检查对于监控和负载均衡非常有用。返回的状态包括 UP(正常)、DOWN(异常)和 OUT_OF_SERVICE(维护中)等。

2.2、信息端点

**HTTP端点:`/actuator/info`。**提供了应用程序的自定义信息,可以在配置文件中定义,用于展示应用的版本、描述等。这些信息通常来源于应用程序的配置文件或构建系统。

2.3、环境信息

**HTTP端点:`/actuator/env`。**显示应用程序的环境属性,包括配置属性、系统属性等。可以通过添加参数来查看特定属性的值,如:/actuator/env/server.port。

2.4、度量指标

**HTTP端点:`/actuator/metrics`。**提供了应用程序的度量指标,例如内存使用、线程池状态、HTTP请求等,对性能分析和优化非常有帮助。如:/actuator/metrics/jvm.memory.used。

2.5、日志文件查看

**HTTP端点:`/actuator/logfile`。**允许查看应用程序的日志文件内容,方便进行故障排除。

2.6、追踪信息

**HTTP端点:`/actuator/trace`。**提供了应用程序的请求追踪信息,显示HTTP请求的调用链,便于跟踪请求的处理过程。

2.7、Beans信息

**HTTP端点:`/actuator/beans`。**显示所有在Spring应用程序上下文中注册的Beans信息,包括它们的名称、类型等。

2.8、Mappings信息

HTTP端点:`/actuator/mappings`。 显示所有的URI映射,展示了请求如何被映射到控制器方法上。

3、快速使用

了解了Actuator的各个主要端点以及他们的作用后,我们便可以选择适当的端点作为我们的监控行为,集成到项目中。

基础环境:SpringBoot-2.7.14,JDK-17.0.2。构建基础springboot demo工程。

3.1、添加依赖

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

3.2、添加配置文件

spring:application:name: springboot-actuator-demo
server:port: 8080management:server:port: 8081   # 指定了actuator服务端口endpoints:web:exposure:include: '*'    # 表示开启所有端点,如果指定具体多个端点,可以用,隔开。如health,info

3.3、启动程序

启动日志中可以看到启动了actuator端口为8081,且访问路径为/actuator。我们访问下http://localhost:8081/actuator:

可以看到actuator返回了一列指标的访问连接。

接着继续访问给定的连接,实际上就是http://localhost:8081/actuator/端点url。如查看当前JVM内存占用情况,直接访问http://localhost:8081/actuator/metrics/jvm.memory.used

4、自定义端点Endpoint

除了Actuator自带的端点以外,我们还可以自定义所需要的端点。自定义端点需要先了解以下几个注解:

  • **@Component:**注册为一个Spring Bean。
  • **@Endpoint:**声明端点的注解,需要指定id=""属性,标识端点名称。
  • **@ReadOperation:**用于定义读操作,允许获取关于应用程序状态的信息。它对应 HTTP 请求的 GET 方法。通常用于返回只读信息,例如获取应用程序的状态、性能指标等。
  • **@WriteOperation:**用于定义写操作,允许进行应用程序的修改。它对应 HTTP 请求的 POST 方法。通常用于执行会修改应用程序状态的操作,例如重新加载配置、清理缓存等。
  • **@DeleteOperation:**用于定义删除操作,允许进行资源的删除。它对应 HTTP 请求的 DELETE 方法。通常用于执行删除资源的操作,例如关闭数据库连接池、停止某个服务等。
  • **@Selector:**用于@ReadOperation、@WriteOperation、@DeleteOperation标注的 Endpoint 方法时允许传递一些参数。

简单demo:

package com.example.springbootactuator.entpoint;import org.springframework.boot.actuate.endpoint.annotation.*;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpMethod;
import org.springframework.stereotype.Component;import java.util.HashMap;
import java.util.Map;/*** 注意:这里定义的端点名称只能是英文字母+数字,不能有其他字符,甚至下划线也不行。不然会提示 Value must only contain valid chars*/
@Component
@Endpoint(id = "myendpoint", enableByDefault = true)
public class MyEndpoint {@ReadOperationpublic Map<String, Object> endpointMyRead(@Selector String content) {Map<String, Object> customMap = new HashMap<>();customMap.put("httpMethod", HttpMethod.GET.toString());customMap.put("status", "200");customMap.put("content", content);return customMap;}@WriteOperationpublic Map<String, Object> endpointMyWrite() {Map<String, Object> customMap = new HashMap<>();customMap.put("httpMethod", HttpMethod.POST.toString());return customMap;}@DeleteOperationpublic Map<String, Object> endpointMyDelete() {Map<String, Object> customMap = new HashMap<>();customMap.put("httpMethod", HttpMethod.DELETE.toString());return customMap;}
}

运行后查看端点,可以看到多了我们自定义的myendpoint端点名称,同时多了一个可以接收{content}的端点连接,这个就是我们加了@Selector注解,允许接收参数。

来尝试访问下:http://localhost:8081/actuator/myendpoint/hello123123123。可以得到我们返回的map结构。

5、自定义health

我们还可以自定义health,用来检测其健康状态。这个也是我项目中用的比较多的,当时有一个需求是汇总所有的API请求,检测对方的API健康状态,并告警提醒,就是自定义了health。

要自定义health,可以自定义 HealthIndicator 来添加自定义的健康检查项。HealthIndicator 接口定义了一个 health() 方法,该方法返回一个 Health 对象,其中包含了应用程序的健康信息。也可以通过继承AbstractHealthIndicator抽象类来实现。

import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;@Component
public class CustomHealthIndicator implements HealthIndicator {@Overridepublic Health health() {// 实现自定义的健康检查逻辑boolean isHealthy = checkHealth(); // 替换为实际的健康检查逻辑if (isHealthy) {return Health.up().withDetail("message", "Application is healthy").build();} else {return Health.down().withDetail("message", "Application is not healthy").build();}}private boolean checkHealth() {// 实际的健康检查逻辑,例如检查数据库连接、第三方服务状态等// 返回 true 表示健康,返回 false 表示不健康// 这里简单返回 true,实际应用中需要根据业务逻辑进行判断return true;}
}

运行程序,访问http://localhost:8081/actuator/health:

此外,可以添加以下配置,来查看health的详细信息:

management:endpoint:health:show-details: always

6、附录

贴出之前我对第三方API地址进行拨测的,实现health方式来检测健康状态的部分关键代码:

ThirdPartApiManager.java

import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;/*** 第三方api地址管理器,统一管理API地址,不要直接在业务代码写死* 这里管理的api地址会进行状态监控*/
@Configuration
public class ThirdPartApiManager {@AutowiredThirdPartApiIpConfig thirdPartApiIpConfig;public static final Table<String, String, Long> THIRD_PART_API_TABLE = HashBasedTable.create();/*** 每次api心跳间隔,默认10分钟*/public static final Long INTERVAL_MICO_SECONDS = 10 * 60L * 1000;@SuppressWarnings("java:S125")public void thirdPartApiAdd() {//THIRD_PART_API_TABLE.put("获取客户信息", "http://localhost:8080/xxxxx",  1 * 60L * 1000);}}

ThirdPartApiManagerMonitor.java:

import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointProperties;
import org.springframework.boot.actuate.autoconfigure.health.HealthIndicatorAutoConfiguration;
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;/*** 第三方api地址心跳拨测* 拨测方式:对http发起options预请求,来诊断该接口的可用性* 注意:这里不发送trace方法,原因是trace可能会被黑客攻击,所以大多数系统trace是关闭的。*/
@Component
@Configuration
@AutoConfigureBefore({HealthIndicatorAutoConfiguration.class})
@EnableConfigurationProperties(HealthEndpointProperties.class)
@Slf4j
@Profile({"prod"})
public class ThirdPartApiManagerMonitor implements SchedulingConfigurer {@AutowiredConfigurableApplicationContext context;@AutowiredThirdPartApiManager thirdPartApiManager;@Beanpublic Map<String, Health> apiHealthResultMap() {return new ConcurrentHashMap<>(ThirdPartApiManager.THIRD_PART_API_TABLE.columnKeySet().size());}Function<ThirdPartApiDto, Health> healthIndicatorFunction = apiDto -> {Health.Builder healthBuilder = new Health.Builder().status(String.valueOf(apiDto.getStatus())).withDetail("httpCode", apiDto.getStatus()).withDetail("name", apiDto.getName()).withDetail("url", apiDto.getApi()).withDetail("description", apiDto.getName());/*** 状态码说明:* 100-199 用于指定客户端应相应的某些动作。* 200-299 用于表示请求成功。* 300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。* 400-499 用于指出客户端的错误。* 500-599 用于支持服务器错误。*/if (apiDto.getStatus() >= 400) {// 推送提醒......sendLarkMessage(apiDto);return healthBuilder.down().build();}return healthBuilder.up().build();};public int tryConnect(String url) {try {URL urlObj = new URL(url);HttpURLConnection connect = (HttpURLConnection) urlObj.openConnection();connect.setUseCaches(false);connect.setRequestMethod("OPTIONS");connect.setConnectTimeout(5000);return connect.getResponseCode();} catch (IOException e) {// nopreturn 500;}}@PostConstructpublic void registerApiHealth() {thirdPartApiManager.thirdPartApiAdd();ThirdPartApiManager.THIRD_PART_API_TABLE.columnKeySet().forEach(api -> {Optional<String> first = ThirdPartApiManager.THIRD_PART_API_TABLE.column(api).keySet().stream().findFirst();if (!first.isPresent()) {return;}context.getBeanFactory().registerSingleton(first.get() + "HealthIndicator", (HealthIndicator) () -> {if (apiHealthResultMap().containsKey(first.get())) {return apiHealthResultMap().get(first.get());}int status = tryConnect(api);ThirdPartApiDto thirdPartApiDto = ThirdPartApiDto.builder().name(first.get()).api(api).interval(ThirdPartApiManager.THIRD_PART_API_TABLE.column(api).getOrDefault(first.get(), ThirdPartApiManager.INTERVAL_MICO_SECONDS)).status(status).result(JSONUtil.toJsonStr(status)).createTime(DateUtil.now()).build();return healthIndicatorFunction.apply(thirdPartApiDto);});});}/*** 按照配置api,定时监控外部http状态*/@Overridepublic void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {ThirdPartApiManager.THIRD_PART_API_TABLE.columnKeySet().forEach(api -> {Optional<String> first = ThirdPartApiManager.THIRD_PART_API_TABLE.column(api).keySet().stream().findFirst();if (!first.isPresent()) {return;}LOGGER.info("拨测接口:{}, 地址:{}", first.get(), api);scheduledTaskRegistrar.addFixedRateTask(() -> {int status = tryConnect(api);ThirdPartApiDto thirdPartApiDto = ThirdPartApiDto.builder().name(first.get()).api(api).interval(ThirdPartApiManager.THIRD_PART_API_TABLE.column(api).getOrDefault(first.get(), ThirdPartApiManager.INTERVAL_MICO_SECONDS)).status(status).result(JSONUtil.toJsonStr(status)).createTime(DateUtil.now()).build();apiHealthResultMap().put(first.get(), healthIndicatorFunction.apply(thirdPartApiDto));}, ThirdPartApiManager.THIRD_PART_API_TABLE.column(api).getOrDefault(first.get(), ThirdPartApiManager.INTERVAL_MICO_SECONDS));});}@Beanpublic HealthIndicator testHealthIndicator() {return () -> new Health.Builder().up().build();}public void sendLarkMessage(ThirdPartApiDto thirdPartApiDto) {// ...}
}

7、小结

Spring Actuator在实际项目中使用还是很广泛的,根据项目实际情况适当扩展或自定义各个端点,提供更契合场景的度量指标,对项目会有很大的帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/23759.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【GESP】C++二级模拟 luogu-b3995, [GESP 二级模拟] 小洛的田字矩阵

GESP二级模拟题&#xff0c;多层循环、分支语句练习&#xff0c;难度★✮☆☆☆。 题目题解详见&#xff1a;https://www.coderli.com/gesp-2-luogu-b3995/ 【GESP】C二级模拟 luogu-b3995, [GESP 二级模拟] 小洛的田字矩阵 | OneCoderGESP二级模拟题&#xff0c;多层循环、分…

uniapp在app下使用mqtt协议!!!支持vue3

什么&#xff1f;打包空白&#xff1f;分享一下我的解决方法&#xff01; 第一步 找大师算过了&#xff0c;装4.1版本运气好&#xff01; 所以根目录执行命令… npm install mqtt4.1.0第二步 自己封装一个mqtt文件方便后期开坛做法&#xff01; // utils/mqtt.js import mqt…

C++程序员内功修炼——Linux C/C++编程技术汇总

在软件开发的宏大版图中&#xff0c;C 语言宛如一座巍峨的高山&#xff0c;吸引着无数开发者攀登探索。而 Linux 操作系统&#xff0c;以其开源、稳定、高效的特性&#xff0c;成为了众多开发者钟爱的开发平台。将 C 与 Linux 相结合&#xff0c;就如同为开发者配备了一把无坚不…

【Python量化金融实战】-第2章:金融市场数据获取与处理:2.1 数据源概览:Tushare、AkShare、Baostock、通联数据(DataAPI)

本章将详细介绍四大主流金融数据源&#xff08;Tushare、AkShare、Baostock、通联数据&#xff08;DataAPI&#xff09;&#xff09;&#xff0c;分析其特点与适用场景&#xff0c;并通过实战案例展示数据获取与处理的全流程。 &#x1f449; 点击关注不迷路 &#x1f449; 点击…

一文讲解Redis的持久化方式及各自的区别

一文讲解Redis的持久化方式及各自的区别 Redis 的持久化机制保证了 Redis 服务器在重启后数据不丢失&#xff0c;通过 RDB 和 AOF 文件来恢复内存中原有的数据。 这两种持久化方式可以单独使用&#xff0c;也可以同时使用。 三分恶面渣逆袭&#xff1a;Redis持久化的两种方式…

STM32 利用SysTick实现高精度计时

STM32 HAL库利用ARM Cortex-M内核自带的24位递减计数器SysTick(系统节拍)&#xff0c;它属于 NVIC的一部分,且可以产生 SysTick 异常(异常类型#15)。通过读取并判断计数值来实现精确延时&#xff0c;从0xFFFFFF向下计数到0。可以用作I2C、SPI通信中的时序控制&#xff0c;RTOS环…

图像金字塔

图像金字塔&#xff08;MATLAB 版本&#xff09; 目录 图像金字塔&#xff08;MATLAB 版本&#xff09;一、 生成图像金字塔二、 Matlab实践操作三、实践问题 一、 生成图像金字塔 在 MATLAB 中&#xff0c;可以使用 impyramid 函数来生成图像金字塔。 代码示例&#xff1a; m…

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(一)

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷&#xff08;一&#xff09; 第一部分&#xff1a;网络平台搭建与设备安全防护任务书DCRS:DCFW:DCWS:WAF: 第二部分&#xff1a;网络安全事件响应、数字取证调查、应用程序安全任务书任务 1&…

20250212:https通信

1:防止DNS劫持:使用 https 进行通信。 因为是SDK授权开发,需要尽量压缩so库文件和三方依赖。所以第一想法是使用 head only 的 cpp-httplib 进行开发。 cpp-httplib 需要 SSL 版本是 3.0及以上。但本地已经在开发使用的是1.0.2a版本,不满足需求。 方案1:升级OpenSSL 将Op…

一、C#基础入门课程【学习20天】01-07

✨博客主页&#xff1a; https://blog.csdn.net/m0_63815035?typeblog &#x1f497;《博客内容》&#xff1a;.NET、Java.测试开发、Python、Android、Go、Node、Android前端小程序等相关领域知识 &#x1f4e2;博客专栏&#xff1a; https://blog.csdn.net/m0_63815035/cat…

基于SpringBoot + Vue的共享汽车(单车)管理系统设计与实现+毕业论文+开题报告+指导搭建视频

本系统包含管理员、用户两个角色。 管理员角色&#xff1a;个人中心管理、用户管理、投放地区管理、汽车信息管理、汽车投放管理、汽车入库管理、使用订单管理、汽车归还管理。 用户角色&#xff1a;注册登录、汽车使用下单、汽车归还。 本共享汽车管理系统有管理员和用户。管…

DeepSeek+Kimi生成高质量PPT

DeepSeek与Kimi生成PPT全流程解析 一、工具分工原理 DeepSeek核心作用&#xff1a;生成结构化PPT大纲&#xff08;擅长逻辑构建与内容优化&#xff09;Kimi核心作用&#xff1a;将文本转换为视觉化PPT&#xff08;提供模板库与排版引擎&#xff09; 二、操作步骤详解 1. 通…

Android KMP初探

Android KMP初探 前言&#xff1a; 最近线上听了Kotlin官网举行的KMP会议&#xff0c;感觉听神奇的&#xff0c;于是就把官方demo下载下来尝试了一下&#xff0c;下载插件和所需要的依赖都用了很久&#xff0c;但是发现里面的代码很少&#xff0c;于是尝试自己手写了一下&…

鸿蒙NEXT应用App测试-通用测试

注意&#xff1a;大家记得学完通用测试记得再学鸿蒙专项测试 https://blog.csdn.net/weixin_51166786/article/details/145768653 注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章…

GO 快速升级Go版本

由于底层依赖升级了&#xff0c;那我们也要跟着升&#xff0c;go老版本已经不足满足需求了&#xff0c;必须要将版本升级到1.22.0以上 查看当前Go版本 命令查看go版本 go version [rootlocalhost local]# go version go version go1.21.4 linux/amd64 [rootlocalhost local]# …

Redis——用户签到BitMap,UV统计

目录 BitMap 使用场景 1. 用户签到系统 2. 用户行为标记 3. 布隆过滤器&#xff08;Bloom Filter&#xff09; BitMap介绍 Redis中的使用 Redis功能示例 添加&#xff1a; 获取&#xff1a; 批量获取&#xff1a; java中实现 统计本月连续签到次数 UV统计 UV 统计…

Redis|持久化

文章目录 总体介绍RDB&#xff08;Redis DataBase&#xff09;官网介绍案例演示优势劣势 总体介绍 官网地址&#xff1a;https://redis.io/docs/manual/persistence/ 持久化双雄&#xff1a; RDB&#xff08;Redis DataBase&#xff09;&#xff1a;RDB 是 Redis 默认的持久化…

51单片机编程学习笔记——点亮LED

大纲 器件51单片机开发板总结 安装驱动点亮LED烧录 随着最近机器人爆火&#xff0c;之前写的ROS2系列博客《Robot Operating System》也获得了更多的关注。我决定在机器人领域里再走一步&#xff0c;于是想到可以学习单片机。研究了下学习路径&#xff0c;最后还是选择先从51单…

基于Spring Boot的公司资产网站设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

华为2025年技术发布会:智能汽车核心技术大爆发

近日&#xff0c;华为在鸿蒙智行尊界技术发布会上发布了多项智能汽车核心技术&#xff0c;涵盖智能驾驶、安全防护、通信系统、座舱交互及电池技术等领域&#xff0c;标志着其从“被动智能”向“自主智能”的战略升级。 以下是核心技术的综合梳理&#xff1a; 六大核心创新 途…