JMX 组件架构即详解

        JMX架构由三个主要组件构成:

  • ‌MBeans(Managed Beans)‌:代表可管理的资源,是JMX的核心。MBean可以是Java类或接口,提供了管理操作的接口,如获取系统信息、设置参数等。
  • ‌MBeanServer‌:运行MBeans并处理管理操作的实体。每个Java虚拟机(JVM)都默认包含一个MBeanServer,它可以注册和管理MBeans,并提供了一组API来注册、查询、调用MBean的方法以及接收MBean的通知。
  • ‌代理(Agents)‌:用于暴露MBeanServer给网络中的其他管理工具或系统。JMX代理是一个独立的Java程序,负责加载和管理MBean。

MBean

  • MBean 是JMX中的一个标准概念,它代表了一个可以被管理的资源。
  • MBean 必须遵循特定的接口规范,比如它必须实现一个特定的接口或者继承自 javax.management.DynamicMBean
  • MBean 可以是标准的(Standard MBean)、动态的(Dynamic MBean)、开放式的(Open MBean)或者模型式的(Model MBean)。
  • MBean 的方法名称和签名必须与它们公开的属性和操作完全匹配。

MBean 分类

 JMX标准中将MBean分为以下几种:

  • Standard MBean(标准 MBean):它是最简单的一种 MBean 类型。一个标准 MBean 由一个 Java 接口和一个对应的实现类组成。接口中定义了 MBean 的属性和操作,实现类则提供了对应的实现。标准 MBean 的命名约定为 YourInterfaceNameMBean。
  • Dynamic MBean(动态 MBean):与标准 MBean 不同,动态 MBean 可以在运行时动态地确定其属性和操作。动态 MBean 的属性和操作是在运行时通过方法调用来确定的,因此可以根据需要进行动态修改。
  • Model MBean(模型 MBean):模型 MBean 是一种特殊的 MBean,它通过描述符来描述其管理接口,可以在运行时动态地配置其属性和操作。模型 MBean 可以通过 XML 或者通过程序动态地加载描述符。

  • Open MBean:开放 MBean 是一种通用的 MBean 类型,它可以包含各种类型的属性和操作。开放 MBean 不限制其属性和操作的类型,因此可以包含任意类型的数据。
  • MXBean:MXBean 是一种专门用于 JMX 的 MBean 类型。它定义了一种简单的 Java 接口和实现约定,用于描述 MBean 的属性和操作,同时这些接口和实现类遵循 Java Bean 的命名约定。MXBean 在 JMX 中用于管理特定类型的对象,例如内存使用情况、线程信息等。

 Standard MBean

        Standard MBean按照JMX的命名规范来定义接口然后注册到MBean Server中,MBean就能被JMX的client端访问到。

public interface HelloMBean {String getName();void setName(String name);void sayHello();
}public class Hello implements HelloMBean {private String name;
​@Overridepublic String getName() {return name;}
​@Overridepublic void setName(String name) {this.name = name;}
​@Overridepublic void sayHello() {System.out.println("Hello, " + name + "!");}
}
​public class Main {public static void main(String[] args) throws Exception {// 创建标准 MBean 实例HelloMBean helloMBean = new Hello();// 创建 MBeanServerMBeanServer mbs = ManagementFactory.getPlatformMBeanServer();// 创建 ObjectName,用于标识 MBeanObjectName name = new ObjectName("com.example:type=Hello");// 注册 MBean 到 MBeanServermbs.registerMBean(helloMBean, name);// 等待一段时间,使得可以通过 JConsole 或者其他 JMX 客户端来操作 MBeanThread.sleep(Long.MAX_VALUE);}
}
Spring boot 实现方式

1. 引入依赖

<!-- Spring Boot Actuator 依赖,它包含了 JMX 的支持 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2. yml 配置

spring:jmx:enabled: true

3. 注解实现Mbean 类

@Component
@ManagedResource(objectName = "bean:name=myBeanTest", description = "My Managed Bean")
public class MbeanTest {private String name;@ManagedAttribute(description = "The Name")public String getName() {return name;}@ManagedAttribute(description = "The Name")public void setName(String name) {this.name = name;}@ManagedOperation(description = "Say Hello")public String sayHello() {return "Hello, " + name;}
}

Dynamic MBean

        动态 MBean 的核心是实现 DynamicMBean 接口,该接口定义了一组方法,用于动态地获取和设置 MBean 的属性,执行 MBean 的操作,以及获取 MBean 的元数据信息。以下是 DynamicMBean 接口的几个核心方法:

  • getAttribute(String attribute):根据属性名获取属性值。
  • setAttribute(Attribute attribute):设置指定属性的值。
  • getAttributes(String[] attributes):批量获取属性值。
  • setAttributes(AttributeList attributes):批量设置属性值。
  • invoke(String actionName, Object[] params, String[] signature):执行指定的操作。
  • getMBeanInfo():获取 MBean 的元数据信息,包括属性、操作和描述信息。
@Component
@ManagedResource(objectName = "bean:name=DynamicMBeanTest", description = "My Dynamic Bean")
public class DynamicMBeanTest implements DynamicMBean {private String name;@Overridepublic Object getAttribute(String attribute) throws AttributeNotFoundException, MBeanException, ReflectionException {if (attribute.equals("Name")) {return name;} else {throw new AttributeNotFoundException("Attribute '" + attribute + "' not found");}}@Overridepublic void setAttribute(Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException {if (attribute.getName().equals("Name")) {name = (String) attribute.getValue();} else {throw new AttributeNotFoundException("Attribute '" + attribute.getName() + "' not found");}}@Overridepublic AttributeList getAttributes(String[] attributes) {AttributeList attrs = new AttributeList();for (String attr : attributes) {try {Object value = getAttribute(attr);attrs.add(new Attribute(attr, value));} catch (Exception e) {// Ignore if attribute not found}}return attrs;}@Overridepublic AttributeList setAttributes(AttributeList attributes) {AttributeList responseAttrs = new AttributeList();for (Attribute attr : attributes.asList()) {try {setAttribute(attr);responseAttrs.add(new Attribute(attr.getName(), getAttribute(attr.getName())));} catch (Exception e) {// Ignore if attribute not found or set failed}}return responseAttrs;}@Overridepublic Object invoke(String actionName, Object[] params, String[] signature) throws MBeanException, ReflectionException {if (actionName.equals("sayHello")) {return "Hello, " + name + "!";} else {throw new UnsupportedOperationException("Operation '" + actionName + "' not supported");}}@Overridepublic MBeanInfo getMBeanInfo() {MBeanAttributeInfo[] attributes = new MBeanAttributeInfo[]{new MBeanAttributeInfo("Name", "java.lang.String", "Name of the person", true, true, false)};MBeanOperationInfo[] operations = new MBeanOperationInfo[]{new MBeanOperationInfo("sayHello", "Say hello to the person", null, "java.lang.String", MBeanOperationInfo.ACTION)};return new MBeanInfo(this.getClass().getName(), "Dynamic Hello MBean", attributes, null, operations, null);}
}

Model MBean

        Model MBean 的核心是实现 ModelMBean 接口,该接口继承自 DynamicMBean 接口,因此具有动态 MBean 的所有特性,同时还添加了一些额外的方法用于管理描述符。

  • setModelMBeanInfo(ModelMBeanInfo mbi):设置 Model MBean 的元数据信息,包括属性、操作和描述符。
  • setManagedResource(Object mr, String mr_type):指定 Model MBean 管理的资源对象及其类型。
public class ModelMBeanTest {private static ModelMBeanInfo createModelMBeanInfo() throws Exception {// 创建属性描述符Descriptor nameDesc = new DescriptorSupport();nameDesc.setField("name", "Name");nameDesc.setField("descriptorType", "attribute");// 创建操作描述符Descriptor sayHelloDesc = new DescriptorSupport();sayHelloDesc.setField("name", "sayHello");sayHelloDesc.setField("descriptorType", "operation");// 创建属性列表ModelMBeanAttributeInfo[] attributes = new ModelMBeanAttributeInfo[]{new ModelMBeanAttributeInfo("Name", "java.lang.String", "Name of the person", true, true, false, nameDesc)};// 创建操作列表ModelMBeanOperationInfo[] operations = new ModelMBeanOperationInfo[]{new ModelMBeanOperationInfo("sayHello", "Say hello to the person", null, "java.lang.String", MBeanOperationInfo.ACTION, sayHelloDesc)};// 创建 ModelMBeanInfoModelMBeanInfo modelMBeanInfo = new ModelMBeanInfoSupport(ModelMBeanTest.class.getName(),"Simple Model MBean Example",attributes,null,operations,null);return modelMBeanInfo;}private static ModelMBean createModelMBean(ModelMBeanInfo modelMBeanInfo) throws Exception {// 创建 ModelMBean 实例RequiredModelMBean modelMBean = new RequiredModelMBean();modelMBean.setModelMBeanInfo(modelMBeanInfo);// 创建 MBean 实例ObjectName name = new ObjectName("com.example:type=SimpleModelMBean");ModelMBeanTest example = new ModelMBeanTest();// 设置 MBean 实例modelMBean.setManagedResource(example, "ObjectReference");return modelMBean;}public static void main(String[] args) throws Exception {// 创建 ModelMBeanInfo 对象ModelMBeanInfo modelMBeanInfo = createModelMBeanInfo();// 创建 ModelMBean 实例ModelMBean modelMBean = createModelMBean(modelMBeanInfo);// 创建 MBeanServerMBeanServer mbs = ManagementFactory.getPlatformMBeanServer();// 创建 ObjectName,用于标识 MBeanObjectName name = new ObjectName("com.example:type=ModelMBeanTest");// 注册 ModelMBean 到 MBeanServermbs.registerMBean(modelMBean, name);// 等待一段时间,使得可以通过 JConsole 或者其他 JMX 客户端来操作 MBeanThread.sleep(Long.MAX_VALUE);}}

Open MBean

        与传统的 Standard MBean 和 Dynamic MBean 不同,Open MBean 不需要预先定义接口,而是使用开放式的数据类型和操作来描述 MBean 的管理接口,使得可以更灵活地适应各种场景和需求。

@Component
public class SimpleOpenMBean extends NotificationBroadcasterSupport {// Constructorpublic SimpleOpenMBean() {super();openMBean();}// The actual value of the "SimpleProperty" attributeprivate int simpleProperty = 0;// Operation to reset the SimplePropertypublic void reset() {simpleProperty = 0;}public MBeanInfo openMBean() {OpenMBeanAttributeInfoSupport simplePropertyInfo =new OpenMBeanAttributeInfoSupport("SimpleProperty","The SimpleProperty of the SimpleOpenMBean",SimpleType.INTEGER,true,   // isReadabletrue,   // isWritablefalse); // isIsOpenMBeanConstructorInfoSupport constructorInfo =new OpenMBeanConstructorInfoSupport("SimpleOpenMBean","Constructs a SimpleOpenMBean instance",new OpenMBeanParameterInfoSupport[]{});OpenMBeanOperationInfoSupport resetOperationInfo =new OpenMBeanOperationInfoSupport("reset","Resets the SimpleProperty to 0",new OpenMBeanParameterInfoSupport[]{},SimpleType.VOID,MBeanOperationInfo.ACTION);return new OpenMBeanInfoSupport(SimpleOpenMBean.class.getName(),"SimpleOpenMBean Description",new OpenMBeanAttributeInfo[]{simplePropertyInfo},new OpenMBeanConstructorInfo[]{constructorInfo},new OpenMBeanOperationInfo[]{resetOperationInfo},new MBeanNotificationInfo[0]);}}

MXBean   

        在 Java 中,一切都被视为对象,而 JMX 则提供了一种标准化的方式来监控和管理 Java 程序的运行时状态、性能指标以及运行环境。而MXBean就是专门用于管理和监控这其中一些标准化类型的对象的,例如内存使用情况、线程信息、操作系统属性等。这些MBean是拿来即用的。

平台MXBean

       平台MXBean是 Java SE 平台提供的一组 MXBean,用于监视和管理 Java VM 以及 Java 运行时环境 (JRE) 的其他组件。每个平台 MXBean 都封装了一部分 Java VM 功能,例如类加载系统、即时 (JIT) 编译系统、垃圾收集器等。可以使用符合 JMX 规范的监视和管理工具显示这些 MXBean 并与之交互,以便您监视和管理这些不同的 VM 功能。Java SE 平台的 JConsole 图形用户界面 (GUI) 就是这样一种监视和管理工具。Java SE 平台提供了一个标准平台 MBean 服务器,这些平台 MXBean 都注册在该服务器中。平台 MBean 服务器还可以注册您希望创建的任何其他 MBean。

public class XMBeanTest {public static void main(String[] args) {// 获取内存管理MXBean,用于监控和管理Java虚拟机的内存系统MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean();// 获取线程系统MXBean,用于监控和管理Java虚拟机的线程系统ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();// 获取运行时系统MXBean,用于获取Java虚拟机的运行时信息RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();// 获取操作系统MXBean,用于获取操作系统的相关信息OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean();// 获取编译系统MXBean,用于获取Java虚拟机的即时编译器信息CompilationMXBean compilationMXBean = ManagementFactory.getCompilationMXBean();// 获取Java虚拟机堆内存的使用情况MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage();// 获取Java虚拟机非堆内存的使用情况MemoryUsage nonHeapMemoryUsage = memoryMXBean.getNonHeapMemoryUsage();// 获取类加载系统的MXBean,用于监控和管理Java虚拟机的类加载系统ClassLoadingMXBean classLoadingMXBean = ManagementFactory.getClassLoadingMXBean();// 获取所有内存池的MXBean列表,用于监控和管理Java虚拟机的内存池List<MemoryPoolMXBean> memoryPoolMXBeans = ManagementFactory.getMemoryPoolMXBeans();// 获取所有内存管理器的MXBean列表,用于监控和管理Java虚拟机的内存管理器List<MemoryManagerMXBean> memoryManagerMXBeans = ManagementFactory.getMemoryManagerMXBeans();// 获取所有垃圾收集器的MXBean列表,用于监控和管理Java虚拟机的垃圾收集器List<GarbageCollectorMXBean> garbageCollectorMXBeans = ManagementFactory.getGarbageCollectorMXBeans();System.out.println("Heap Memory Usage:");System.out.println("    Init: " + heapMemoryUsage.getInit() / (1024 * 1024) + " MB");System.out.println("    Used: " + heapMemoryUsage.getUsed() / (1024 * 1024) + " MB");System.out.println("    Committed: " + heapMemoryUsage.getCommitted() / (1024 * 1024) + " MB");System.out.println("    Max: " + heapMemoryUsage.getMax() / (1024 * 1024) + " MB");System.out.println("Non-Heap Memory Usage:");System.out.println("    Init: " + nonHeapMemoryUsage.getInit() / (1024 * 1024) + " MB");System.out.println("    Used: " + nonHeapMemoryUsage.getUsed() / (1024 * 1024) + " MB");System.out.println("    Committed: " + nonHeapMemoryUsage.getCommitted() / (1024 * 1024) + " MB");System.out.println("    Max: " + nonHeapMemoryUsage.getMax() / (1024 * 1024) + " MB");}
}

MBeanServer

  MBeanServer 是一个Java对象,它充当JMX代理的核心。它提供了一个注册和管理MBeans的环境。MBeans是遵循特定约定的Java对象,它们暴露了可以被管理的资源或服务。

MBeanServer作用
  • 注册和管理MBeans:MBeanServer 允许你注册MBeans,并通过ObjectName来引用它们。每个MBean都有一个唯一的ObjectName,它是MBeanServer用来识别和管理MBean的关键。
  • 提供访问接口:MBeanServer 提供了方法来访问MBeans的属性、调用操作、注册和接收通知。
  • 实现远程管理:通过连接器(如JMXMP或JMXRMI),MBeanServer 支持远程客户端的连接,从而允许远程管理和监控。
  • 支持多种协议:MBeanServer 可以通过不同的协议(如RMI、JMS、HTTP等)暴露MBeans。
MBeanServer关键特性
  • MBean注册:通过调用createMBeanregisterMBean方法,可以将MBean注册到MBeanServer中。
  • MBean操作:可以调用invoke方法来执行MBean的操作。
  • 属性访问:可以通过getAttributesetAttribute方法来读取和修改MBean的属性。
  • 事件和通知:MBeanServer 支持事件和通知机制,允许MBeans在特定事件发生时发送通知。
  • 代理和委托:MBeanServer 可以作为其他MBeanServer的代理或委托,实现更复杂的管理结构。
MBeanServer创建

        在Java应用程序中,通常使用以下方式来创建MBeanServer:

MBeanServer mBeanServer = MBeanServerFactory.createMBeanServer();

    如果使用JMX的javax.management.MBeanServerFactory

MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();

  ManagementFactory.getPlatformMBeanServer() 方法返回的MBeanServer 是Java虚拟机启动时创建的平台MBeanServer。

MBeanServer使用

        以下是一些使用MBeanServer的基本步骤:

  1. 创建或获取MBeanServer实例。
  2. 创建MBean实例。
  3. 通过ObjectName注册MBean到MBeanServer
  4. 使用MBeanServer的方法来访问MBean的属性、调用操作或接收通知。
// 创建MBeanServer
MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer();// 创建ObjectName
ObjectName name = new ObjectName("com.example:type=MyMBean");// 创建MBean实例
MyMBean mbean = new MyMBeanImpl();// 注册MBean
mBeanServer.registerMBean(mbean, name);// 调用MBean操作
mBeanServer.invoke(name, "myOperation", new Object[]{}, new String[]{});// 读取MBean属性
Integer value = (Integer) mBeanServer.getAttribute(name, "MyAttribute");

JMX Agent

        JMX Agent是指一个运行在Java虚拟机(JVM)中的管理实体,它负责管理一个或多个MBeans(Managed Beans),并提供与外部管理应用程序(如JMX客户端)的通信接口。

JMX Agent的组成

        一个JMX agent 通常包含以下几个主要组件:

  1. MBeanServer:agent 的核心组件,负责注册和管理MBeans,并提供对MBeans的操作、属性访问和通知的接口。

  2. MBeans:实现具体管理功能的Java对象,它们可以是标准MBeans、动态MBeans、开放MBeans或模型MBeans。

  3. JMX Connector:允许远程管理应用程序通过特定的协议(如RMI、JMXMP、IIOP、HTTP等)连接到agent

  4. Service MBean:提供agent级别的服务,如安全管理、事件处理、监控服务等。

  5. Adaptor:将agent中的MBeans暴露给不同的管理协议,例如将MBeans通过JMX RMI连接器暴露给远程客户端。

JMX Agent的功能
  • 本地和远程管理:agent 支持本地和远程管理,使得管理员可以通过本地或远程JMX客户端对Java应用程序进行监控和管理。
  • 服务封装:agent 可以将Java应用程序中的服务封装成MBeans,从而便于管理。
  • 安全管理:agent 可以实现访问控制,确保只有授权的管理员可以访问或修改MBeans。
  • 事件和通知:agent 支持事件和通知机制,允许MBeans在特定事件发生时发送通知给感兴趣的监听者。
JMX Agent的生命周期
  • 启动:当Java应用程序启动时,JMX agent 也会启动,并创建MBeanServer。
  • 运行:在运行期间,agent 管理MBeans,处理来自JMX客户端的请求,发送和接收通知。
  • 关闭:当Java应用程序关闭时,agent 会进行清理工作,如注销MBeans,关闭连接器等。
JMX Agent创建

        创建一个简单的JMX agent 通常涉及以下步骤:

  1. 创建MBeanServer实例。
  2. 创建并注册MBeans到MBeanServer
  3. 创建JMX连接器,以便远程访问。
  4. 启动连接器,使agent 可以接受远程连接。
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import javax.management.remote.JMXConnectorServer;
import javax.management.remote.JMXConnectorServerFactory;
import javax.management.remote.JMXServiceURL;public class JMXAgent {public static void main(String[] args) throws Exception {// 创建MBeanServerMBeanServer mBeanServer = MBeanServerFactory.createMBeanServer();// 创建ObjectNameObjectName name = new ObjectName("com.example:type=MyMBean");// 创建并注册MBeanMyMBean mbean = new MyMBeanImpl();mBeanServer.registerMBean(mbean, name);// 创建JMX服务URLJMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi");// 创建JMXConnectorServerJMXConnectorServer connectorServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mBeanServer);// 启动连接器connectorServer.start();// 打印连接信息System.out.println("JMX Agent is running at: " + url);}
}

参考文献

官方文档 : https://docs.oracle.com/javase/tutorial/jmx/overview/index.html

【JMX】JAVA监控的基石-CSDN博客
JMX使用详解-CSDN博客

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

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

相关文章

LLMs之ICL:《Bayesian scaling laws for in-context learning》翻译与解读

LLMs之ICL&#xff1a;《Bayesian scaling laws for in-context learning》翻译与解读 导读&#xff1a;这篇论文的核心议题是理解和建模大型语言模型&#xff08;LLM&#xff09;的上下文学习&#xff08;ICL&#xff09;能力。文章从贝叶斯学习的角度出发&#xff0c;提出了一…

基于单片机和测频法的频率计设计及proteus仿真

摘要: 传感器广泛应用在自动化测量中,该文利用 51 单片机 2 个 16 位定时器和测量频率中的测频法设计了测量方波的频率计,并用LCD1602 液晶显示频率、 proteus 仿真,测试结果表明设计思路正确、误差小。 关键词: 单片机;测频法;频率计; proteus 1 概述 传感器能感受到…

软件漏洞印象

软件漏洞印象 软件安全性检测 软件安全静态分析&#xff1a;学术界一度十分热衷的偏理论性方法软件漏洞动态挖掘&#xff0c;工程界普遍采用动态漏洞挖掘方式&#xff0c;即Fuzz技术&#xff0c;也称为模糊测试 漏洞利用 vs. 漏洞修复 对于已发现的软件漏洞 黑客会基于Meta…

计算机网络 —— HTTPS 协议

前一篇文章&#xff1a;计算机网络 —— HTTP 协议&#xff08;详解&#xff09;-CSDN博客 目录 前言 一、HTTPS 协议简介 二、HTTPS 工作过程 1.对称加密 2.非对称加密 3.中间人攻击 4.引入证书 三、HTTPS 常见问题 1.中间人能否篡改证书&#xff1f; 2.中间人能否调…

定点数的乘除运算

原码一位乘法 乘积的符号由两个数的符号位异或而成。&#xff08;不参与运算&#xff09;被乘数和乘数均取绝对值参与运算&#xff0c;看作无符号数。乘数的最低位为Yn&#xff1a; 若Yn1&#xff0c;则部分积加上被乘数|x|&#xff0c;然后逻辑右移一位&#xff1b;若Yn0&…

如何设置ChromeDriver路径?

设置ChromeDriver路径是为了让Selenium能够正确地调用Chrome浏览器进行自动化操作。以下是几种设置ChromeDriver路径的方法&#xff1a; 1. 系统环境变量 将ChromeDriver的路径添加到系统的环境变量中&#xff0c;这样在任何地方都可以直接调用ChromeDriver。 Windows系统&a…

数据挖掘:一、Weka软件的基本操作

实验目的和要求 了解Weka软件的使用 实验环境 Windows11 Weka3.8.6 实验内容与过程 实验内容 1、了解Weka使用的一般步骤 2、利用Weka,对数据集进行关联规则挖掘及数据分类 3、记录操作步骤、使用的数据、最终的结果 实验过程 首先打开weka下载官网,选择合适

【从零开始的LeetCode-算法】383. 赎金信

给你两个字符串&#xff1a;ransomNote 和 magazine &#xff0c;判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以&#xff0c;返回 true &#xff1b;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 示例 1&#xff1a; 输入&#…

【第二十四周】从大语言模型到多模态大模型的发展

摘要 大语言模型&#xff08;Large Language Model, LLM&#xff09;是指一类基于深度学习的人工智能系统&#xff0c;它们被设计用来理解和生成自然语言。这些模型通常是在大量的文本数据上进行训练的&#xff0c;通过学习文本中的模式和结构&#xff0c;它们能够执行各种各样…

https ssl免费证书申请,自动续期,acme、certd

本文为个人笔记&#xff0c;方便自己需要时查阅&#xff0c;同时提供出来给大家作为免费ssl证书自动续签需求的一种参考 大部分免费证书的有效期仅有3个月&#xff0c;所以证书管理会涉及到自动续期管理的问题 一、acme证书 大佬们常用的证书证书申请管理方式&#xff0c;提…

uniapp的生命周期

在 UniApp 中&#xff0c;生命周期函数是指在组件&#xff08;如页面、视图等&#xff09;创建和销毁过程中会自动触发的一些函数。UniApp 提供了多种生命周期函数&#xff0c;帮助开发者在适当的时机进行相关的逻辑处理。 UniApp 的生命周期函数可以分为 页面生命周期 和 组件…

unity打包到安卓帧率降低

这个问题遇到过很多次了我的做法就是直接设置Application.targetFrameRate60 参考

【Vue】v-model、ref获取DOM

目录 v-moel v-model的原理 v-model用在组件标签上 方式 defineModel()简写 ref属性 获取原生DOM 获取组件实例 nextTick() v-moel v-model&#xff1a;双向数据绑定指令 数据变了&#xff0c;视图跟着变&#xff08;数据驱动视图&#xff09;视图变了&#xff0c;数…

Kubernetes 常用操作大全:全面掌握 K8s 基础与进阶命令

Kubernetes&#xff08;简称 K8s&#xff09;作为一种开源的容器编排工具&#xff0c;已经成为现代分布式系统中的标准。它的强大之处在于能够自动化应用程序的部署、扩展和管理。在使用 Kubernetes 的过程中&#xff0c;熟悉常用操作对于高效地管理集群资源至关重要。本文将详…

sqlmap --os-shell的原理(MySQL,MSSQL,PostgreSQL,Oracle,SQLite)

1. MySQL 条件 数据库用户需要具备高权限&#xff08;如 FILE 权限&#xff09;。数据库服务运行用户需要对目标目录有写权限。Web 服务器有可写目录&#xff0c;且支持执行上传的脚本&#xff08;如 PHP、JSP 等&#xff09;。 原理 利用 MySQL 的 SELECT ... INTO OUTFIL…

Springboot 2.x 升级到Springboot 2.7.x问题汇总

Springboot 2.x 升级到Springboot 2.7.x问题 Springboot 2.x 升级到Springboot 2.7.x问题汇总 不废话 上干货 改变 1.mysql依赖groupId和artifactId更改&#xff1b; <dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</…

【计算机网络】实验13:运输层端口

实验13 运输层端口 一、实验目的 本次实验旨在验证TCP和IP运输层端口号的作用&#xff0c;深入理解它们在网络通信中的重要性。通过实验&#xff0c;我将探讨端口号如何帮助区分不同的应用程序和服务&#xff0c;使得在同一台主机上能够同时运行多个网络服务而不发生冲突。此…

【Redis】Redis基础——Redis的安装及启动

一、初识Redis 1. 认识NoSQL 数据结构&#xff1a;对于SQL来说&#xff0c;表是有结构的&#xff0c;如字段约束、字段存储大小等。 关联性&#xff1a;SQL 的关联性体现在两张表之间可以通过外键&#xff0c;将两张表的数据关联查询出完整的数据。 查询方式&#xff1a; 2.…

vuex 是什么?怎么使用?哪种功能场景使用它?

Vuex是Vue.js的状态管理库。它可以用来管理应用程序中的共享状态&#xff0c;并提供了一种集中式的方式来管理状态的变化。 使用Vuex&#xff0c;首先需要安装它&#xff1a; npm install vuex --save然后&#xff0c;在Vue应用程序的入口文件中&#xff0c;导入Vuex并在Vue实…

ElK 8 收集 MySQL 慢查询日志并通过 ElastAlert2 告警至飞书

文章目录 1. 说明2. 启个 mysql3. 设置慢查询4. filebeat 设置5. 触发慢查询6. MySQL 告警至飞书 1. 说明 elk 版本&#xff1a;8.15.0 2. 启个 mysql docker-compose.yml 中 mysql&#xff1a; mysql:# restart: alwaysimage: mysql:8.0.27# ports:# - "3306:3306&q…