首页 > 其他分享 >RabbitMq 入门教程看这一篇就够了 (超详细!!!)

RabbitMq 入门教程看这一篇就够了 (超详细!!!)

时间:2024-12-04 10:03:40浏览次数:6  
标签:NAME Exchange 队列 入门教程 RabbitMQ 消息 RabbitMq 就够 channel

目录

一、RabbitMQ 简介

二、安装指南

2.1 Erlang

2.2 RabbitMQ

三、RabbitMQ基本概念

3.1 RabbitMQ 基础架构

四、实战编程

4.1 引入依赖

4.2 创建连接获取Channel​​​​​​​

4.3 声明Exchange(可选)

4.4 声明queue​​​​​​​

4.5 声明Exchange与Queue的绑定关系(可选)​​​​​​​

4.6 消息模型

4.6.1 简单模式

4.6.2  Publish/Subscribe 发布订阅

4.6.3  Rout 路由模式

4.6.4  Topics 通配符模式

4.7 发送消息确认

五、SpringBoot集成RabbitMQ

5.1 添加依赖​​​​​​​

5.2 配置文件​​​​​​​

5.3 RabbitMQ配置类

5.4 发送消息​​​​​​​

5.5 消费消息


一、RabbitMQ 简介

  • RabbitMQ是一个开源的,在AMQP基础上完整的,可复用的企业消息系统。

  • 支持主流的操作系统,Linux、Windows、MacOX等

  • 多种开发语言支持,Java、Python、Ruby、.NET、PHP、C/C++、node.js等

AMQP,即 Advanced Message Queuing Protocol(高级消息队列协议),是一个网络协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。2006年,AMQP 规范发布。

2007年,Rabbit 技术公司基于 AMQP 标准开发的 RabbitMQ 1.0 发布。RabbitMQ 采用 Erlang 语言开发。Erlang 语言由 Ericson 设计,专门为开发高并发和分布式系统的一种语言,在电信领域使用广泛。

其他主流 MQ 产品

  • ActiveMQ:Apache 出品,最流行的,能力强劲的开源消息总线,基于 JMS(Java Message Service)规范

  • RocketMQ:阿里低延迟、高并发、高可用、高可靠的分布式消息中间件,基于 JMS,目前由 Apache 基金会维护

  • Kafka:分布式,分区的,多副本的,多订阅者的消息发布订阅系统(分布式 MQ 系统),可以用于搜索日志,监控日志,访问日志等

二、安装指南

2.1 Erlang

官网下载链接:Downloads - Erlang/OTP

RabbitMQ 服务器必须首先安装 Erlang 运行环境,同时安装时需要注意 RabbityMQ 所依赖的 Erlang 版本,我们可以查看下方官方版本对应信息

版本对应:RabbitMQ Erlang Version Requirements — RabbitMQ

本次使用版本 Erlang OTP 25.3

图片

双击执行 exe 安装程序,除了安装路径其他都按照默认即可

然后配置环境变量

ERLANG_HOME = D:\Erlang\Erlang\Erlang OTP

并且添加 /bin 目录到 Path 环境变量中,即添加 %ERLANG_HOME%\bin 到 Path 中

安装配置之后,打开 CMD,输入 erl 然后回车键,会弹出版本信息,表示 Erlang 安装成功

2.2 RabbitMQ

官方下载页面:RabbitMQ Changelog — RabbitMQ

下载链接:RabbitMQ 3.12.0

安装 exe 文件,执行安装包,同样除了安装路径外其他保持默认

配置环境变量

RABBITMQ_SERVER = D:\RabbitMQ\RabbitMQ\rabbitmq_server-3.12.0

然后添加 %RABBITMQ_SERVER%\sbin 到 Path 环境变量中

查看所有插件

rabbitmq-plugins list

注:如果出现问题请参考最后一章 彻底卸载!

 

之后我们需要安装 rabbitmq_management 插件,可以使用可视化的方式查看 RabbitMQ 服务器实例的状态,以及操控 RabbitMQ 服务器

# 安装插件
rabbitmq-plugins enable rabbitmq_management

访问管理界面:http://localhost:15672/ (账号密码:guest / guest)

图片

前期安装配置完毕,下面可以配合官方入门文档学习

官方文档:RabbitMQ Tutorials — RabbitMQ

彻底卸载

我们安装中可能出现各种问题,一般情况下是 RabbitMQ 和 Erlang 版本不对应,需要完全卸载 RabbitMQ 和 Erlang,可以按照如下步骤卸载

(1)打开 Windows 控制面板,双击“程序和功能”。

(2)在当前安装的程序列表中,右键单击 RabbitMQ Server,然后单击“卸载”。

(3)在当前安装的程序列表中,右键单击“Erlang OTP”,然后单击“卸载”。

(4)打开 Windows 任务管理器。

(5)在任务管理器中,查找进程 epmd.exe。如果此进程仍在运行,请右键单击该进程,然后单击“结束进程”。

(6)删除 RabbitMQ 和 Erlang 的所有安装目录。

(7)删除文件 C:\Windows\System32\config\systemprofile.erlang.cookie如果存在)。

(8)转到用户文件夹:C:\Users\[username],然后删除文件.erlang.cookie。

(9)同样在 User 文件夹中,转到 AppData \ Roaming \ RabbitMQ。删除 RabbitMQ 文件夹。

(10)删除注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Ericsson\Erlang\ErlSrv 的子项。

(11)打开运行 cmd->sc delete RabbitMQ。

(12)打开运行->regedit 找到 RabbitMQ 节点,删掉即可(如果存在

三、RabbitMQ基本概念

3.1 RabbitMQ 基础架构

图片

Broker

接收和分发消息的应用,RabbitMQ Server就是 Message Broker

Virtual host

虚拟主机,出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚拟的分组中,类似于网络中的 namespace 概念。当多个不同的用户使用同一个 RabbitMQ server 提供的服务时,可以划分出多个vhost,每个用户在自己的 vhost 创建 exchange/queue 等,每一个虚拟主机都有AMQP的全套基础组件,并且可以针对每个虚拟主机进行权限以及数据分配,并且不同虚拟主机之间是完全隔离的。

Connection

客户端与RabbitMQ进行交互,首先就需要建立一个TPC连接。RabbitMQ为了减少性能开销,也会在一个Connection中建立多个Channel,这样便于客户端进行多线程连接,这些连接会复用同一个Connection的TCP通道,提高性能。

Channel

客户端与RabbitMQ建立了连接,就会分配一个AMQP信道 Channel。每个信道都会被分配一个唯一的ID。

Exchange

消息队列交换机,消息发送到RabbitMQ中后,会首先进入一个交换机,然后由交换机负责将数据转发到不同的队列中。RabbitMQ中有多种不同类型的交换机来支持不同的路由策略。

交换机多用来与生产者打交道。生产者发送的消息通过Exchange交换机分配到各个不同的Queue队列上,而对于消息消费者来说,通常只需要关注自己的队列就可以了。

Queue

消息队列,队列是实际保存数据的最小单位。队列结构天生就具有FIFO的顺序。

Producer

消息生产者,即生产方客户端,生产方客户端将消息发送

Consumer

消息消费者,即消费方客户端,接收MQ转发的消息。

消息发送者的固定步骤

1.创建消息生产者producer,并制定生产者组名

2.指定Nameserver地址

3.启动producer

4.创建消息对象,指定主题Topic、Tag和消息体

5.发送消息

6.关闭生产者producer

消息消费者的固定步骤

1.创建消费者Consumer,制定消费者组名

2.指定Nameserver地址

3.订阅主题Topic和Tag

4.设置回调函数,处理消息

5.启动消费者consumer

四、实战编程

4.1 引入依赖​​​​​​​

<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.9.0</version>
</dependency>

4.2 创建连接获取Channel​​​​​​​

ConnectionFactory factory = new ConnectionFactory()
factory.setHost(HOST_NAME)
factory.setPort(HOST_PORT)
factory.setUsername(USER_NAME)
factory.setPassword(PASSWORD)
factory.setVirtualHost(VIRTUAL_HOST)
Connection connection = factory.newConnection()
Channel channel = connection.createChannel()

4.3 声明Exchange(可选)

channel.exchangeDeclare(String exchange, String type, boolean durable, boolean autoDelete,Map<String, Object> arguments) throws IOException;

Exchange有四种类型: fanout、 topic 、headers 、direct

4.4 声明queue​​​​​​​

 channel.queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments);
durable 表示是否持久化。Durable选项表示会将队列的消息写入硬盘,这样服务重启后这些消息就不会丢失。

4.5 声明Exchange与Queue的绑定关系(可选)​​​​​​​

channel.queueBind(String queue, String exchange, String routingKey) throws IOException;
声明了Exchange和Queue,那么就还需要声明Exchange与Queue的绑定关系Binding。有了这些Binding,Exchange才可以知道Producer发送过来的消息将要分发到哪些Queue上。

这些Binding涉及到消息的不同分发逻辑,与Exchange和Queue一样,如果Broker上没有建立绑定关系,那么RabbitMQ会按照客户端的声明,创建这些绑定关系。

发送消息

channel.basicPublish(String exchange, String routingKey, BasicProperties props,message.getBytes("UTF-8")) ;

其中Exchange如果不需要,传个空字符串。

props的这些配置项,可以用RabbitMQ中提供的一个Builder对象来构建。​​​​​​​

 AMQP.BasicProperties.Builder builder = new AMQP.BasicProperties.Builder()
  //对应页面上的Properties部分,传入一些预定的参数值。
  builder.deliveryMode(MessageProperties.PERSISTENT_TEXT_PLAIN.getDeliveryMode())
  builder.priority(MessageProperties.PERSISTENT_TEXT_PLAIN.getPriority())
  //builder.headers(headers)
  builder.build()
  AMQP.BasicProperties prop = builder.build()

MessageProperties.PERSISTENT_TEXT_PLAIN是RabbitMQ提供的持久化消息的默认配置。

消费消息

1.被动消费模式

Consumer等待rabbitMQ 服务器将message推送过来再消费。

channel.basicConsume(String queue, boolean autoAck, Consumer callback);

2.主动消费模式

Comsumer主动到rabbitMQ服务器上去拉取messge进行消费。

GetResponse response = channel.basicGet(QUEUE_NAME, boolean autoAck)

消费消息确认

  • 自动ACK:autoAck为true,消息一旦被接收,消费者自动发送ACK,如果消费失败了,后续也无法再消费了

  • 手动ACK:autoAck为false,消息接收后,不会发送ACK,需要手动调用 channel.basicAck 来通知服务器已经消费了该message.这样即使Consumer在执行message过程中出问题了,也不会造成消息丢失

释放资源

channel.close()
conection.clouse()

4.6 消息模型

4.6.1 简单模式

最直接的方式,P端发送一个消息到一个指定的queue,中间不需要任何exchange规则。C端按queue方式进行消费。

图片

在上图的模型中,有以下概念:

  • P:生产者,也就是要发送消息的程序

  • C:消费者:消息的接受者。

  • queue:消息队列,图中红色部分。可以缓存消息;生产者向其中投递消息,消费者从其中取出消息。

  • 一个生产者、一个消费者,不需要设置交换机(使用默认的交换机)。

producer:​​​​​​​

channel.queueDeclare(QUEUE_NAME,false,false,false,null);
channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));

consumer:​​​​​​​

channel.queueDeclare(QUEUE_NAME, false, false, false, null);
Work queues 工作队列模式

图片

Work Queues:与简单模式相比,多了一个或一些消费端,多个消费端共同消费同一个队列中的消息。一个消息只会被一个消费者消费

一个生产者、多个消费者(竞争关系),不需要设置交换机(使用默认的交换机)。

应用场景:对于任务过重或任务较多情况使用工作队列可以提高任务处理的速度。​​​​​​​

channel.queueDeclare(TASK_QUEUE_NAME, true, false, false, null); 
channel.basicPublish("", TASK_QUEUE_NAME,MessageProperties.PERSISTENT_TEXT_PLAIN,
        message.getBytes("UTF-8"));

Consumer: 每次拉取一条消息。​​​​​​​

channel.queueDeclare(TASK_QUEUE_NAME, true, false, false, null);
channel.basicQos(1);
channel.basicConsume(TASK_QUEUE_NAME, false, consumer);

4.6.2  Publish/Subscribe 发布订阅

图片

exchange type是 fanout 。

在订阅模型中,多了一个 Exchange 角色,而且过程略有变化:

  • P:生产者,也就是要发送消息的程序,但是不再发送到队列中,而是发给X(交换机)

  • C:消费者,消息的接收者

  • Queue:消息队列,接收消息、缓存消息Exchange:交换机(X)。一方面,接收生产者发送的消息。另一方面,知道如何处理消息,例如递交给某个特别队列、递交给所有队列、或是将消息丢弃。到底如何操作,取决于Exchange的类型。

  • Exchange有常见以下3种类型:

    • Fanout:广播,将消息交给所有绑定到交换机的队列,交换机需要与队列进行绑定,绑定之后;一个消息可以被多个消费者都收到。

    • Direct:定向,把消息交给符合指定routing key 的队列

    • Topic:通配符,把消息交给符合routing pattern(路由模式) 的队列

Exchange(交换机)只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与 Exchange 绑定,或者没有符合路由规则的队列,那么消息会丢失!producer只负责发送消息,至于消息进入哪个queue,由exchange来分配。

使用场景:

所有消费者获得相同的消息,例如天气预报。

生产者:​​​​​​

channel.exchangeDeclare(EXCHANGE_NAME, "fanout");
channel.basicPublish(EXCHANGE_NAME, "", null, message.getBytes("UTF-8"));

消费者:​​​​​​​

channel.exchangeDeclare(EXCHANGE_NAME, "fanout")
String queueName = channel.queueDeclare().getQueue()
channel.queueBind(queueName, EXCHANGE_NAME, "")

发布订阅模式与工作队列模式的区别:

工作队列模式不用定义交换机,而发布/订阅模式需要定义交换机

发布/订阅模式的生产方是面向交换机发送消息,工作队列模式的生产方是面向队列发送消息(底层使用默认交换机)

发布/订阅模式需要设置队列和交换机的绑定,工作队列模式不需要设置,实际上工作队列模式会将队列绑 定到默认的交换机

4.6.3  Rout 路由模式

exchange typ 是 direct 。

图片

  • P:生产者,向 Exchange 发送消息,发送消息时,会指定一个routing key

  • X:Exchange(交换机),接收生产者的消息,然后把消息递交给与 routing key 完全匹配的队列

  • C1:消费者,其所在队列指定了需要 routing key 为 error 的消息

  • C2:消费者,其所在队列指定了需要 routing key 为 info、error、warning 的消息

路由模式要求队列在绑定交换机时要指定 routing key,消息会转发到符合 routing key 的队列。

Producer:​​​​​​​

channel.exchangeDeclare(EXCHANGE_NAME, "direct");
channel.basicPublish(EXCHANGE_NAME, routingKey, null, message.getBytes("UTF-8"));

Receiver:​​​​​​​

channel.exchangeDeclare(EXCHANGE_NAME, "direct")
channel.queueBind(queueName, EXCHANGE_NAME, routingKey1)
channel.queueBind(queueName, EXCHANGE_NAME, routingKey2)
channel.basicConsume(queueName, true, consumer)

4.6.4  Topics 通配符模式

exchange type 是 topic

图片

红色 Queue:绑定的是 usa.# ,因此凡是以 usa. 开头的 routing key 都会被匹配到

黄色 Queue:绑定的是 #.news ,因此凡是以 .news 结尾的 routing key 都会被匹配

对routingKey进行了模糊匹配单词之间用,隔开,* 代表一个具体的单词。# 代表0个或多个单词

Topic 主题模式可以实现 Pub/Sub 发布与订阅模式和 Routing 路由模式的功能,只是 Topic 在配置routing key 的时候可以使用通配符,显得更加灵活。

Producer:​​​​​​​

channel.exchangeDeclare(EXCHANGE_NAME, "topic");
channel.basicPublish(EXCHANGE_NAME, routingKey, null, message.getBytes("UTF-8"));

Receiver:​​​​​​​

channel.exchangeDeclare(EXCHANGE_NAME, "topic")
channel.queueBind(queueName, EXCHANGE_NAME, routingKey1)
channel.queueBind(queueName, EXCHANGE_NAME, routingKey2)
channel.basicConsume(queueName, true, consumer)

4.7 发送消息确认

发送的消息如果没有被消费者及时消费有可能会导致消息丢失。

发送者确认模式默认是不开启的,所以如果需要开启发送者确认模式,需要手动在channel中进行声明。​​​​​​​

channel.confirmSelect()
使用异步确认消息保证消息在生产端不丢失。

Producer在channel中注册监听器来对消息进行确认。核心代码:​​​​​​​

channel.addConfirmListener(ConfirmCallback var1, ConfirmCallback var2)
ConfirmCallback,监听器接口,里面只有一个方法:​​​​​​​
void handle(long sequenceNumber, boolean multiple) throws IOException; 
这方法中的两个参数,
  • sequenceNumer:这个是一个唯一的序列号,代表一个唯一的消息。在RabbitMQ中,他的消息体只是一个二进制数组,默认消息是没有序列号的。那么在回调的时候,Producer怎么知道是哪一条消息成功或者失败呢?RabbitMQ提供了一个方法int sequenceNumber = channel.getNextPublishSeqNo();来生成一个全局递增的序列号,这个序列号将会分配给新发送的那一条消息。然后应用程序需要自己来将这个序列号与消息对应起来。没错!是的!需要客户端自己去做对应!

  • multiple:这个是一个Boolean型的参数。如果是false,就表示这一次只确认了当前一条消息。如果是true,就表示RabbitMQ这一次确认了一批消息,在sequenceNumber之前的所有消息都已经确认完成了。

五、SpringBoot集成RabbitMQ

5.1 添加依赖​​​​​​​

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

5.2 配置文件​​​​​​​

server:
  port: 8081
spring:
  application:
    name: test-rabbitmq-producer
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
    virtualHost: /

5.3 RabbitMQ配置类

配置Exchange、Queue、及绑定交换机,下面配置Topic交换机。

package com.example.config;

import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; 
/ *RabbitmqConfig */

@Configurationpublic
class RabbitmqConfig {
    public static final String QUEUE_INFORM_EMAIL = "queue_inform_email";
    public static final String QUEUE_INFORM_SMS = "queue_inform_sms";
    public static final String EXCHANGE_TOPICS_INFORM = "exchange_topics_inform";
    public static final String ROUTINGKEY_EMAIL = "inform.#.email.#";
    public static final String ROUTINGKEY_SMS = "inform.#.sms.#";

    @Bean(EXCHANGE_TOPICS_INFORM)
    public Exchange EXCHANGE_TOPICS_INFORM() {
        return ExchangeBuilder.topicExchange(EXCHANGE_TOPICS_INFORM).durable(true).build();
    }

    @Bean(QUEUE_INFORM_EMAIL)
    public Queue QUEUE_INFORM_EMAIL() {
        return new Queue(QUEUE_INFORM_EMAIL);
    }

    @Bean(QUEUE_INFORM_SMS)
    public Queue QUEUE_INFORM_SMS() {
        return new Queue(QUEUE_INFORM_SMS);
    }

    @Bean
    public Binding BINDING_QUEUE_INFORM_EMAIL(@Qualifier(QUEUE_INFORM_EMAIL) Queue queue, @Qualifier(EXCHANGE_TOPICS_INFORM) Exchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with(ROUTINGKEY_EMAIL).noargs();
    }

    @Bean
    public Binding BINDING_ROUTINGKEY_SMS(@Qualifier(QUEUE_INFORM_SMS) Queue queue, @Qualifier(EXCHANGE_TOPICS_INFORM) Exchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with(ROUTINGKEY_SMS).noargs();
    }
}

5.4 发送消息​​​​​​​

String message = "hello world"
rabbitTemplate.convertAndSend(RabbitmqTopicConfig.EXCHANGE_TOPICS_INFORM, "inform.email", message)

5.5 消费消息

消费者都是通过@RabbitListener注解来声明。在@RabbitMQListener注解中包含了非常多对Queue进行定制的属性,大部分的属性都是有默认值的。

    @RabbitListener(queues = {RabbitmqTopicConfig.QUEUE_INFORM_EMAIL})
    public void receive_email(Object msg, Message message, Channel channel){
        System.out.println("QUEUE_INFORM_EMAIL msg"+msg);
    }
    
    @RabbitListener(queues = {RabbitmqTopicConfig.QUEUE_INFORM_SMS})
    public void receive_sms(Object msg, Message message, Channel channel){
        System.out.println("QUEUE_INFORM_SMS msg"+msg);
    }

标签:NAME,Exchange,队列,入门教程,RabbitMQ,消息,RabbitMq,就够,channel
From: https://blog.csdn.net/qq_41320700/article/details/144142656

相关文章

  • 【2024寒假全新】渗透测试工具大全(超详细),收藏这一篇就够了!
     黑客/网安大礼包:......
  • RabbitMQ26问,基本涵盖了面试官必问的面试题(知识满满!!!)
    目录1.RabbitMQ是什么?2.RabbitMQ特点?3.AMQP是什么?4.AMQP协议3层?5.AMQP模型的几大组件?6.说说生产者Producer和消费者Consumer?7.为什么需要消息队列?8.说说Broker服务节点、Queue队列、Exchange交换器?9.消息队列有什么优缺点10.如何保证消息的可靠性?11.什么是Routi......
  • 从零开始学习黑客技术,看这一篇就够了
    ......
  • 程序初学者推荐学习的三种热门编程语言,从零基础到精通,收藏这篇就够了!
    在当今的社会需求下,市场上最常见、最受欢迎、最广泛应用的编程语言主要有三种:C语言、Java语言和Python语言。既然要做出选择,我们就需要明白这三种编程语言各自有何特点和区别。0****1从开发难度而言C语言以其简洁性而被认为是初学者友好的编程语言,易于理解。然而,要达到......
  • RabbitMQ 双机 镜像集群模式
    目录准备工作组建集群rabbitmq01rabbitmq02设置HA策略注意补充命令行检验登录管理界面检验准备工作#/etc/hosts172.16.0.11rabbitmq01172.16.0.12rabbitmq02组建集群rabbitmq01rabbitmq-server-detachedrabbitmqctlstatus#复制cookiecp~/.erlang.cookierabbitmq......
  • 《Vue零基础入门教程》第十八课:计算属性 VS 侦听器
      往期内容《Vue零基础入门教程》第十课:属性绑定指令《Vue零基础入门教程》第十一课:事件绑定指令《Vue零基础入门教程》第十二课:双向绑定指令《Vue零基础入门教程》第十三课:条件渲染《Vue零基础入门教程》第十四课:列表渲染《Vue零基础入门教程》第十五课:样式绑定《Vue......
  • pyad(Python Active Directory)入门教程
    今年换了工作,需要比较频繁的操作AD域控,但是之前同事写的PS脚本比较不灵活(主要是我也不太会PS),然后就想能不能使用Python来编写一些自动化程序操作域控,便找到了pyad这个库。pyad是一个第三方Python库,用于管理MicrosoftActiveDirectory,可以将AD对象表示为Python对象(ADUser、ADGrou......
  • 等保测评2.0超详细解读(0基础入门到精通),只要收藏这一篇就够了!!
    一、等级保护介绍1.1什么是等级保护网络安全等级保护是指对国家重要信息、法人和其他组织及公民的专有信息以及信息和存储、传输、处理这些信息的信息系统分等级实行安全保护,对信息系统中使用的信息安全产品实行按等级管理,对信息系统中发生的信息安全事件分等级响应、处置......
  • 渗透测试入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
    前言转眼间,从大三开始学安全,到现在也有五年了,也算是对渗透测试有一定理解,公众号准备出一些入门教程,以实操为主,希望可以帮助到想入门渗透测试的小白。如果觉得有用,可以在文章后面支持一下我,作为我写下去的动力。1.什么是渗透测试渗透测试就是模拟真实黑客的攻击手法对目......
  • 用rabbitmqadmin 模拟消息的创建、发布、订阅
    前言rabbitmqadmin工具可以方便地管理RabbitMQ的资源,包括创建交换机Exchanges、队列Queues、绑定Bindings,以及发布Publish和订阅Subscribe消息。确保你已经下载并安装了rabbitmqadmin,并且RabbitMQ管理插件是启用的。你可以从http://localhost:15672/cli/下载......