跟着官网学RabbitMQ-准备工作
准备一个 RabbitMQ 环境为后面的实验做准备,我日常喜欢使用windows + docker 作为本地的测试环境。如果没有安装 docker 的话可以去官网 https://www.docker.com/products/docker-desktop/ 查看各个系统的安装环境的办法,这篇文章不做解释。或者可以下载一个单机版本的 rabbitmq 服务也是可以的。
开始制作脚本,随意创建一个目录并且在创建的目录下准备一个 docker-compose.yml 文件用来启动 RabbitMQ 服务,下面代码块是 docker-compose.yml 里面的内容
services:
# 定义 RabbitMQ 服务
experiment-rabbitmq:
# 使用你指定的镜像,包含管理插件
image: rabbitmq:3-management
# 为容器设置一个固定的、友好的名称
container_name: my-rabbitmq
# 设置 RabbitMQ 节点的主机名,这在集群中很有用
hostname: rabbitmq
# 设置环境变量,用于配置 RabbitMQ
environment:
# 设置默认的用户名和密码。请务必修改为更安全的值!
# 默认的 guest/guest 用户只能从 localhost 访问。
- RABBITMQ_DEFAULT_USER=user
- RABBITMQ_DEFAULT_PASS=123qwe
ports:
# 将主机的 5672 端口映射到容器的 5672 端口 (AMQP 协议,用于应用程序连接)
- "45672:5672"
# 将主机的 15672 端口映射到容器的 15672 端口 (Management UI 管理后台)
- "55672:15672"
volumes:
# 创建一个名为 rabbitmq_data 的 Docker 卷,并挂载到容器中 RabbitMQ 存储数据的目录
# 这样可以确保在容器重启或删除后,队列、消息和配置等数据不会丢失。
- rabbitmq_data:/var/lib/rabbitmq
networks:
# 将此服务连接到下面定义的自定义网络
- experiment_network
# 设置重启策略,确保容器在意外退出或 Docker 服务重启后能自动重启
restart: unless-stopped
# 定义 Docker 卷 (用于数据持久化)
volumes:
rabbitmq_data:
# 定义自定义网络 (推荐做法,便于服务间通信)
networks:
experiment_network:
driver: bridge
通过浏览器输入地址 http://localhost:55672/ 打开 RabbitMQ Management。按照下面图片的步骤创建一个 Virtual Host。
使用 IDEA 或者其他软件都可以,创建一个父项目 rabbitmq-foundation-project
这个名称随便什么都可以,创建项目的时候会有一个 src 删除了就好,将 packaging
改成 pom,在加上 rabbitmq 的 maven 坐标,结构最后就像我这样了。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.runbrick</groupId>
<artifactId>rabbitmq-experiment-project</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>rabbitmq-foundation-project</artifactId>
<packaging>pom</packaging>
<description>基础实验</description>
<modules>
<module>rabbitmq-hello-world-project</module>
<module>rabbitmq-work-queues-project</module>
<module>rabbitmq-publish-subscribe-project</module>
<module>rabbitmq-routing-project</module>
<module>rabbitmq-topic-project</module>
<module>rabbitmq-publish-confirm</module>
</modules>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<ampq.client.version>5.25.0</ampq.client.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>${ampq.client.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
简单的说一下一些学 RabbitMQ 的名词解释
- Producer:发送消息,并指定要发送到哪个 Exchange 和一个
routing_key
(路由键)。 Exchange:接收消息,根据自身的类型和消息的
routing_key
或headers
进行决策。- Direct:直连交换机,精确匹配。它会把消息路由到 binding\_key 与消息的 routing\_key 完全相同的队列。类似一个送信的投递员将一封信精准的送到你家
- Fanout:扇出交换机,也就是广播模式。类似收音机广播电台,电台不关心到底是谁收到了消息。
Topic:主题交换机,模式匹配。
routing_key
和binding_key
都是由点号.
分隔的单词字符串。binding_key
中可以使用两种特殊的通配符:*
(星号): 匹配一个单词。#
(井号): 匹配零个或多个单词。
- Headers:头交换机,这个用的不多。这个交换机不通过routingkey,但是通过headers进行绑定
- Binding:这是 Exchange 和 Queue 之间的“连接关系”。在建立这个连接时,通常会指定一个
binding_key
(绑定键)。 - Queue:存储消息,等待消费者来取。
- Consumer:从队列中获取并处理消息。
- channel: 通道,客户端与RabbitMQ服务器之间的虚拟连接,它允许在客户端和代理之间交换消息,并且每个通道都是独立的。可以将其视为“共享单个 TCP 连接的轻量级连接”。