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

ActiveMQ 安全机制与企业级实践(一)

一、引言

{"type":"load_by_key","key":"auto_image_0_0","image_type":"search"}

在当今数字化时代,企业级应用的架构愈发复杂,各个系统之间的通信和协作变得至关重要。消息队列作为一种高效的异步通信机制,在企业级应用集成中扮演着关键角色。ActiveMQ 作为一款广泛使用的开源消息中间件,以其丰富的功能、卓越的性能和出色的稳定性,成为众多企业构建分布式系统的首选。

ActiveMQ 提供了可靠的消息传递服务,支持多种消息模型,如点对点(Point - to - Point)和发布 / 订阅(Publish/Subscribe),能够满足不同场景下的通信需求。它支持多种传输协议,包括 TCP、UDP、SSL 等,具备灵活的部署方式,可适应各种复杂的网络环境。

在实际应用中,ActiveMQ 广泛应用于电商、金融、物流等多个领域。以电商系统为例,在高并发的订单处理场景下,ActiveMQ 可以将订单消息异步发送到各个相关系统,如库存系统、物流系统等,有效缓解系统压力,提高处理效率。在金融领域,消息的准确性和安全性至关重要,ActiveMQ 通过其强大的安全机制,确保交易信息的可靠传输和处理,满足金融业务对数据安全的严格要求。

然而,随着企业应用对数据安全和隐私保护的重视程度不断提高,ActiveMQ 的安全机制显得尤为关键。在消息传输过程中,可能会面临网络攻击、数据泄露等安全威胁,因此,了解和掌握 ActiveMQ 的安全机制,并在企业级实践中合理应用,是保障系统稳定运行和数据安全的重要前提。本文将深入探讨 ActiveMQ 的安全机制,并结合实际案例分享其在企业级实践中的应用经验。

二、ActiveMQ 安全机制核心概念

2.1 认证机制

身份验证是 ActiveMQ 安全机制的基础,它用于确认客户端连接的身份是否合法,只有通过身份验证的客户端才能与 ActiveMQ 服务器进行交互 。这就好比进入一个机密场所,需要出示有效的证件进行身份核实,只有证件合法的人才能进入。

ActiveMQ 支持多种认证方式,以满足不同场景下的安全需求。常见的认证方式包括基于用户名和密码的认证、基于 X.509 证书的认证、基于 LDAP(Lightweight Directory Access Protocol)的认证。

基于用户名和密码的认证是最常用的方式。客户端在连接 ActiveMQ 服务器时,需要提供预先配置好的用户名和密码。ActiveMQ 服务器会将接收到的用户名和密码与内部存储的用户信息进行比对,如果匹配成功,则认证通过。这种方式简单直接,易于理解和配置,适用于大多数常规应用场景。例如,在一个企业内部的订单处理系统中,各个业务模块作为客户端连接到 ActiveMQ 服务器,通过用户名和密码认证来确保只有授权的模块能够进行消息的发送和接收,保证订单数据的安全传输。

基于 X.509 证书的认证则利用数字证书来验证客户端的身份。客户端在连接时需要提供有效的 X.509 证书,服务器会验证证书的有效性,包括证书是否过期、是否被吊销等。这种认证方式安全性更高,因为数字证书具有唯一性和不可伪造性,能够有效防止身份被冒用。在金融行业的交易系统中,由于对安全性要求极高,常常采用基于 X.509 证书的认证方式,确保交易信息的安全传输和处理,防止黑客攻击和数据泄露。

基于 LDAP 的认证是将用户信息存储在 LDAP 服务器中,ActiveMQ 通过与 LDAP 服务器进行交互来验证用户身份。这种方式适用于企业已经使用 LDAP 进行用户管理的场景,可以实现统一的用户认证和管理。比如,大型企业通常使用 LDAP 来集中管理员工的账号信息,在使用 ActiveMQ 构建内部通信系统时,通过基于 LDAP 的认证,可以直接利用已有的 LDAP 用户信息,无需重复创建和管理用户,提高了管理效率和安全性。

2.2 授权机制

授权是在身份验证的基础上,进一步控制用户对 ActiveMQ 资源的访问权限。它决定了用户可以对消息队列、主题等资源执行哪些操作,比如是否可以发送消息、接收消息或者管理队列。这就如同在一个图书馆中,不同的读者根据其权限可以进行不同的操作,普通读者只能借阅书籍,而管理员则可以进行书籍的上架、下架等管理操作。

ActiveMQ 采用基于角色访问控制(RBAC,Role - Based Access Control)的授权策略。在这种策略下,首先会定义不同的角色,每个角色被赋予一组特定的权限。然后,将用户分配到相应的角色中,用户就继承了该角色的所有权限。例如,定义一个 “admin” 角色,该角色具有创建队列、删除队列、发送和接收消息等所有权限;再定义一个 “consumer” 角色,该角色只具有接收消息的权限。当一个用户被分配到 “consumer” 角色时,他就只能执行接收消息的操作,无法进行其他管理操作。

在实际配置中,可以通过配置文件来定义角色和权限。例如,在 ActiveMQ 的配置文件中,可以使用以下方式定义一个角色及其权限:

 

<authorizationPlugin>

<map>

<authorizationMap>

<authorizationEntries>

<authorizationEntry queue=">" read="consumers" write="producers" admin="admins"/>

<authorizationEntry topic=">" read="subscribers" write="publishers" admin="admins"/>

</authorizationEntries>

</authorizationMap>

</map>

</authorizationPlugin>

上述配置表示,对于所有队列(“queue=>” 表示所有队列),“consumers” 角色具有读取权限(即可以接收消息),“producers” 角色具有写入权限(即可以发送消息),“admins” 角色具有管理权限(可以进行创建、删除等操作);对于所有主题(“topic= >” 表示所有主题),“subscribers” 角色具有读取权限,“publishers” 角色具有写入权限,“admins” 角色具有管理权限。通过这种方式,可以灵活地控制不同用户对 ActiveMQ 资源的访问权限,提高系统的安全性和可控性。

2.3 数据加密

在消息传输过程中,数据加密起着至关重要的作用。它能够确保消息内容不被窃取或篡改,保护数据的机密性和完整性。尤其是在传输敏感信息,如用户密码、财务数据等时,数据加密是必不可少的安全措施。就像在快递运输贵重物品时,会对物品进行密封和加密处理,防止物品在运输过程中被损坏或被盗。

ActiveMQ 支持多种数据加密方式,其中 SSL/TLS(Secure Sockets Layer/Transport Layer Security)加密是常用的方式之一。SSL/TLS 是一种广泛应用于网络通信的安全协议,它通过使用加密算法和证书来保护数据的传输。在 ActiveMQ 中使用 SSL/TLS 加密时,客户端和服务器之间会进行握手过程,交换密钥和证书,建立安全的通信通道。之后,所有在该通道上传输的消息都会被加密,只有拥有正确密钥的接收方才能解密并读取消息内容。

要在 ActiveMQ 中配置 SSL/TLS 加密,需要进行以下步骤:

  1. 生成证书和密钥:可以使用工具如 OpenSSL 来生成自签名证书和私钥。例如,使用以下命令生成一个自签名证书和私钥:
 

openssl req -newkey rsa:2048 -nodes -keyout server.key -x509 -days 365 -out server.crt

上述命令会生成一个 2048 位的 RSA 私钥(server.key)和一个自签名证书(server.crt),证书有效期为 365 天。

2. 配置 ActiveMQ Broker:在 ActiveMQ 的配置文件(如 activemq.xml)中,添加以下配置来启用 SSL/TLS 加密传输:

 

<transportConnectors>

<transportConnector name="sslConnector" uri="ssl://localhost:61617?needClientAuth=true"/>

</transportConnectors>

<sslContext>

<keyStore location="path/to/keystore.jks" password="keystore_password"/>

<trustStore location="path/to/truststore.jks" password="truststore_password"/>

</sslContext>

其中,“uri” 指定了 SSL/TLS 连接器的地址和端口,“needClientAuth=true” 表示需要客户端进行身份验证;“keyStore” 属性指定了服务器证书和私钥的路径及密码,“trustStore” 属性指定了信任证书库的路径及密码。

3. 配置客户端连接:在客户端连接 ActiveMQ 时,也需要配置相应的 SSL/TLS 参数,以确保能够与服务器建立安全连接。例如,在 Java 客户端中,可以使用以下方式配置连接工厂:

 

ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("ssl://localhost:61617");

connectionFactory.setTrustStore("path/to/truststore.jks");

connectionFactory.setTrustStorePassword("truststore_password");

Connection connection = connectionFactory.createConnection();

connection.start();

通过以上配置,ActiveMQ 就可以在消息传输过程中使用 SSL/TLS 加密,有效保护数据的安全。

2.4 审计日志

审计日志在 ActiveMQ 的安全管理中扮演着重要的角色,它用于记录系统中的各种操作,以便在发生安全事件时能够进行追溯和分析。就像飞机上的黑匣子,记录着飞行过程中的各种数据和操作,一旦发生事故,可以通过黑匣子的数据来分析事故原因。

ActiveMQ 通过记录和管理操作日志,能够详细记录客户端的连接、消息的发送和接收、队列和主题的创建与删除等操作。这些日志信息可以帮助管理员及时发现潜在的安全问题,如未经授权的访问尝试、异常的消息流量等。例如,如果发现某个 IP 地址频繁尝试连接 ActiveMQ 服务器但认证失败,管理员就可以进一步调查该 IP 地址是否存在恶意攻击的嫌疑。

在 ActiveMQ 中,可以通过配置来启用审计日志功能。通常,可以在配置文件中添加相关的审计日志配置,指定日志的记录级别、存储位置等。例如:

 

<broker>

<plugins>

<auditBrokerPlugin>

<destination>auditQueue</destination>

<excludedDestinations>ActiveMQ.Advisory.*</excludedDestinations>

<logAll>true</logAll>

</auditBrokerPlugin>

</plugins>

</broker>

上述配置表示启用审计日志插件,将审计日志发送到名为 “auditQueue” 的队列中,排除 “ActiveMQ.Advisory.*” 相关的目的地(即不记录这些目的地的操作日志),并且记录所有操作(“logAll=true”)。通过合理配置审计日志,管理员可以更好地监控和管理 ActiveMQ 系统的安全状态,及时发现并处理安全隐患。

三、ActiveMQ 安全机制实践要点

3.1 简单认证插件配置

简单认证插件是 ActiveMQ 中一种便捷的认证方式,它允许我们直接在 XML 配置文件中定义用户的认证信息。这种方式简单直观,易于理解和配置,特别适合在开发和测试环境中使用,或者在对安全要求不是特别高的小型项目中应用。下面我们详细介绍其配置步骤及示例代码。

首先,打开 ActiveMQ 的配置文件activemq.xml,在<broker>标签内添加<plugins>标签,并在其中配置<simpleAuthenticationPlugin>插件。示例代码如下:

 

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}">

<plugins>

<simpleAuthenticationPlugin>

<users>

<authenticationUser username="admin" password="admin123" groups="admins,publishers,consumers"/>

<authenticationUser username="producer" password="producer123" groups="publishers"/>

<authenticationUser username="consumer" password="consumer123" groups="consumers"/>

</users>

</simpleAuthenticationPlugin>

</plugins>

<!-- 其他配置 -->

</broker>

在上述代码中:

  • <authenticationUser>标签用于定义每个用户的认证信息。
  • username属性指定用户名,如 “admin”“producer”“consumer”。
  • password属性指定用户的密码,如 “admin123”“producer123”“consumer123”。
  • groups属性指定用户所属的组,多个组之间用逗号分隔。例如,“admin” 用户属于 “admins”“publishers”“consumers” 组,这意味着 “admin” 用户具有这三个组所对应的所有权限。

配置完成后,保存activemq.xml文件,然后重启 ActiveMQ 服务,使配置生效。此时,当客户端连接 ActiveMQ 时,就需要提供配置的用户名和密码进行认证。例如,在 Java 客户端中,使用以下代码进行连接:

 

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.Connection;

import javax.jms.ConnectionFactory;

import javax.jms.JMSException;

public class ActiveMQClient {

public static void main(String[] args) {

String brokerURL = "tcp://localhost:61616";

String username = "admin";

String password = "admin123";

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(username, password, brokerURL);

try {

Connection connection = connectionFactory.createConnection();

connection.start();

// 进行后续的消息发送或接收操作

connection.close();

} catch (JMSException e) {

e.printStackTrace();

}

}

}

在上述 Java 代码中,通过ActiveMQConnectionFactory的构造函数传入用户名、密码和 Broker 的 URL,创建连接工厂。然后使用连接工厂创建连接,并启动连接,从而实现了带有认证信息的客户端连接。如果客户端提供的用户名或密码不正确,将会抛出JMSException异常,表示认证失败。

3.2 JAAS 认证插件配置

JAAS(Java Authentication and Authorization Service)认证插件是一种基于 Java 标准的认证和授权服务,它提供了更强大和灵活的认证解决方案,适用于对安全要求较高的企业级应用场景。下面我们来深入了解其原理及配置方法。

JAAS 认证插件的原理

JAAS 采用可插拔的架构,通过配置文件来加载和管理不同的登录模块(LoginModule)。当客户端进行认证时,JAAS 会根据配置文件中的规则,依次调用相应的 LoginModule 进行身份验证。每个 LoginModule 负责验证用户的一种身份信息,例如用户名和密码、数字证书等。如果所有的 LoginModule 都验证通过,则认证成功;否则,认证失败。这种机制使得 JAAS 能够方便地集成各种不同的安全机制,满足不同应用场景的需求。

配置步骤
  1. 配置login.config文件:在activemq.xml文件所在的目录下,创建login.config文件(如果没有的话)。该文件用于定义 JAAS 的认证配置。示例内容如下:
 

activemq {

org.apache.activemq.jaas.PropertiesLoginModule required

org.apache.activemq.jaas.properties.user="users.properties"

org.apache.activemq.jaas.properties.group="groups.properties";

};

上述配置中,activemq是一个配置项的名称,可以自定义。org.apache.activemq.jaas.PropertiesLoginModule表示使用 ActiveMQ 提供的基于属性文件的登录模块。required表示该登录模块必须成功验证,认证才会通过。org.apache.activemq.jaas.properties.user和org.apache.activemq.jaas.properties.group分别指定了存储用户信息和用户组信息的属性文件路径。

  1. 配置users.properties文件:在与login.config文件相同的目录下,创建users.properties文件,用于存储用户的用户名和密码信息。示例内容如下:
 

admin=admin123

producer=producer123

consumer=consumer123

每行的格式为 “用户名 = 密码”,如 “admin=admin123” 表示用户名为 “admin”,密码为 “admin123”。

  1. 配置groups.properties文件:同样在该目录下,创建groups.properties文件,用于存储用户组和用户的对应关系。示例内容如下:
 

admins=admin

publishers=producer

consumers=consumer

每行的格式为 “用户组 = 用户名”,如 “admins=admin” 表示 “admin” 用户属于 “admins” 组。

  1. activemq.xml中配置 JAAS 认证插件:在activemq.xml文件的<plugins>标签内,添加<jaasAuthenticationPlugin>插件配置。示例代码如下:
 

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}">

<plugins>

<jaasAuthenticationPlugin configuration="activemq"/>

</plugins>

<!-- 其他配置 -->

</broker>

其中,configuration="activemq"表示使用login.config文件中名为 “activemq” 的配置项。

配置完成后,重启 ActiveMQ 服务,JAAS 认证插件就会生效。此时,客户端连接 ActiveMQ 时,将按照 JAAS 的配置进行身份验证。

3.3 数据加密配置

在消息传输过程中,数据加密是保护数据安全的重要手段。以 AMQP 协议为例,我们可以使用 SSL/TLS 进行数据加密,确保消息在传输过程中不被窃取或篡改。下面详细介绍其配置步骤及示例代码。

  1. 生成证书和密钥:使用工具如 OpenSSL 生成自签名证书和私钥。假设我们将证书和密钥生成在/path/to/ssl目录下,执行以下命令:
 

openssl req -newkey rsa:2048 -nodes -keyout /path/to/ssl/server.key -x509 -days 365 -out /path/to/ssl/server.crt

上述命令会生成一个 2048 位的 RSA 私钥server.key和一个自签名证书server.crt,证书有效期为 365 天。

  1. 配置 ActiveMQ Broker:在activemq.xml文件中,配置 SSL/TLS 相关参数。示例代码如下:
 

<transportConnectors>

<transportConnector name="amqpSslConnector" uri="amqp://localhost:5672?ssl=true&keyStore=/path/to/ssl/keystore.jks&keyStorePassword=keystore_password&trustStore=/path/to/ssl/truststore.jks&trustStorePassword=truststore_password"/>

</transportConnectors>

在上述配置中:

  • uri属性指定了 AMQP 协议的 SSL/TLS 连接器的地址和端口,ssl=true表示启用 SSL/TLS 加密。
  • keyStore属性指定了服务器密钥库的路径,keyStorePassword属性指定了密钥库的密码。
  • trustStore属性指定了信任库的路径,trustStorePassword属性指定了信任库的密码。
  1. 配置客户端连接:在客户端连接 ActiveMQ 时,也需要配置相应的 SSL/TLS 参数。以 Java 客户端为例,示例代码如下:
 

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.Connection;

import javax.jms.ConnectionFactory;

import javax.jms.JMSException;

public class ActiveMQClient {

public static void main(String[] args) {

String brokerURL = "amqp://localhost:5672?ssl=true&keyStore=/path/to/ssl/keystore.jks&keyStorePassword=keystore_password&trustStore=/path/to/ssl/truststore.jks&trustStorePassword=truststore_password";

ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerURL);

try {

Connection connection = connectionFactory.createConnection();

connection.start();

// 进行后续的消息发送或接收操作

connection.close();

} catch (JMSException e) {

e.printStackTrace();

}

}

}

在上述 Java 代码中,通过ActiveMQConnectionFactory的构造函数传入包含 SSL/TLS 配置的 Broker URL,从而创建支持 SSL/TLS 加密的连接工厂,实现客户端与服务器之间的加密通信。

3.4 审计日志配置

审计日志在 ActiveMQ 的安全管理中起着重要的作用,它可以记录系统中的各种操作,方便管理员进行安全审计和故障排查。下面展示启用审计日志的配置步骤及示例代码。

在activemq.xml文件的<broker>标签内,添加<auditBrokerPlugin>插件配置。示例代码如下:

 

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}">

<plugins>

<auditBrokerPlugin>

<destination>auditQueue</destination>

<excludedDestinations>ActiveMQ.Advisory.*</excludedDestinations>

<logAll>true</logAll>

</auditBrokerPlugin>

</plugins>

<!-- 其他配置 -->

</broker>

在上述配置中:

  • <destination>标签指定了审计日志的目标队列,这里设置为 “auditQueue”,所有的审计日志信息都会发送到这个队列中。
  • <excludedDestinations>标签指定了需要排除的目的地,这里排除了以 “ActiveMQ.Advisory.” 开头的所有目的地,即这些目的地的操作不会被记录到审计日志中。
  • <logAll>标签设置为 “true”,表示记录所有的操作日志;如果设置为 “false”,则只记录特定类型的操作日志,具体取决于其他配置。

配置完成后,重启 ActiveMQ 服务,审计日志功能就会生效。管理员可以通过监听 “auditQueue” 队列来获取系统的审计日志信息,从而对系统的操作进行监控和分析,及时发现潜在的安全问题。

相关文章:

ActiveMQ 安全机制与企业级实践(一)

一、引言 在当今数字化时代&#xff0c;企业级应用的架构愈发复杂&#xff0c;各个系统之间的通信和协作变得至关重要。消息队列作为一种高效的异步通信机制&#xff0c;在企业级应用集成中扮演着关键角色。ActiveMQ 作为一款广泛使用的开源消息中间件&#xff0c;以其丰富的功…...

【Python pass 语句】

在 Python 中&#xff0c;pass 语句是一个特殊的空操作&#xff08;no-op&#xff09;语句&#xff0c;它的核心作用是保持程序结构的完整性&#xff0c;同时不执行任何实际操作。以下是详细说明&#xff1a; 一、基础特性 语法占位符&#xff1a;当语法上需要一条语句&#x…...

Maven依赖未生效问题

在你描述的情况下&#xff0c;测试类无法找到 Maven 依赖的 jar 包&#xff0c;可能由以下原因导致&#xff1a; 依赖未正确添加到 pom.xml 检查 pom.xml 文件中是否正确添加了 Elasticsearch 和 JUnit 等相关依赖。例如&#xff0c;对于 Elasticsearch 的 TransportClient 相关…...

NGINX `ngx_http_auth_request_module` 模块详解基于子请求的认证授权方案

一、背景介绍 在 Web 系统中&#xff0c;我们常常需要根据外部服务&#xff08;例如单点登录、API 网关、权限中心&#xff09;的结果来判断用户是否有权限访问某个资源。NGINX 提供的 ngx_http_auth_request_module 模块&#xff0c;正是为这种场景而生。它允许通过向后端发送…...

Qwen3简要介绍(截止20250506)

Qwen3是阿里云推出的一个大语言模型系列&#xff0c;它在多个方面进行了升级和优化。以下是Qwen3的一些主要特点&#xff1a; 模型规模多样&#xff1a;Qwen3提供了一系列不同规模的模型&#xff0c;包括稠密模型&#xff08;0.6B、1.7B、4B、8B、14B、32B&#xff09;以及专家…...

精益数据分析(42/126):移动应用商业模式的深度剖析与实战要点

精益数据分析&#xff08;42/126&#xff09;&#xff1a;移动应用商业模式的深度剖析与实战要点 在创业和数据分析的学习之路上&#xff0c;我们持续探索不同商业模式的奥秘&#xff0c;今天聚焦于移动应用商业模式。我希望和大家一起进步&#xff0c;深入解读《精益数据分析…...

2025.5.6总结

昨天12&#xff1a;30睡觉&#xff0c;结果翻来覆去睡不着&#xff0c;两点半左右才睡着。看了一下最近的睡眠打卡&#xff0c;平均入睡时间是凌晨12&#xff1a;30。 自五一一个人过了5天&#xff0c;我才明白&#xff0c;人是需要社交的&#xff0c;只有在社交中才能找到自我…...

UE5 脚部贴地不穿过地板方案

UE自带的IK RIG和ControlRig技术 【UE5】角色脚部IK——如何让脚贴在不同斜度的地面(设置脚的旋转)_哔哩哔哩_bilibili 实验后这个还是有一部分问题,首先只能保证高度不能穿过,但是脚步旋转还是会导致穿模 IK前,整个模型在斜坡上会浮空 参考制作:https://www.youtube.com/w…...

Spring AI 函数调用(Function Call)系统设计方案

一、系统概述与设计目标 1.1 核心目标 从零构建一个灵活、安全、高效的函数调用系统,使大语言模型能够在对话中调用应用程序中的方法,同时保持良好的开发体验和企业级特性。 1.2 主要功能需求 支持通过注解将普通Java方法标记为可被AI调用的函数自动生成符合LLM要求的函数…...

Jupyter Notebook为什么适合数据分析?

Jupyter Notebook 是一款超实用的 Web 应用程序&#xff0c;在数据科学、编程等诸多领域都发挥着重要作用。它最大的特点就是能让大家轻松创建和共享文学化程序文档。这里说的文学化程序文档&#xff0c;简单来讲&#xff0c;就是把代码、解释说明、数学公式以及数据可视化结果…...

Leetcode Hot 100字母异位词分词

题目描述 思路 根据题意&#xff0c;我们可以得知我们需要将字符统计数一样的字符串&#xff0c;放在一起&#xff0c;并以列表进行返回。因此我们可以通过一个哈希表&#xff0c;把统计相同的放在一起&#xff0c;最终返回即可 代码 class Solution:def groupAnagrams(self…...

用python实现鼠标监听与手势交互

摘要 本文探讨了一种基于Python的数学函数可视化系统的设计与实现&#xff0c;该系统整合了Pynput鼠标事件监听机制、Matplotlib绘图引擎以及PyQt5图形用户界面框架。系统通过人机交互方式实现了函数图像的直观构建与可视化表达&#xff0c;支持多种函数类型的参数化建模与实时…...

UE5 GAS开发P47 游戏标签

FGameplayTag 是 Unreal Engine 中用于标记游戏对象的系统。它允许开发者为游戏对象分配标签&#xff0c;以便在游戏中对其进行分类、识别和操作。 FGameplayTag 结构用于表示单个游戏标签&#xff0c;而 FGameplayTagContainer 则用于表示一组游戏标签。 这些标签可以用于诸…...

C# 实现PLC数据自动化定时采集与存储(无需界面,自动化运行)

C# 实现PLC数据自动化定时采集与存储&#xff08;无需界面&#xff0c;自动化运行&#xff09; 在平时开发中&#xff0c;我们时常会遇到需要后台静默运行的应用场景&#xff0c;这些程序不需要用户的直接操作或界面展示&#xff0c;而是专注于定时任务的执行。比如说&#xf…...

Java实现堆排序算法

1. 堆排序原理图解 堆排序是一种基于二叉堆&#xff08;通常使用最大堆&#xff09;的排序算法。其核心思想是利用堆的性质&#xff08;父节点的值大于或等于子节点的值&#xff09;来高效地进行排序。堆排序分为两个主要阶段&#xff1a;建堆和排序。 堆排序步骤&#xff1a; …...

封装axios,实现取消请求

封装axios import axios from axios// 创建自定义的请求类 class CancelableRequest {constructor() {this.controller new AbortController()}abort() {this.controller.abort()} }// 创建 axios 实例 const service axios.create({baseURL: process.env.VUE_APP_BASE_API,…...

在 Laravel 12 中实现 WebSocket 通信

在 Laravel 12 中实现 WebSocket 通信主要有两种主流方案&#xff1a;‌官方推荐的 Laravel Reverb‌ 和 ‌第三方库&#xff08;如 Soketi/Pusher 或 Workerman/Swoole&#xff09;‌。以下是详细实现步骤&#xff1a; 一、官方方案&#xff1a;Laravel Reverb&#xff08;推…...

iPhone或iPad想要远程投屏到Linux系统电脑,要怎么办?

苹果手机自带AirPlay投屏功能&#xff0c;对于苹果电脑&#xff0c;自然可以随时投屏。但如果电脑是Linux系统&#xff0c;而且还想要远程投屏呢&#xff1f;这时候要怎么将iPhone或iPad投屏到Linux电脑&#xff1f; 方法很简单&#xff0c;用AirDroid Cast的网页版即可。 步骤…...

Ubuntu 22.04 安装配置远程桌面环境指南

在云服务器或远程主机上安装图形化桌面环境,可以极大地提升管理效率和用户体验。本文将详细介绍如何在 Ubuntu 22.04 (Jammy Jellyfish) 系统上安装和配置 Xfce4 桌面环境,并通过 VNC 实现远程访问。 系统环境 操作系统:Ubuntu 22.04 LTS (Jammy Jellyfish)架构:AMD64安装…...

【Redis | 基础总结篇 】

目录 前言&#xff1a; 1.Redis的介绍&#xff1a; 2.Redis的类型与命令&#xff1a; 3.Redis的安装&#xff1a; 3.1.Windows版本 3.2.Linux版本 4.在java中使用Redis&#xff1a; 4.1.介绍 4.2.Jedis 4.3.Spring Data Redis 前言&#xff1a; 本篇主要讲述了Redis的…...

如何通过外网访问内网?对比5个简单的局域网让互联网连接方案

在实际应用中&#xff0c;常常需要从外网访问内网资源&#xff0c;如远程办公访问公司内部服务器、在家访问家庭网络中的设备等。又或者在本地内网搭建的项目应用需要提供互联网服务。以下介绍几种常见的外网访问内网、内网提供公网连接实现方法参考。 一、公网IP路由器端口映…...

iMeta | 临床研究+scRNA-seq的组合思路 | 真实世界新辅助研究,HER2⁺就一定受益?单细胞揭示真正的“疗效敏感克隆”

&#x1f44b; 欢迎关注我的生信学习专栏~ 如果觉得文章有帮助&#xff0c;别忘了点赞、关注、评论&#xff0c;一起学习 近年来&#xff0c;临床医学与单细胞组学的结合开启了全新的研究范式&#xff0c;让临床医生能以“显微镜”般的精度&#xff0c;深入理解疾病机制与疗效…...

国标GB28181视频平台EasyCVR安防系统部署知识:如何解决异地监控集中管理和组网问题

在企业、连锁机构及园区管理等场景中&#xff0c;异地监控集中管控与快速组网需求日益迫切。弱电项目人员和企业管理者亟需整合分散监控资源&#xff0c;实现跨区域统一管理与实时查看。 一、解决方案 案例一&#xff1a;运营商专线方案​ 利用运营商专线&#xff0c;连接各分…...

220V降12V1000mA非隔离芯片WT5110

220V降12V1000mA非隔离芯片WT5110 以下是采用WT5110芯片的非隔离降压电源电路设计&#xff0c;将220V电压转换为12V、1000mA输出&#xff1a; 一、WT5110芯片简介 WT5110是一款用于非隔离降压应用的集成电路&#xff0c;具备宽输入电压范围和高效的转换功能。它可以将高输入电…...

【ES】Elasticsearch字段映射冲突问题分析与解决

在使用Elasticsearch作为搜索引擎时&#xff0c;经常会遇到一些映射(Mapping)相关的问题。本文将深入分析字段映射冲突问题&#xff0c;并通过原生的Elasticsearch API请求来复现和解决这个问题。 问题描述 在实际项目中&#xff0c;我们遇到以下错误&#xff1a; Transport…...

【上位机——MFC】绘图

相关类 CDC类(绘图设备类)&#xff1a;封装了各种绘图相关的函数&#xff0c;以及两个非常重要的成员变量m_hDC和m_hAttribDC CPaintDC类&#xff0c;封装了在WM_PAINT消息中绘图的绘图设备 CClientDC类&#xff0c;封装了在客户区绘图的绘图设备 CGdiObject类(绘图对象类) 封…...

【AI】Ubuntu 22.04 evalscope 模型评测 Qwen3-4B-FP8

安装evalscope mkdir evalscope cd evalscope/ python3 -m venv venv source venv/bin/activate pip install evalscope[app,perf] -U -i https://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.compip install tiktoken omegaconf -i https://mirrors.aliyu…...

js var a=如果ForRemove=true,是“normal“,否则为“bold“

你是想根据变量 ForRemove 的布尔值来给变量 a 赋值&#xff0c;如果 ForRemove 为 true&#xff0c;则 a 的值是 "normal"&#xff0c;否则为 "bold"。在 JavaScript 里&#xff0c;你可以使用 if...else 语句或者三元运算符来实现。 方法一&#xff1a;…...

JavaScript性能优化实战:从瓶颈分析到解决方案

前言 在当今快节奏的互联网环境中&#xff0c;用户对网站性能的期望日益提高。 JavaScript作为前端开发的核心语言&#xff0c;其性能直接影响用户体验。本文将深入探讨JavaScript代码中常见的性能瓶颈&#xff0c;并结合实际案例分享优化技巧和工具&#xff0c;帮助开发者提升…...

CyberSentinel AI开源程序 是一个自动化安全监控与AI分析系统

​一、软件介绍 文末提供程序和源码下载 CyberSentinel AI 开源程序是一个强大的自动化安全监控与AI分析系统&#xff0c;旨在帮助安全研究人员和爱好者 实时追踪最新的安全漏洞 (CVE) 和 GitHub 上的安全相关仓库&#xff0c;并利用 人工智能技术进行深度分析&#xff0c;最终…...

C++23 std::generator:用于范围的同步协程生成器 (P2502R2, P2787R0)

文章目录 引言C23新特性概述std::generator基本概念定义作用模板参数 std::generator特性分析与协程的结合范围视图内存管理 std::generator使用示例std::generator的优势与挑战优势挑战 总结 引言 在C的发展历程中&#xff0c;每一个新版本都带来了许多令人期待的新特性和改进…...

FoMo 数据集是一个专注于机器人在季节性积雪变化环境中的导航数据集,记录了不同季节(无雪、浅雪、深雪)下的传感器数据和轨迹信息。

2025-05-02&#xff0c;由加拿大拉瓦尔大学北方机器人实验室和多伦多大学机器人研究所联合创建的 FoMo 数据集&#xff0c;目的是研究机器人在季节性积雪变化环境中的导航能力。该数据集的意义在于填补了机器人在极端季节变化&#xff08;如积雪深度变化&#xff09;下的导航研…...

Github上如何准确地搜索开源项目

Github上如何准确地搜索开源项目&#xff1a; 因为寻找项目练手是最快速掌握技术的途径&#xff0c;而Github上有最全最好的开源项目。 就像我的毕业设计“机器翻译”就可以在Github上查找开源项目来参考。 以下搜索针对&#xff1a;项目名的关键词&#xff0c;关注数限制&a…...

从 MDM 到 Data Fabric:下一代数据架构如何释放 AI 潜能

从 MDM 到 Data Fabric&#xff1a;下一代数据架构如何释放 AI 潜能 —— 传统治理与新兴架构的范式变革与协同进化 引言&#xff1a;AI 规模化落地的数据困境 在人工智能技术快速发展的今天&#xff0c;企业对 AI 的期望已从 “单点实验” 转向 “规模化落地”。然而&#…...

个人Unity自用面经(未完)

目录标题 1.在 2D 平台跳跃游戏项目中&#xff0c;你使用了对象池来生成和回收怪物包含阵亡的动画预制件。在对象池回收对象时&#xff0c;如何确保动画状态被正确重置&#xff0c;避免下次使用时出现异常&#xff1f;2.在僵尸吃脑子模拟项目中&#xff0c;你创建了继承于IAspe…...

【Pandas】pandas DataFrame agg

Pandas2.2 DataFrame Function application, GroupBy & window 方法描述DataFrame.apply(func[, axis, raw, …])用于沿 DataFrame 的轴&#xff08;行或列&#xff09;应用一个函数DataFrame.map(func[, na_action])用于对 DataFrame 的每个元素应用一个函数DataFrame.a…...

LearnOpenGL---绘制三角形

绘制三角形 #include <glad/glad.h> #include <GLFW/glfw3.h> #include <iostream>const unsigned int SCR_WIDTH 800; const unsigned int SCR_HEIGHT 600;/// <summary> /// 当用户改变窗口大小时&#xff0c;视口也应该被调整&#xff0c;因此编…...

使用 Poco C++ 库构建轻量级 HTTP 服务器

在现代 C 后端开发中&#xff0c;如果你需要构建一个轻量、高性能、可嵌入式的 HTTP 服务&#xff0c;而不愿引入重量级框架如 Boost.Beast 或 cpp-httplib&#xff0c;那么 Poco C Libraries 提供了一个优雅的解决方案。Poco 是一套广泛使用的 C 框架&#xff0c;涵盖网络、线…...

【Java EE初阶 --- 多线程(初阶)】多线程的基本内容

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 &#xff0c;Java 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 文章目录 前言认识多线程(Thread的…...

CTF-DAY8

[LitCTF 2023]babyLCG 题目&#xff1a; from Crypto.Util.number import * from secret import flagm bytes_to_long(flag) bit_len m.bit_length() a getPrime(bit_len) b getPrime(bit_len) p getPrime(bit_len1)seed m result [] for i in range(10):seed (a*see…...

CSS--图片链接垂直居中展示的方法

原文网址&#xff1a;CSS--图片链接垂直居中展示的方法-CSDN博客 简介 本文介绍CSS图片链接垂直居中展示的方法。 图片链接 问题复现 源码 <html xml:lang"cn" lang"cn"><head><meta http-equiv"Content-Type" content&quo…...

用html+js+css实现的战略小游戏

效果图: 兄弟们&#xff0c;话不多说&#xff0c;直接上代码 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…...

【落羽的落羽 C++】list及其模拟实现

文章目录 一、list介绍二、list模拟实现1. 节点2. 迭代器3. list 一、list介绍 list是我们之前学过的带头双向链表的类模板&#xff0c;具有链表的一系列性质&#xff0c;也有多种多样的接口便于使用&#xff0c;使用方法与vector大体相似&#xff1a; 函数接口说明list()构造…...

深入理解高性能网络通信:从内核源码到云原生实践

深入理解高性能网络通信&#xff1a;从内核源码到云原生实践 前言 随着互联网业务规模的高速增长&#xff0c;服务端网络通信能力成为系统性能的核心瓶颈。如何支撑百万级连接、在极限场景下实现低延迟高吞吐&#xff1f;本篇博客将围绕Linux通信机制内核剖析、性能调优实战、…...

全格式文档转 Markdown 工具,Docker 一键部署,支持 API 调用

以下是简要介绍&#xff1a; 这是一款可以快速将任意文档文件转markdown格式内容的工具&#xff0c;提供API转换接口&#xff0c;方便集成与应用原理就是利用libreoffice、pandoc文件转换工具&#xff0c;把所有文档类型的文件逐步转化&#xff0c;最终转成markdown格式的内容…...

算法思想之深度优先搜索(DFS)、递归以及案例(最多能得到多少克黄金、精准核酸检测、最富裕的小家庭)

深度优先搜索&#xff08;DFS&#xff09;、递归 深度优先搜索&#xff08;Depth First Search&#xff0c;DFS&#xff09;是一种用于遍历或搜索树或图的算法。在 DFS 算法中&#xff0c;从起始节点开始&#xff0c;沿着一条路径尽可能深地访问节点&#xff0c;直到到达叶子节…...

Windows玩游戏的时候,一按字符键就显示桌面

最近打赛伯朋克 2077 的时候&#xff0c;不小心按错键了&#xff0c;导致一按字符键就显示桌面。如下&#xff1a; 一开始我以为是输入法的问题&#xff08;相信打游戏的人都知道输入法和奔跑键冲突的时候有多烦&#xff09;&#xff0c;但是后来解决半天发现并不是。在网上搜…...

2025 后端自学UNIAPP【项目实战:旅游项目】1、创建项目框架

1、创建项目 ①项目名称&#xff1a;自定义&#xff0c;【我是travel】 ②vue版本&#xff1a;vue3 ③其他默认&#xff0c;最后创建 2、创建页面 ①展开自己刚才创建的项目 ②单击选中pages文件夹 --->鼠标右键---->新建页面 ③页面名称&#xff1a;自定义favouri…...

Tomcat中Web应用程序停止时为了防止内存泄漏,JDBC驱动程序被强制取消注册出现原因

1.问题描述 本地Windows环境开发的Springboot项目同样的mysql版本&#xff0c;jdk版本&#xff0c;tomcat版本&#xff0c;本地运行没有任何问题&#xff0c;发布到阿里云服务器上时报以下问题&#xff1a; 06-May-2025 20:06:12.842 警告 [main] org.apache.catalina.loader…...

vitepress 复杂环境引入 mermaid

方式一&#xff1a; 参考官网&#xff0c;这里不赘述 。 方式二&#xff1a; pnpm add -D vitepress-plugin-mermaid pnpm add -D mermaidimport { MermaidMarkdown, MermaidPlugin } from vitepress-plugin-mermaid;export default defineConfig({markdown: {config(md) {md…...