准备一个 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。

2025-07-23T07:13:12.png

使用 IDEA 或者其他软件都可以,创建一个父项目 rabbitmq-foundation-project 这个名称随便什么都可以,创建项目的时候会有一个 src 删除了就好,将 packaging 改成 pom,在加上 rabbitmq 的 maven 坐标,结构最后就像我这样了。

2025-07-23T07:13:25.png

<?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 的名词解释

  1. Producer:发送消息,并指定要发送到哪个 Exchange 和一个 routing_key(路由键)。
  2. Exchange:接收消息,根据自身的类型和消息的 routing_keyheaders 进行决策。

    1. Direct:直连交换机,精确匹配。它会把消息路由到 binding\_key 与消息的 routing\_key 完全相同的队列。类似一个送信的投递员将一封信精准的送到你家
    2. Fanout:扇出交换机,也就是广播模式。类似收音机广播电台,电台不关心到底是谁收到了消息。
    3. Topic:主题交换机,模式匹配。routing_keybinding_key 都是由点号 . 分隔的单词字符串。binding_key 中可以使用两种特殊的通配符:

      • * (星号): 匹配一个单词。
      • # (井号): 匹配零个或多个单词。
    4. Headers:头交换机,这个用的不多。这个交换机不通过routingkey,但是通过headers进行绑定
  3. Binding:这是 Exchange 和 Queue 之间的“连接关系”。在建立这个连接时,通常会指定一个 binding_key(绑定键)。
  4. Queue:存储消息,等待消费者来取。
  5. Consumer:从队列中获取并处理消息。
  6. channel: 通道,客户端与RabbitMQ服务器之间的虚拟连接,它允许在客户端和代理之间交换消息,并且每个通道都是独立的。可以将其视为“共享单个 TCP 连接的轻量级连接”。

标签: java, docker, rabbitmq

添加新评论