当前位置: 首页 > news >正文

Java-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博客

相关文章:

Java-JMX 组件架构即详解

JMX架构由三个主要组件构成&#xff1a; ‌MBeans&#xff08;Managed Beans&#xff09;‌&#xff1a;代表可管理的资源&#xff0c;是JMX的核心。MBean可以是Java类或接口&#xff0c;提供了管理操作的接口&#xff0c;如获取系统信息、设置参数等。‌MBeanServer‌&#x…...

开源轻量级文件分享服务Go File本地Docker部署与远程访问

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

Rust快速入门(五)

生命周期 生命周期的主要作用是避免悬垂引用。 这里我们详细说说借用检查&#xff1a; {let r; // ----------- a// |{ // |let x 5; // --- b |r &x; // | |} /…...

租赁系统|租赁小程序|租赁小程序成品

租赁系统是现代企业管理中不可缺少的数字化工具&#xff0c;它通过高效的信息整合与流程管理&#xff0c;为企业带来极大的便利和效益。一个完善的租赁系统开发应具备以下必备功能&#xff1a; 一、用户管理 用户管理模块负责系统的访问控制&#xff0c;包括用户注册、登录验证…...

后端-pageHelp分页查询

在pom.xml文件中先导入分页的坐标 PageResult里面有两个后端返回给前端的参数&#xff0c;我们最后把PageResult再封装到Result中&#xff0c; PageResult和Result都是工具类 EmployeeDTO中是前端页面中的模糊查询字段和分页的两个值 注意&#xff01; 括号中的参数Employee…...

MySQL | 尚硅谷 | 第15章_存储过程与函数

MySQL笔记&#xff1a;第15章_存储过程与函数 文章目录 MySQL笔记&#xff1a;第15章_存储过程与函数第15章_存储过程与函数 1. 存储过程概述1.1 理解1.2 分类 2. 创建存储过程2.1 语法分析2.2 代码举例 3. 调用存储过程3.1 调用格式3.2 代码举例3.3 如何调试存储过程演示代码 …...

汽车零部件设计之——麦弗逊悬架KC特性分析仿真APP介绍

汽车零部件是汽车工业的基石&#xff0c;是构成车辆的基础元素。一辆汽车通常由上万件零部件组成&#xff0c;包括发动机系统、传动系统、制动系统、电子控制系统等&#xff0c;它们共同确保了汽车的安全、可靠性及高效运行。在汽车产业快速发展的今天&#xff0c;汽车零部件需…...

代码随想录-算法训练营day41(动态规划04:01背包,01背包滚动数组,分割等和子集)

第九章 动态规划part04● 01背包问题&#xff0c;你该了解这些&#xff01; ● 01背包问题&#xff0c;你该了解这些&#xff01; 滚动数组 ● 416. 分割等和子集 正式开始背包问题&#xff0c;背包问题还是挺难的&#xff0c;虽然大家可能看了很多背包问题模板代码&#xf…...

Vue Loader的作用

Vue Loader是一个专门用于处理Vue单文件组件&#xff08;SFCs&#xff0c;即Single File Components&#xff09;的webpack加载器&#xff08;loader&#xff09;。以下是Vue Loader的具体作用&#xff1a; 1、解析和转换Vue单文件组件 Vue Loader能够解析和转换.vue文件&…...

SRS 服务器入门:实时流媒体传输的理想选择

在当今视频流媒体需求爆炸式增长的时代&#xff0c;如何选择一款高效、稳定且功能强大的流媒体服务器成为了许多开发者和企业关注的焦点。而 SRS&#xff08;Simple Realtime Server&#xff09;作为一款开源的流媒体服务器&#xff0c;以其卓越的性能和灵活的功能&#xff0c;…...

4K高清壁纸网站推荐

1. Awesome Wallpapers 官网: https://4kwallpapers.com/ 主题: 创意、摄影、人物、动漫、绘画、视觉 分辨率: 4K Awesome Wallpapers 提供了丰富的高质量图片&#xff0c;分为通用、动漫、人物三大类&#xff0c;可以按屏幕比例和分辨率检索&#xff0c;满足你对壁纸的各种…...

如何保证数据库和缓存双写一致性?

数据库和缓存&#xff08;redis&#xff09;双写数据一致性问题再高并发的场景下&#xff0c;是一个很严重的问题&#xff0c;无论在工作中&#xff0c;还是面试&#xff0c;遇到的概率非常大&#xff0c;这里就聊一聊目前的常见解决方案以及最优方案。 常见方案 缓存的主要目…...

QT 多级嵌套结构体,遍历成员--半自动。<模板+宏定义>QTreeWidget树结构显示

Qt的QTreeWidget来显示嵌套结构体的成员&#xff0c;并以树形结构展示。 #include <QApplication> #include <QTreeWidget> #include <QTreeWidgetItem> #include <QString> #include <cstdint>// 假设这些是你的结构体定义 struct BaseMeterPa…...

《深入浅出HTTPS》读书笔记(17):公开密钥算法

公开密钥算法&#xff08;Public Key Cryptography&#xff09;&#xff0c;也称为非对称加密算法&#xff08;Asymmetrical Cryptography&#xff09;。 公开密钥算法的功能比较多&#xff0c;可以进行加密解密、密钥协商、数字签名。 【密钥是一对】 公开密钥算法的密钥是一对…...

React 中为什么不直接使用 requestIdleCallback?

首先看下 requestIdleCallback是什么&#xff1f; 简介 requestIdleCallback 是一个在浏览器空闲时执行低优先级任务的 API。 定义与用途 requestIdleCallback 方法允许开发者在浏览器的空闲时段内调度函数的执行。这些函数通常用于执行非关键性的、低优先级的任务&#xff0c…...

工作:SolidWorks从3D文件导出2D的DWG或DXF类型文件方法

工作&#xff1a;SolidWorks从3D文件导出2D的DWG或DXF类型文件方法 SolidWorks从3D文件导出2D的DWG或2D DXF类型文件方法&#xff08;一&#xff09;打开3D文件&#xff08;二&#xff09;从装配体到工程图&#xff08;三&#xff09;拖出想要的角度的图型&#xff08;四&#…...

element-ui radio和checkbox禁用时不置灰还是原来不禁用时的样式

把要紧用的内容加上一个class"notEdit-page" z注意要在style里面写不能加上scoped /*//checkBox自定义禁用样式*//*//checkBox自定义禁用样式*/ .notEdit-page.el-checkbox__input.is-disabled.is-checked.el-checkbox__inner::after {border-color: #fff; } .notEdi…...

MySQL 8.0 安装与配置技术文档(Ubuntu22.04)

MySQL 8.0 安装与配置技术文档 目录 环境准备下载 MySQL 安装包检查是否已安装 MySQL彻底卸载 MySQL安装 MySQL配置 MySQL创建用户并允许外网访问修改 root 用户密码参考链接 1. 环境准备 确保系统为 Ubuntu 22.04&#xff0c;并安装了以下基础工具&#xff1a; sudo apt-ge…...

【Linux】Ubuntu中安装多个版本的gcc、g++编译器,并自由切换

1、安装 1.1 命令安装 使用命令直接安装: sudo apt install gcc-[版本号] sudo apt install g++-[版本号]例如: sudo apt install gcc-10 sudo apt install g++-10 sudo apt install gcc-9 sudo apt install g++-9 sudo apt install gcc-8 sudo apt install g++-81.2 源码…...

uni-app登录界面样式

非常简洁的登录、注册界面模板&#xff0c;使用uni-app编写&#xff0c;直接复制粘贴即可&#xff0c;无任何引用&#xff0c;全部公开。 废话不多说&#xff0c;代码如下&#xff1a; login.vue文件 <template><view class"screen"><view class"…...

如何在小米平板5上运行 deepin 23 ?

deepin 23 加入了 ARM64 支持&#xff0c;这里尝试将 deepin 系统刷入平板中&#xff0c;平常使用中&#xff0c;带个笔记本电脑有时候也会嫌比较麻烦&#xff0c;把 Linux 系统刷入平板中既满足了使用需要&#xff0c;又满足了轻便的需求。为什么不使用 Termux &#xff1f;虽…...

Linux上的C语言编程实践

说明&#xff1a; 这是个人对该在Linux平台上的C语言学习网站笨办法学C上的每一个练习章节附加题的解析和回答 ex1: 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后运行它看看发生了什么。 vim ex1.c打开 ex1.c 文件。假如我们删除 return 0…...

ubuntu中使用ffmpeg库进行api调用开发

一般情况下&#xff0c;熟悉了ffmpeg的命令行操作&#xff0c;把他当成一个工具来进行编解码啥的问题不大&#xff0c;不过如果要把功能集成进自己的软件中&#xff0c;还是要调用ffmpeg的api才行。 ffmpeg的源码和外带的模块有点太多了&#xff0c;直接用官网别人编译好的库就…...

基于yolov8的SAR影像目标检测系统,支持图像、视频和摄像实时检测【pytorch框架、python源码】

更多目标检测、图像分类识别、目标追踪等项目可看我主页其他文章 功能演示&#xff1a; 基于yolov8的SAR影像目标检测系统&#xff0c;支持图像、视频和摄像实时检测【pytorch框架、python源码】_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov8的SAR影像目标…...

【源码】Sharding-JDBC源码分析之SQL中读写分离动态策略、数据库发现规则及DatabaseDiscoverySQLRouter路由的原理

Sharding-JDBC系列 1、Sharding-JDBC分库分表的基本使用 2、Sharding-JDBC分库分表之SpringBoot分片策略 3、Sharding-JDBC分库分表之SpringBoot主从配置 4、SpringBoot集成Sharding-JDBC-5.3.0分库分表 5、SpringBoot集成Sharding-JDBC-5.3.0实现按月动态建表分表 6、【…...

服务器卸载安装的 Node.js

卸载安装的 Node.js 版本&#xff0c;具体步骤取决于你是通过包管理器&#xff08;如 yum 或 dnf&#xff09;安装的&#xff0c;还是通过 nvm (Node Version Manager) 安装的。以下是针对这两种情况的指南。 通过包管理器卸载 Node.js 如果你是通过 yum 或 dnf 安装的 Node.…...

一键图片提取表格导出为Excel文档工具体验

在日常工作中&#xff0c;我们经常会遇到需要将图片中的表格数据转换为可编辑的Excel文件的情况。这不仅能够提高工作效率&#xff0c;还能减少手动输入数据的错误。本文将介绍一款实用的工具&#xff0c;它能够帮助我们快速实现图片到Excel的转换&#xff0c;同时保持操作的简…...

SpringBoot异常处理

SpringBoot异常处理 一、认识异常 异常分类&#xff1a; Error: 代表编译和系统错误&#xff0c;不允许捕获Exception: 标准Java库的方法所激发的异常&#xff0c;包含运行异常Runtime_Exception和非运行异常 Non_RuntimeException 的子类Runtime_Exception: 运行时异常。No…...

在 OAuth 2.0 中,refreshToken(刷新令牌)存在的意义

在 OAuth 2.0 中&#xff0c;refreshToken&#xff08;刷新令牌&#xff09; 的主要目的是为了提升用户体验和安全性&#xff0c;同时确保访问令牌的有效性。以下是需要使用 refreshToken 的原因&#xff1a; 1. 访问令牌的有限生命周期 访问令牌&#xff08;accessToken&…...

【Redis】壹 —— Redis 介绍

文章目录&#xff1a; 前言 一、认识Redis 1. Redis 用途 作为数据库 作为流引擎 二、服务端高并发分布式结构演变 1. 单机架构 2. 应用数据分离架构 3. 应用服务集群架构 4. 读写分离 / 主从分离架构 5. 冷热分离 —— 引入缓存 6. 分库分表 7. 微服务架构 8. …...

【html网页页面010】html+css制作茶品牌文创网页制作含视频元素(7页面附效果及源码)

茶主题品牌文创网页制作 &#x1f964;1、写在前面&#x1f367;2、涉及知识&#x1f333;3、网页效果完整效果(7页)&#xff1a;代码目录结构&#xff1a;page1、主页page2、精品包装page3、茶园一角page4、品牌地带page5、衍生品page6、联X我们page7、视频详情页 &#x1f30…...

【项目实战】基于python+爬虫的电影数据分析及可视化系统

注意&#xff1a;该项目只展示部分功能&#xff0c;如需了解&#xff0c;文末咨询即可。 本文目录 1.开发环境2 系统设计 2.1 设计背景2.2 设计内容 3 系统页面展示 3.1 用户页面3.2 后台页面3.3 功能展示视频 4 更多推荐5 部分功能代码 5.1 爬虫代码5.2 电影信息代码 1.开发环…...

K8S命令部署后端(流水线全自动化部署)

前言 本文为链接: 云效流水线k8s半自动部署java&#xff08;保姆级&#xff09;的补充,本文起初的目的是为了补充完善k8s流水线的全自动化部署,但是也适用于k8s的一键重启,因为使用k8s的web页面容易出现漏点的情况,因此也可以把代码保存为shell脚本,同样可以实现一键重启。关于…...

GPS北斗卫星授时服务器功能是什么?应用是什么?

GPS北斗卫星授时服务器功能是什么&#xff1f;应用是什么&#xff1f; GPS北斗卫星授时服务器功能是什么&#xff1f;应用是什么&#xff1f; 摘 要:首先对计算机网络时间同步相关技术进行了介绍,然后阐述了时间同步技术在现代计算机网络中的应用与发展,最后指出时间同步网络…...

学习笔记064——如何手动将jar包导入到maven本地库

文章目录 1、背景&#xff1a;2、方法 1、背景&#xff1a; 有时网络慢的情况&#xff0c; 本地maven库需要导入外部下载的jar包。 以便于在项目的pom文件中&#xff0c;直接写dependency写导入依赖。 2、方法 在Windows终端中&#xff0c;输入&#xff1a; mvn install:in…...

未来趋势系列 篇二:HBM题材解析和股票梳理

文章目录 系列文章HBM题材解析环氧塑封电镀液PSPI(光敏性聚酰亚胺)前驱体封装基板其他材料TSV技术封装测试股票梳理系列文章 未来趋势系列 篇一:AI题材解析和股票梳理 HBM HBM(High Bandwidth Memory,高带宽内存)是一种专为高效能运算设计的新兴高速内存接口技术。它通…...

网卡驱动测试

以下是网卡驱动不同测试类型的具体方法和命令&#xff1a; 1. 功能性测试 驱动加载/卸载测试&#xff1a; 方法&#xff1a;加载/卸载网卡驱动&#xff0c;观察日志是否报错。命令&#xff1a; modprobe <driver_name> # 加载驱动 rmmod <driver_name> # 卸载驱动…...

DDR的跨4K问题

参考视频&#xff1a;【深入理解FPGA底层逻辑】、4k边界和outsdanding_哔哩哔哩_bilibili 1、AXI4_FULL突发写一个字节是一个地址&#xff0c; 2、协议规定&#xff0c;把AXI4从机的地址区间从0进行到了4095....每4K进行一次分配 所以突发长度的计算如下&#xff1a; 另外AX…...

数据结构---栈(Stack)

1. 简介 栈&#xff08;Stack&#xff09;是计算机科学中的一种抽象数据类型&#xff0c;它遵循特定的操作顺序&#xff0c;即后进先出&#xff08;Last In First Out&#xff0c;LIFO&#xff09;。这意味着最后添加到栈中的元素将是第一个被移除的。栈的基本操作通常包括&am…...

【JavaWeb后端学习笔记】Java上传文件到阿里云对象存储服务

阿里云对象存储 1、创建阿里云对象存储节点2、上传文件2.1 修改项目配置文件2.2 定义一个Properties类获取配置信息2.3 准备一个alioss工具类2.4 创建注册类&#xff0c;将AliOssUtil 注册成Bean2.5 使用AliOssUtil 工具类上传文件2.6 注意事项 使用阿里云对象存储服务分为以下…...

Unity3D RPG战斗系统详解

前言 设计一个RPG&#xff08;角色扮演游戏&#xff09;的战斗系统是游戏开发中的关键环节&#xff0c;它决定了游戏的乐趣和挑战性。在Unity3D中&#xff0c;可以通过多种技术和工具来实现一个功能完善的战斗系统。以下是对RPG战斗系统的技术详解以及代码实现。 对惹&#x…...

Spark架构及运行流程

Spark架构图 Driver&#xff1a; 解析用户的应用程序代码&#xff0c;转化为作业(job)。创建SparkContext上下文对象&#xff0c;其负责与资源管理器(ClusterManager)通信&#xff0c;进行资源的申请、任务的分配和监控等。跟踪Executor的执行情况。可通过UI界面查询运行情况。…...

SpringBoot3整合MyBatis

一、MyBatis整合步骤: (1).导入依赖:在Spring Boot项目的构建文件(如pom.xml)中添加MyBatis和数据库驱动的相关依赖。例如&#xff0c;如果使用MySQL数据库&#xff0c;您需要添加MyBatis和MySQL驱动的依赖。 (2).配置数据源:在application.properties或application.yml中配置…...

【计网笔记】习题

物理层 不属于物理层接口规范定义范畴的是&#xff08;C&#xff09; A. 接口形状 B. 引脚功能 C. 物理地址 D. 信号电平 【2023-912】光网络只能通过导向型介质传播。&#xff08;&#xff09; 【2017-408】若信道在无噪声情况下的极限数据传输速率不小于信噪比为30dB条件下的…...

力扣56.合并区间

题目描述 题目链接56. 合并区间 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; …...

【oracle】大数据删除插入

文章目录 引言本文目标 Oracle大数据插入操作插入操作的场景和需求使用并行查询进行数据插入示例代码&#xff1a;创建新表并插入数据解释代码中的关键点 性能优化建议 Oracle大数据删除操作删除操作的场景和需求使用游标和批量处理进行数据删除示例代码&#xff1a;批量删除数…...

mysql 双1设置

MySQL 的"双1"设置通常指的是两个配置参数&#xff1a;innodb_flush_log_at_trx_commit 和 sync_binlog。这两个参数都与 MySQL 的数据安全和性能有关。 innodb_flush_log_at_trx_commit&#xff1a;这个参数控制了 InnoDB 引擎中事务日志的刷新频率。它有三个可能的…...

《C++ 赋能 K-Means 聚类算法:开启智能数据分类之旅》

在当今数字化浪潮汹涌澎湃的时代&#xff0c;人工智能无疑是引领科技变革的核心驱动力之一。而在人工智能的广袤天地中&#xff0c;数据分类与聚类作为挖掘数据内在价值、揭示数据潜在规律的关键技术手段&#xff0c;正发挥着前所未有的重要作用。K-Means 聚类算法&#xff0c;…...

用Python开发一个经典贪吃蛇小游戏

Python 是开发小游戏的绝佳工具,借助第三方库,如 pygame,我们可以快速开发一个经典的贪吃蛇游戏。本篇将介绍如何用 Python 实现一个完整的贪吃蛇小游戏。 一、游戏设计 1.1 游戏规则 玩家通过方向键控制贪吃蛇移动。贪吃蛇吃到食物后会变长,同时得分增加。如果贪吃蛇撞到…...

《大宋豪侠传》客户端源码 + 服务端源码 + 工具源码 + 资源,大小16.3G

《大宋豪侠传》客户端源码 服务端源码 工具源码 资源&#xff0c;大小16.3G 下载地址&#xff1a; 通过网盘分享的文件&#xff1a;【源码】《大宋豪侠传》客户端源码 服务端源码 工具源码 资源&#xff0c;大小16.3G 链接: https://pan.baidu.com/s/1lUf84LzXKB3iM7L-1P…...