Spring Boot Actuator(官网文档解读)

定义        

        Spring Boot Actuator 是 Spring Boot 提供的一个用于监控和管理应用程序的模块。它能够提供各种生产级别的功能,如健康检查、度量指标收集、配置属性查看等,帮助开发者了解应用的内部状态并进行故障排查。

Actuator 引入

        要启用 Actuator 的功能,只需在项目的依赖中加入 spring-boot-starter-actuator 即可:

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

自定义Actuator的地址和端口

        默认情况下,Actuator 的 HTTP 端口和应用的主 HTTP 端口是一样的。不过,在实际的生产环境中,你可能需要让 Actuator 端点监听不同的端口或者网络地址,以此增强系统的安全性与可管理性。

自定义端口

  • 我们可以通过如下配置进行对actuator模块访问端口的自定义:

server:port: 8091# 开启所有默认Web端点management:server:port: 8891
  • 我们的项目的端口是8091,但是访问/actuator 端点的端口是8891

自定义访问地址

  • 我们可以通过如下配置自定义actuator 模块的访问地址:

management:server:port: 8891address: 127.2.2.1
  • 现在我们访问/actuator端点的地址改为:http://127.2.2.1:8891/actuator

自定义敏感信息处理

        在 Spring Boot 应用里,对敏感信息(如密码、密钥等)进行清理(Sanitization)是保障数据安全的重要手段。默认情况下,Spring Boot 会对一些常见的敏感信息进行清理,但在实际项目中,你可能需要根据具体需求对清理逻辑进行自定义。下文将详细介绍如何通过定义 SanitizingFunction Bean 来自定义敏感信息的清理过程。

核心概念

  • SanitizingFunctionSanitizingFunction 是一个函数式接口,用于定义敏感信息的清理逻辑。你可以创建实现该接口的类,并将其注册为 Spring Bean,Spring Boot 会在需要清理敏感信息时调用这些函数。

  • SanitizableDataSanitizableData 类包含了需要清理的数据的相关信息,如键(key)、值(value)以及数据来源的 PropertySource。通过这些信息,你可以实现更精细的清理策略,例如针对特定 PropertySource 中的所有值进行清理。

  • 执行顺序:多个 SanitizingFunction 会按照注册顺序依次执行,直到其中一个函数修改了 SanitizableData 中的值,后续的函数将不再执行。

代码示例

1. 创建自定义的 SanitizingFunction 实现类

import org.springframework.boot.actuate.endpoint.SanitizableData;
import org.springframework.boot.actuate.endpoint.SanitizingFunction;
import org.springframework.core.env.PropertySource;public class CustomSanitizingFunction implements SanitizingFunction {@Overridepublic SanitizableData apply(SanitizableData data) {String key = data.getKey();String value = data.getValue();PropertySource<?> propertySource = data.getPropertySource();// 示例 1:对包含 "password" 或 "secret" 的键对应的值进行清理if (key != null && (key.contains("password") || key.contains("secret"))) {return data.withValue("******");}// 示例 2:对特定 PropertySource 中的所有值进行清理if (propertySource != null && "MySpecialPropertySource".equals(propertySource.getName())) {return data.withValue("CUSTOM_SANITIZED");}// 如果不需要清理,返回原始数据return data;}
}

        在上述代码中,CustomSanitizingFunction 实现了 SanitizingFunction 接口的 apply 方法。在该方法中,首先获取 SanitizableData 中的键、值和 PropertySource。然后根据不同的条件对值进行清理:

  • 若键包含 "password" 或 "secret",将值替换为 "******"。

  • PropertySource 的名称为 "MySpecialPropertySource",将值替换为 "CUSTOM_SANITIZED"。

  • 若不满足上述条件,则返回原始数据。

 2.将自定义的 SanitizingFunction 注册为 Spring Bean

        为了让 Spring Boot 能够使用自定义的 SanitizingFunction,需要将其注册为 Spring Bean。可以通过创建一个配置类来实现:

import org.springframework.boot.actuate.endpoint.SanitizingFunction;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class SanitizationConfig {@Beanpublic SanitizingFunction customSanitizingFunction() {return new CustomSanitizingFunction();}
}

        在上述代码中,SanitizationConfig 是一个配置类,使用 @Configuration 注解标记。在该类中,通过 @Bean 注解将 CustomSanitizingFunction 实例注册为 Spring Bean。

3. 测试自定义的清理功能

        在完成上述步骤后,你可以启动 Spring Boot 应用,并访问相关的 Actuator 端点(如 /actuator/env)来验证自定义的清理功能是否生效。

Actuator 集成 JMX

  • Java管理扩展(JMX)提供了监控和管理应用程序的标准机制。默认情况下,Spring Boot 并不会启用此功能。您可以通过将spring.jmx.enabled配置属性设置为true来启用它。SpringBoot将使用SpringJMX注释标记合适的MBeanServer,公开ID为MBeanServer的bean。

spring:jmx:enabled: true
  • spring.jmx.enabled仅影响 Spring 提供的管理 bean。启用其他库(例如Log4J2或Quartz)提供的管理 bean 是独立的。

Spring Boot-JMX 相关注解

@ManagedResource

        该注解的作用是把一个类标记为 JMX MBean。借助这个注解,能让该类成为可被 JMX 代理管理的资源。

  • 属性:

    • objectName:指定 MBean 的对象名,该名称在 JMX 代理中需保持唯一。

    • description:为 MBean 提供简要描述。

  • 代码示例:

mport org.springframework.jmx.export.annotation.ManagedResource;@ManagedResource(objectName = "com.example:type=MyManagedResource", description = "This is a managed resource.")
public class MyManagedResource {// 类的具体实现
}

        上述代码中,MyManagedResource 类被标记成了 JMX MBean,其对象名是 com.example:type=MyManagedResource,并且有相应的描述信息。

@ManagedAttribute

        该注解用于把类的某个属性(通常是 getter 和 setter 方法)暴露成 JMX MBean 的属性,这样就能在 JMX 代理中对该属性进行读取和修改操作。

  • 属性:

    • description:为属性提供简要描述。

    • currencyTimeLimit:设定属性值的有效时间,单位为秒。

  • 代码示例

import org.springframework.jmx.export.annotation.ManagedAttribute;
import org.springframework.jmx.export.annotation.ManagedResource;@ManagedResource(objectName = "com.example:type=MyManagedResource")
public class MyManagedResource {private String myAttribute;@ManagedAttribute(description = "This is a managed attribute.")public String getMyAttribute() {return myAttribute;}@ManagedAttributepublic void setMyAttribute(String myAttribute) {this.myAttribute = myAttribute;}
}

        在上述代码里,myAttribute 属性借助 @ManagedAttribute 注解被暴露成了 JMX MBean 的属性,可在 JMX 代理中对其进行读取和设置操作。

@ManagedOperation

        这个注解用于把类的某个方法暴露成 JMX MBean 的操作,从而可以在 JMX 代理中调用该方法。

  • 属性:

    • description:为操作提供简要描述。

    • impact:表明操作的影响,可取值为 INFOACTIONACTION_INFO 或 UNKNOWN

  • 代码示例

import org.springframework.jmx.export.annotation.ManagedOperation;
import org.springframework.jmx.export.annotation.ManagedResource;@ManagedResource(objectName = "com.example:type=MyManagedResource")
public class MyManagedResource {@ManagedOperation(description = "This is a managed operation.", impact = javax.management.MBeanOperationInfo.ACTION)public void doSomething() {System.out.println("Doing something...");}
}

        在上述代码中,doSomething 方法通过 @ManagedOperation 注解被暴露成了 JMX MBean 的操作,能够在 JMX 代理中调用该方法。

自定义MBean 名称

  • MBean 的名称通常由id端点的 生成。如果您的应用程序包含多个 Spring ApplicationContext,您可能会发现名称冲突。为了解决这个问题,您可以将spring.jmx.unique-names属性设置为true,以便 MBean 名称始终唯一。

  • 您还可以自定义端点所暴露的 JMX 域。以下是 application.yml的配置示例:

spring:jmx:unique-names: true
management:endpoints:jmx:domain: "com.example.myapp"

禁用JMX 相关端点

  • 如果您不想通过 JMX 公开端点,则可以将management.endpoints.jmx.exposure.exclude属性设置为*,如以下示例所示:

management:endpoints:jmx:exposure:exclude: "*"

Java-JMX 学习相关

        关于Java-JMX 的详细学习内容,可以参考下列文章:

Java-JMX (官网文档解读)_java jmx-CSDN博客
Java-JMX 组件架构即详解-CSDN博客Java-JMX (官网文档解读)_java jmx-CSDN博客

Spring Boot Actuator 集成 Micrometer

        Spring Boot Actuator 集成 Micrometer(官网文档解读)-CSDN博客

Spring Boot  Actuator EndPoints

        Spring Boot Actuator EndPoints(官网文档解读)-CSDN博客

参考文献

Actuator :: Spring Boot

Monitoring and Management over JMX :: Spring Boot

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

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

相关文章

如何实现图片式按钮的功能

文章目录 1. 概念介绍2. 使用方法2.1 filled风格2.2 filledTonal风格2.3 outlined风格 3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"如何修改NavigationBar组件的形状"相关的内容&#xff0c;本章回中将介绍IconButtion组件.闲话休提…

[LLM面试题] 指示微调(Prompt-tuning)与 Prefix-tuning区别

一、提示调整(Prompt Tuning) Prompt Tuning是一种通过改变输入提示语&#xff08;input prompt&#xff09;以获得更优模型效果的技术。举个例子&#xff0c;如果我们想将一条英语句子翻译成德语&#xff0c;可以采用多种不同的方式向模型提问&#xff0c;如下图所示&#xf…

2月10日QT

作业> 将文本编辑器功能完善 include "widget.h" #include "ui_widget.h" #include <QMessageBox> //消息对话框类 #include <QFontDialog> //字体类对话框 #include <QFont> //字体类 #include <QColorDialog> //颜…

安卓开发,底部导航栏

1、创建导航栏图标 使用系统自带的矢量图库文件&#xff0c;鼠标右键点击res->New->Vector Asset 修改 Name , Clip art 和 Color 再创建一个 同样的方法再创建四个按钮 2、添加百分比布局依赖 app\build.gradle.kts 中添加百分比布局依赖&#xff0c;并点击Sync Now …

Spring Boot中实现多租户架构

文章目录 Spring Boot中实现多租户架构多租户架构概述核心思想多租户的三种模式优势挑战租户识别机制1. 租户标识(Tenant Identifier)2. 常见的租户识别方式3. 实现租户识别的关键点4. 租户识别示例代码5. 租户识别机制的挑战数据库隔离的实现1. 数据库隔离的核心目标2. 数据…

《LeetCode Hot100》 Day01

Day01 轮转数组 思路&#xff1a; &#xff08;1&#xff09; 使用O(1) 空间复杂度解决&#xff0c;就需要原地解决&#xff0c;不能创建新的数组。 &#xff08;2&#xff09; 先整体反转数组&#xff0c;再反转前k个数&#xff0c;再反转剩下的数。即可完整本题。 &…

【python】matplotlib(animation)

文章目录 1、matplotlib.animation1.1、FuncAnimation1.2、修改 matplotlib 背景 2、matplotlib imageio2.1、折线图2.2、条形图2.3、散点图 3、参考 1、matplotlib.animation 1.1、FuncAnimation matplotlib.animation.FuncAnimation 是 Matplotlib 库中用于创建动画的一个…

【网络安全】服务器安装Docker及拉取镜像教程

文章目录 1. 安装 Docker2. 拉取镜像3. 运行 Ubuntu 容器4. 执行相关操作5. 退出并停止容器1. 安装 Docker # 更新软件包索引 sudo apt update# 安装必要的依赖 sudo apt install -y ca-certificates curl gnupg

Python应用指南:一个库解决常见的国内坐标系转换需求

在地理信息系统&#xff08;GIS&#xff09;和位置服务开发中&#xff0c;坐标转换是一项基础且至关重要的任务&#xff0c;不同坐标系统间的精确转换对于确保地图显示的准确性和提升基于地理位置的服务质量至关重要。coord-convert 库专为解决这一系列坐标转换问题而设计&…

win32汇编环境,对线程的创建与操作示例一

;运行效果 ;win32汇编环境,对线程的创建与操作示例一 ;线程是主进程之外并行运行着的过程&#xff0c;很多的时候&#xff0c;我们需要一些运算保持运行&#xff0c;但又不能影响进程&#xff0c;这个时候就需要线程 ;比如&#xff0c;在游戏外挂之中&#xff0c;需要每隔几秒判…

用 DeepSeek + Kimi 自动做 PPT,效率起飞

以下是使用 DeepSeek Kimi 自动做 PPT 的详细操作步骤&#xff1a; 利用 DeepSeek 生成 PPT 内容&#xff1a; 访问 DeepSeek 官网&#xff0c;完成注册/登录后进入对话界面。输入指令&#xff0c;例如“请用 Markdown 格式生成一份关于[具体主题]的 PPT 大纲&#xff0c;需包…

学习总结二十九

公路维修问题 这里首先先明白题意&#xff0c;就是一段路分为m段&#xff0c;只需要分m-1次。我们先要解决的的问题是如何在合适的地方截断。案例给出&#xff0c;发现第一段的末与第二段的头的位置相差很大&#xff0c;而每一段的每个坑位相差不是很大 。&#xff0c;所以就知…

C语言预处理艺术:编译前的魔法之旅

&#xff0c;这里是小编的博客频道 小编的博客&#xff1a;就爱学编程 很高兴在CSDN这个大家庭与大家相识&#xff0c;希望能在这里与大家共同进步&#xff0c;共同收获更好的自己&#xff01;&#xff01;&#xff01; 本文目录 引言正文一、预处理的作用与流程&#xff08;1&…

【go】交叉编译

发现go像是c&#xff0c;做后台还是比较好的 使用的是goland编辑器&#xff0c;可以在windows编译在linux上运行&#xff0c;配置如下&#xff1a; Goland中导入包标红但是能用解决办法 复制了一份项目代码task为task_bk&#xff0c;但是原来的task删除了&#xff0c;再次 把t…

防御综合实验

需求一 配置vlan [SW2]int g 0/0/2 [SW2-GigabitEthernet0/0/2]port link-type access [SW2-GigabitEthernet0/0/2]port default vlan 10 [SW2-GigabitEthernet0/0/2]int g0/0/3 [SW2-GigabitEthernet0/0/3]port link-type access [SW2-GigabitEthernet0/0/3]port default vl…

数据库高安全—数据保护:数据动态脱敏

书接上文数据库高安全—审计追踪&#xff1a;传统审计&统一审计&#xff0c;从传统审计和统一审计两方面对高斯数据库的审计追踪技术进行解读&#xff0c;本篇将从数据动态脱敏方面对高斯数据库的数据保护技术进行解读。 5.1 数据动态脱敏 数据脱敏&#xff0c;顾名思义就…

《艾尔登法环》运行时弹窗“由于找不到vcruntime140.dll,无法继续执行代码”要怎么解决?

宝子们&#xff0c;是不是在玩《艾尔登法环》的时候&#xff0c;突然弹出一个提示&#xff1a;“由于找不到vcruntime140.dll&#xff0c;无法继续执行代码”&#xff1f;这可真是让人着急上火&#xff01;别慌&#xff0c;今天就给大家唠唠这个文件为啥会丢&#xff0c;还有怎…

【Git】Failed to connect to github.com port 443: Timed out

由于DNS污染国内访问github经常会超时&#xff0c;参考网上的方法修改host文件绑定ip过段时间就失效了&#xff0c;这里介绍一个修改工具&#xff0c;通过修改本地host来绕过国内DNS解析实现连接 UsbEAm Hosts Editor UsbEAm Hosts Editor [多平台hosts修改] V3.63 – Dogfigh…

qml RoundButton详解

1、概述 RoundButton是QML&#xff08;Qt Modeling Language&#xff09;中的一种按钮控件&#xff0c;它继承自Button控件&#xff0c;并增加了一个特殊的属性——radius&#xff0c;用于设置按钮圆角的半径。这使得RoundButton能够呈现为带有圆角的形状&#xff0c;而不仅仅…

Django在终端创建项目(pycharm Windows)

1.选择目录 选择或新建一个文件夹&#xff0c;作为项目保存的地方 2.右键在终端打开 3.确定django-admin.exe安装位置 找到自己安装django时&#xff0c;django-admin.exe安装的位置&#xff0c;例如 4.运行命令 使用django-admin.exe的绝对路径&#xff0c;在刚才打开的终端…