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

RabbitMQ:可靠消息传递的强大消息中间件

 消息中间件在现代分布式系统中起着关键作用,它们提供了一种可靠且高效的方法来进行异步通信和解耦。在这篇博客中,我们将重点介绍 RabbitMQ,一个广泛使用的开源消息中间件。我们将深入探讨 RabbitMQ 的特性、工作原理以及如何在应用程序中使用它来实现可靠的消息传递。

一、RabbitMQ 简介

RabbitMQ 是基于 AMQP(高级消息队列协议)的开源消息中间件。它提供了一个可靠的、灵活的、可扩展的消息传递机制,广泛应用于各行各业。RabbitMQ 的核心思想是生产者将消息发送到交换机,交换机根据路由规则将消息传递给队列,然后消费者从队列中获取并处理消息。

二、相关概念

RabbitMQ 是一个开源的消息中间件,它是由 Erlang 语言编写的,并且实现了高级消息队列协议(AMQP)。作为一种可靠、灵活和可扩展的消息传递系统,RabbitMQ 提供了在应用程序之间传输数据的可靠机制。

下面是 RabbitMQ 的一些关键特性和概念的详解:

  1. 消息队列:RabbitMQ 使用消息队列来存储和传递消息。消息队列是一种先进先出(FIFO)的数据结构,它将消息暂时存储在其中,直到消费者准备好接收并处理它们。

  2. 生产者和消费者:消息的发送者称为生产者,而消息的接收者称为消费者。生产者将消息发送到队列中,而消费者从队列中获取消息并进行处理。

  3. 队列:队列是 RabbitMQ 的核心部分,它是消息的存储和传递载体。生产者将消息发送到队列中,而消费者则从队列中获取消息。队列可以持久化,这意味着即使 RabbitMQ 服务器关闭,消息也不会丢失。

  4. 交换机(Exchange):交换机是消息的路由器,它将消息从生产者发送到队列。它根据特定的规则将消息路由到一个或多个队列。RabbitMQ 提供了不同类型的交换机,包括直连交换机、主题交换机、广播交换机等。

  5. 绑定(Binding):绑定将交换机和队列关联起来,以定义消息在交换机和队列之间的路由规则。绑定规定了消息应该如何从交换机路由到队列。

  6. 路由键(Routing Key):路由键是生产者在发送消息时与消息一起指定的属性。交换机根据路由键来确定将消息路由到哪个队列。

  7. 持久化:当队列或消息被标记为持久化时,它们会被保存到磁盘上,以防止在 RabbitMQ 重启后丢失数据。

  8. 发布-订阅模式:RabbitMQ 支持发布-订阅模式,其中一个生产者发送消息到交换机,交换机将消息广播给所有与其绑定的队列,然后每个队列的消费者都可以接收并处理消息。

  9. ACK 机制:消费者可以使用 ACK 机制告知 RabbitMQ 已经成功接收和处理了消息。只有在消费者明确确认之后,RabbitMQ 才会将消息从队列中删除。

  10. 消息确认和持久化:RabbitMQ 允许生产者在发送消息时请求确认。如果消息无法成功路由到队列,或者在路由过程中发生错误,RabbitMQ 将通知生产者。此外,消息和队列的持久化可以确保即使在 RabbitMQ 重启后也不会丢失数据。

总之,RabbitMQ 是一个可靠和灵活的消息中间件,它以消息队列作为核心,使用交换机、队列、绑定等概念来进行消息的路由和传递。它提供了高度可靠的消息传递机制和丰富的特性,广泛用于分布式系统、微服务架构、任务队列等场景中,帮助应用程序实现解耦、异步通信和可靠性保证。

三、RabbitMQ 的工作原理

RabbitMQ 的工作原理可以简单地概括为以下几个步骤:

1、生产者发送消息到交换机:

生产者通过连接到 RabbitMQ,并将消息发送到预定义的交换机。消息可以包含任何结构化数据,如 JSON、XML 等格式。

String message = "Hello, RabbitMQ!";
channel.basicPublish(exchangeName, routingKey, null, message.getBytes());

2、交换机将消息路由到队列:

交换机根据预定义的路由规则将消息路由到一个或多个绑定到它上面的队列。路由规则可以根据完全匹配、模式匹配等方式进行。

channel.queueBind(queueName, exchangeName, routingKey);

3、消费者从队列中获取消息:

消费者通过连接到 RabbitMQ,并订阅感兴趣的队列。一旦有消息到达队列,RabbitMQ 将立即将该消息推送给订阅的消费者进行处理。

channel.basicConsume(queueName, true, new DefaultConsumer(channel) {@Overridepublic void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {String message = new String(body, "UTF-8");System.out.println("Received message: " + message);}
});

4、消费者处理消息并发送确认:

消费者获取到消息后,可以进行相应的业务逻辑处理。一旦消息被成功处理,消费者将发送确认给 RabbitMQ,告知消息已经被消费,RabbitMQ 可以安全删除该消息。

生产者将消息发送到名为 "my_exchange" 的交换机,并通过路由键 "my_routing_key" 将消息路由到名为 "my_queue" 的队列。消费者订阅了 "my_queue" 队列,并在收到消息时调用回调函数进行处理。

四、RabbitMQ 的特性

RabbitMQ 提供了许多强大的特性,使其成为一个广泛使用的消息中间件:

  • 持久化:RabbitMQ 可以将消息和队列持久化到磁盘,即使在服务器重启后也不会丢失消息。
  • 灵活的路由规则:通过使用不同的交换机类型和路由键,可以实现精确的消息路由策略。
  • 可靠性和可恢复性:RabbitMQ 提供了多种保证消息可靠传递的机制,如消息确认(acknowledgement)、事务、发布者确认等。
  • 可扩展性:RabbitMQ 支持分布式部署和集群模式,可以实现高吞吐量和高可用性。
  • 多语言客户端:RabbitMQ 提供了多种官方支持的客户端库,如 Java、Python、Ruby 等,方便开发者在不同的语言环境下使用。

五、RabbitMQ 在实际应用中的应用场景

参考文章:

【RabbitMQ】什么是RabbitMQ?RabbitMQ有什么用?应用场景有那些?_路遥叶子的博客-CSDN博客

RabbitMQ 在各种场景中都有广泛的应用,包括但不限于:

  • 异步任务处理:将需要耗时较长的任务发送到 RabbitMQ,并由消费者异步执行,以提高系统的响应性能和可伸缩性。
  • 事件驱动架构:通过使用 RabbitMQ 来实现事件的发布与订阅,不同的组件可以通过订阅感兴趣的事件来解耦。
  • 应用解耦与流量控制:通过引入消息中间件,不同的应用程序可以进行解耦,并实现流量控制、服务降级等机制。
  • 日志收集、分析:使用 RabbitMQ 将分布式系统中的日志消息发送到中央日志服务器进行集中管理和分析。

 5.1  服务间解耦

用户订单,库存处理。【服务间解耦】

使用MQ前:

系统正常时,用户下单,订单系统调用库存系统进行删减操作,操作成功,将成返回消息,提醒下单成功。系统异常时,库存系统将无法访问,导致订单删减操作无法执行,最终导致下单失败。

使用MQ后:

订单系统和库存系统之间不在互相影响,独立运行,达到了应用解耦的目的。订单系统只需要将下单消息写入MQ,就可以直接执行下一步操作。这时即使库存系统出现异常也不会影响订单系统的操作,且下单的库存删减记录,将会被永久保存到MQ中,直到库存系统恢复正常,从MQ中订阅下单消息,进行消费成功为止。

使用MQ前:


使用MQ后:

5.2 实现异步通信

用户注册,发送手机短信,邮件。【实现异步通信】

使用MQ前:

整个操作流程,全部在主线程完成。点击用户注册 --》 入库添加用户 --》发送邮件 --》发送短信。每一步都需要等待上一步完成后才能执行。且每一步操作的响应时间不固定,如果请求过多,会导致主线程请求耗时很长,响应慢,甚至会导致死机的情况出现,严重影响了用户的体验。

使用MQ后:

主线程只需要处理耗时较低的入库操作,然后把需要处理的消息写进MQ消息队列中,然后由不同的独立的邮件系统和发短信系统,同时订阅消息队列中的消息进行消费。这样通过消息队列作为一个中间人去保存和传递消息,不仅仅耗时低消耗的资源也很少且单个服务器能够承受的并发请求将更多。


 

5.3 流量削峰

商品秒杀和抢购。【流量削峰】

流量削峰是消息队列中常用的场景 一般在秒杀或团购活动中使用广泛。

使用MQ前:对于秒杀、抢购活动,用户访问所产生的流量会很大,甚至会在同一时间段出现上万上亿条请求,这股瞬间的流量暴涨,我们的应用系统配置是无法承受的,会导致系统直接崩溃死机。

例如:A系统平时每秒请求100个,系统稳定运行; 但是晚上8点有秒杀活动 ,每秒并发增至1万条 ,系统最大处理每秒1000条 于是导致系统崩溃。 

使用MQ后:我们在大量用户进行秒杀请求时,将那个巨大的流量请求拒在系统业务处理的上层,并将其转移至MQ中,而不是直接涌入我们的接口。在这里MQ消息队列起到了缓存作用。

例如:100万用户在高峰期,每秒请求5000个,将这5000个请求写入MQ系统每秒只能处理2000请求,因为MySQL只能处理2000个请求 ; 系统每秒拉取2000个请求 不超过自己的处理能力即可。

使用MQ前:

 使用MQ后:

5.4 其他应用场景:

1、订单处理系统:

在一个电子商务平台中,可以使用 RabbitMQ 来处理订单。当用户下单时,订单信息被发布到 RabbitMQ 的交换机中,然后相关的消费者从队列中获取订单消息并进行处理,如验证订单、库存管理、支付等。

2、日志收集与分发:

假设有多个应用程序生成日志,并希望将它们集中处理和存储。每个应用程序可以将日志消息发布到一个名为 "log_exchange" 的交换机中,然后有不同的消费者订阅该交换机,并将日志消息写入数据库或发送到日志分析系统。

3、实时数据传输:

如果有一个实时监控系统,需要将传感器数据实时传输到监控平台进行处理和可视化展示。传感器将数据发布到 RabbitMQ 的交换机中,监控平台的消费者订阅交换机并处理数据,从而实现实时监控和报警功能。

4、异步任务处理:

假设有一个应用程序需要处理大量耗时的任务,如图像处理、PDF 转换等。应用程序将任务发布到 RabbitMQ 的队列中,然后有多个工作节点作为消费者从队列中获取任务并进行处理,以实现任务的并行处理和减轻主应用程序的压力。

5、消息通知系统:

 假设在一个订阅系统中,用户可以订阅不同的主题或事件。当有新的消息发布时,RabbitMQ 会将消息路由到对应的队列,然后订阅该队列的用户会收到相应的通知。这种方式可以用于实现邮件订阅、新闻推送等功能。

6、微服务架构:

在一个微服务架构中,不同的服务之间可能需要进行消息传递和协作。使用 RabbitMQ 可以实现服务之间的解耦和异步通信,每个服务通过交换机和队列收发消息,从而实现微服务之间的松耦合。

六、 RabbitMQ 安装

官网地址:

RabbitMQ: easy to use, flexible messaging and streaming — RabbitMQ

6.1 brew安装

brew update #更新一下homebrew
brew install rabbitmq   #安装rabbitMQ 

安装结果:

==> Caveats
==> rabbitmq
Management Plugin enabled by default at http://localhost:15672

To restart rabbitmq after an upgrade:
  brew services restart rabbitmq
Or, if you don't want/need a background service you can just run:
  CONF_ENV_FILE="/opt/homebrew/etc/rabbitmq/rabbitmq-env.conf" /opt/homebrew/opt/rabbitmq/sbin/rabbitmq-server

 rabbitmq 的安装路径:

/opt/homebrew/opt/rabbitmq

6.2 、配置环境变量

1、

vi ~/.bash_profile

2、 

export RABBIT_HOME=${PATH}:/opt/homebrew/opt/rabbitmq
export PATH=${PATH}:$RABBIT_HOME/sbin

3、 

source ~/.bash_profile

6.3 、启动RabbitMQ

1、前台运行
rabbitmq-server

2、后台运行
rabbitmq-server -detached

3、查看运行状态
rabbitmqctl status

4、开始 Web插件
rabbitmq-plugins enable rabbitmq_management

5、重启
rabbitmq-server restart

5、关闭
rabbitmqctl stop

6.4、访问MQ

1、浏览器地址


http://localhost:15672/
默认用户名和密码为guest

添加用户
rabbitmqctl add_user miaojiang 123

设置用户为管理员
rabbitmqctl set_user_tags miaojiang administrator

配置用户可以远程登录
rabbitmqctl set_permissions -p "/" miaojaing ".*" ".*" ".*"

查看新添加的账户

rabbitmqctl list_users

查看用于的权限
rabbitmqctl list_permissions -p /

七、Spring Boot 项目应用RabbitMQ

7.1、添加Maven依赖:

在你的项目的pom.xml文件中添加RabbitMQ客户端库的依赖

<!--AMQP依赖,包含RabbitMQ-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

7.2、配置RabbitMQ连接:

在Spring Boot的配置文件(application.properties 或 application.yml)中添加RabbitMQ的连接信息。

application.properties:

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

在application.yml配置mq的参数:

spring:rabbitmq:#设置RabbitMQ的IP地址host: localhost#设置rabbitmq服务器用户名username: guest#设置rabbitmq服务器密码password: guest#设置rabbitmq服务器连接端口port: 5672

7.3 创建交换机

自定义交换机名称

创建名为“myExchange”的交换机

package com.example.usermanagement.mq;import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitMQConfig {/*使用 @Configuration 注解创建一个配置类,并通过 @Bean 注解创建了一个名为 declareExchange 的方法,用于声明创建交换机。请根据实际情况修改交换机名称、类型和持久化设置。*/public static final String EXCHANGE_NAME = "myExchange";@Beanpublic Exchange declareExchange() {return ExchangeBuilder.directExchange(EXCHANGE_NAME).durable(true).build();}
}

7.4 创建消息发送者

创建消息发送者:创建一个消息发送者的类,用于发送消息到RabbitMQ

package com.example.usermanagement.mq;import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class MessageSender{private final AmqpTemplate amqpTemplate;private final String exchangeName = "myExchange"; // 自定义交换机名称@Autowiredpublic MessageSender(AmqpTemplate amqpTemplate) {this.amqpTemplate = amqpTemplate;}public void sendMessage(Object message) {amqpTemplate.convertAndSend(exchangeName, "", message); // 发送消息到默认交换机和空路由键}
}

注意:

 sendMessage 类型使用的是Object类型

7.5 RabbitMQ管理后台添加对列

步骤:

  1. 打开浏览器,输入RabbitMQ管理后台的URL。默认情况下,该URL为http://localhost:15672/。请确保你的RabbitMQ服务器正在运行,并且端口号正确。

  2. 输入用户名和密码以登录到RabbitMQ管理后台。默认情况下,用户名为guest,密码也为guest。如果你修改过用户名和密码,请使用你的自定义凭据进行登录。

  3. 成功登录后,你将看到RabbitMQ管理后台的主界面。在顶部导航栏中,选择Queues选项卡。

  4. Queues页面上,你将看到已经存在的队列列表。如果你想要创建一个新队列,请点击Add a new queue按钮。

  5. 在添加队列的页面上,填写以下信息:

    • Name:队列的名称。为队列提供一个唯一的名称。(如myQueue)
    • Durability:队列的持久性。选择是或否,以指定队列是否应该在RabbitMQ服务重启后保留。
    • Auto delete:队列的自动删除。选择是或否,以指定当最后一个消费者断开连接后,是否删除队列。
    • Arguments:队列的其他参数。这是可选的,你可以为队列设置一些特定的参数。
  6. 填写完队列信息后,点击Add queue按钮以创建队列。

  7. 创建成功后,你将在Queues页面上看到新添加的队列。你可以在该页面上查看队列的详细信息,包括消息数量、消费者数量等。

http://localhost:15672/#/queues

只需要添加队列名称就可以 

7.6 调用生产者

1、注入MessageSender实例

@Autowired
private MessageSender messageSender;

2、在需要发送消息的地方调用messageSender.sendMessage方法。根据你的业务逻辑,你可以在合适的位置调用该方法。例如,在订单创建成功后,你可以添加以下代码:

messageSender.sendMessage("订单已创建:" + order.getOrderId());

7.7 创建消息接收者

创建消息接收者:创建一个消息接收者的类,用于处理接收到的RabbitMQ消息。

这里就直接写处理RabbitMQ消息的逻辑。

package com.example.usermanagement.mq;import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
public class MessageReceiver {@RabbitListener(bindings = @QueueBinding(value = @Queue("your_queue_name"),exchange = @Exchange(value = RabbitMQConfig.EXCHANGE_NAME)
//            key = "your_routing_key"))public void receiveMessage(Object message) {System.out.println("Received message: " + message);// 处理消息逻辑}
}

注意:

 sendMessage 类型使用的是Object类型

your_queue_name 替换为你要监听的队列的名称,(如myQueue)

your_routing_key 替换为适当的路由键(如果使用)

八、MQ界面介绍

Overview(概览):提供了一份概览报告,包括服务器和集群信息、节点状态、队列和连接摘要、以及最近的相关日志条目。
Connections(连接):显示当前连接到 RabbitMQ 服务器的客户端应用程序,包括连接的名称、协议、虚拟主机等信息。
Channels(通道):显示每个连接上的活动通道,以及与每个通道相关的一些指标,如消费者数量、未确认的消息数量等。
Exchanges(交换机):列出了所有的交换机,包括名称、类型、绑定的队列和绑定的数量。
Queues(队列):显示了所有的队列,包括名称、消息数量、消费者数量等信息。您还可以通过队列进行一些操作,如创建、删除、清空等。
Admin(管理员):提供了一些高级管理功能,如用户和权限管理、虚拟主机管理、插件管理等。

8.1 Overview(概览)

Overview(概览):提供了一份概览报告,包括服务器和集群信息、节点状态、队列和连接摘要、以及最近的相关日志条目。

8.2 Connections(连接)

Connections(连接):显示当前连接到 RabbitMQ 服务器的客户端应用程序,包括连接的名称、协议、虚拟主机等信息。

8.3 Channels(通道)


Channels(通道):显示每个连接上的活动通道,以及与每个通道相关的一些指标,如消费者数量、未确认的消息数量等。

8.4 Exchanges(交换机)


Exchanges(交换机):列出了所有的交换机,包括名称、类型、绑定的队列和绑定的数量。

8.5 Queues(队列)


Queues(队列):显示了所有的队列,包括名称、消息数量、消费者数量等信息。您还可以通过队列进行一些操作,如创建、删除、清空等。

8.6 Admin(管理员)


Admin(管理员):提供了一些高级管理功能,如用户和权限管理、虚拟主机管理、插件管理等

相关文章:

RabbitMQ:可靠消息传递的强大消息中间件

消息中间件在现代分布式系统中起着关键作用&#xff0c;它们提供了一种可靠且高效的方法来进行异步通信和解耦。在这篇博客中&#xff0c;我们将重点介绍 RabbitMQ&#xff0c;一个广泛使用的开源消息中间件。我们将深入探讨 RabbitMQ 的特性、工作原理以及如何在应用程序中使用…...

python 批量下载m3u8的视频

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;点击跳转 方法&#xff1a; 解析m3u8&#xff0c;获取其中的ts列表&#xff0c;多线程下载所有ts文件。 全部下完之后&#xff0c;用ffmpeg合…...

最后一击

第二届上海市青少年算法竞赛&#xff08;小学组&#xff09; 题目描述 Description 小爱和小艾两人组队打一只怪兽。一开始怪兽有 n 点生命值&#xff0c;当 n 变成 0 或更低时&#xff0c;怪兽就被消灭了。他们两人是同时开始攻击的&#xff0c;小爱每分钟可以攻击 a 下&…...

K8S资源管理方式

K8S资源管理方式 文章目录 K8S资源管理方式一、陈述式资源管理1.基础命令操作2.创建pod3.查看资源状态4.查看pod中的容器日志5.进入pod中的容器6.删除pod资源7.pod扩容8.项目生命周期管理&#xff08;创建-->发布-->更新-->回滚-->删除&#xff09;8.1创建services…...

第三章 图论 No.9有向图的强连通与半连通分量

文章目录 定义Tarjan求SCC1174. 受欢迎的牛367. 学校网络1175. 最大半连通子图368. 银河 定义 连通分量是无向图的概念&#xff0c;yxc说错了&#xff0c;不要被误导 强连通分量&#xff1a;在一个有向图中&#xff0c;对于分量中的任意两点u&#xff0c;v&#xff0c;一定能从…...

回归预测 | MATLAB实现基于PSO-LSSVM-Adaboost粒子群算法优化最小二乘支持向量机结合AdaBoost多输入单输出回归预测

回归预测 | MATLAB实现基于PSO-LSSVM-Adaboost粒子群算法优化最小二乘支持向量机结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于PSO-LSSVM-Adaboost粒子群算法优化最小二乘支持向量机结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考…...

Mysql 和Oracle的区别

、mysql与oracle都是关系型数据库&#xff0c;Oracle是大型数据库&#xff0c;而MySQL是中小型数据库。但是MySQL是开源的&#xff0c;但是Oracle是收费的&#xff0c;而且比较贵。 1 2 mysql默认端口&#xff1a;3306&#xff0c;默认用户&#xff1a;root oracle默认端口&…...

在收藏夹里“积灰”的好东西——“收藏从未停止,行动从未开始”

方向一&#xff1a;分享一道你收藏的好题 小雅兰刚学数据结构与算法的时候&#xff0c;学的真的是很吃力&#xff0c;感觉链表真的特别的难&#xff0c;在学习了后面的知识之后&#xff0c;发现链表慢慢变得简单了&#xff0c;若是放在现在&#xff0c;小雅兰仍然觉得链表的知…...

【算法|数组】双指针

算法|数组——双指针 引入 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,100] 解释&#xff1a;…...

asp.net core6 webapi 使用反射批量注入接口层和实现接口层的接口的类到ioc中

IBLL接口层类库 namespace IBLL {public interface ICar{string CarName();} } namespace IBLL {public interface IRed{string RedName();} }BLL实现接口层类库 namespace BLL {public class Car : ICar{public string CarName(){return "BBA";}} } namespace BLL…...

【2023】字节跳动 10 日心动计划——第九关

目录 1. 螺旋矩阵2. 划分字母区间3. 子集 II 1. 螺旋矩阵 &#x1f517; 原题链接&#xff1a;54. 螺旋矩阵 类似于BFS那样使用方向数组即可。 class Solution { public:vector<int> spiralOrder(vector<vector<int>>& matrix) {int m matrix.size(), …...

小龟带你敲排序之冒泡排序

冒泡排序 一. 定义二.题目三. 思路分析&#xff08;图文结合&#xff09;四. 代码演示 一. 定义 冒泡排序&#xff08;Bubble Sort&#xff0c;台湾译为&#xff1a;泡沫排序或气泡排序&#xff09;是一种简单的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元…...

Nacos AP架构集群搭建(Windows)

手写SpringCloud项目地址&#xff0c;求个star github:https://github.com/huangjianguo2000/spring-cloud-lightweight gitee:https://gitee.com/huangjianguo2000/spring-cloud-lightweigh 目录&#xff1a; 一&#xff1a;初始化MySQL 二&#xff1a;复制粘贴三份Nacos文…...

nodejs+vue+elementui,图书评论管理系统_g9e3a

用户的功能主要是对首页、图书信息、公告信息、在线咨询、个人中心等进行操作。表名&#xff1a;token语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;VScode 前端nodejsvueelementui, 管理员…...

基于TorchViz详解计算图(附代码)

文章目录 0. 前言1. 计算图是什么&#xff1f;2. TorchViz的安装3. 计算图详解 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&#xff0c;虽然参考了他人的宝贵见解&#xff0c;但是内容可能存在不准确的地方。如果发现文中错误&#xff0c;…...

解决GitHub的速度很慢的几种方式

1. GitHub 镜像访问 这里提供两个最常用的镜像地址&#xff1a; https://hub.njuu.cf/search https://www.gitclone.com/gogs/search/clonesearch 也就是说上面的镜像就是一个克隆版的 GitHub&#xff0c;你可以访问上面的镜像网站&#xff0c;网站的内容跟 GitHub 是完整同步…...

设计模式再探——策略模式

目录 一、背景介绍二、思路&方案三、过程1.策略模式简介2.策略模式的类图3.策略模式代码4.策略模式还可以优化的地方5.策略模式的例子改造(配置文件反射) 四、总结五、升华 一、背景介绍 最近在做产品的过程中&#xff0c;对于主题讨论回复内容&#xff0c;按照追评次数排…...

基于Googlenet深度学习网络的人员行为动作识别matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 1. 原理 1.1 深度学习与卷积神经网络&#xff08;CNN&#xff09; 1.2 GoogLeNet 2. 实现过程 2.1 数据预处理 2.2 构建网络模型 2.3 数据输入与训练 2.4 模型评估与调优 3. 应用领域…...

存储过程的学习

1&#xff0c;前言 这是实习期间学习的&#xff0c;我可能是在学校没好好听课&#xff0c;&#xff08;或者就是学校比较垃&#xff0c;没教这部分&#xff0c;在公司经理让我下去自己学习&#xff0c;太难了&#xff0c;因为是公司代码很多部分都是很多表的操作&#…...

zookeeperAPI操作与写数据原理

要执行API操作需要在idea中创建maven项目 &#xff08;改成自己的阿里仓库&#xff09;导入特定依赖 添加日志文件 上边操作做成后就可以进行一些API的实现了 目录 导入maven依赖&#xff1a; 创建日志文件&#xff1a; 创建API客户端&#xff1a; &#xff08;1&#xff09…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...

深入理解 React 样式方案

React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...

【Java多线程从青铜到王者】单例设计模式(八)

wait和sleep的区别 我们的wait也是提供了一个还有超时时间的版本&#xff0c;sleep也是可以指定时间的&#xff0c;也就是说时间一到就会解除阻塞&#xff0c;继续执行 wait和sleep都能被提前唤醒(虽然时间还没有到也可以提前唤醒)&#xff0c;wait能被notify提前唤醒&#xf…...

PostgreSQL 与 SQL 基础:为 Fast API 打下数据基础

在构建任何动态、数据驱动的Web API时&#xff0c;一个稳定高效的数据存储方案是不可或缺的。对于使用Python FastAPI的开发者来说&#xff0c;深入理解关系型数据库的工作原理、掌握SQL这门与数据库“对话”的语言&#xff0c;以及学会如何在Python中操作数据库&#xff0c;是…...