Skip to content

before

RabbitMQ是基于 Erlang 语言开发的,因此它的不同版本通常要求使用特定版本的 Erlang 运行环境。

下面是 RabbitMQ 和 Erlang 版本之间的对应关系:https://www.rabbitmq.com/which-erlang.html

1832669967196094464.png

for windows

版本对照选择:https://www.rabbitmq.com/which-erlang.html

1832669967770714112.png

安装erlang

1. 下载

选择26.2.1版本:https://www.erlang.org/patches/otp-26.2.1

1832669968299196416.png

2. 双击安装包进行安装

安装位置可以自定义,但避开中文和空格的路径。

1832669968693460992.png

3. 配置环境变量

添加erlang的环境变量,也就是把erlang的安装目录添加到系统变量中。

1832669969314217984.png

再将erlang安装目录中的bin目录添加path中:

1832669970488623104.png

4. 测试

bash
Microsoft Windows [Version 10.0.22621.3007]
(c) Microsoft Corporation。保留所有权利。

C:\Users\12061>erl -version
Erlang (SMP,ASYNC_THREADS) (BEAM) emulator version 14.2.1

返回版本号即可。

安装rabbitmq

1. 下载

下载链接:https://github.com/rabbitmq/rabbitmq-server/releases/tag/v3.12.12

1832669971260375040.png

2. 安装

1832669971772080128.png

3. 添加环境变量

1832669972342505472.png

4. 安装管理插件

新打开一个cmd终端执行下面的命令:

bash
rabbitmq-plugins enable rabbitmq_management

C:\Users\12061>rabbitmq-plugins enable rabbitmq_management
Enabling plugins on node rabbit@zhangkai:
rabbitmq_management
The following plugins have been configured:
  rabbitmq_management
  rabbitmq_management_agent
  rabbitmq_web_dispatch
Applying plugin configuration to rabbit@zhangkai...
The following plugins have been enabled:
  rabbitmq_management
  rabbitmq_management_agent
  rabbitmq_web_dispatch

set 3 plugins.
Offline change; changes will take effect at broker restart.

5. 启动服务

cmd终端执行下面的命令:

bash
rabbitmq-server

C:\Users\12061>rabbitmq-server
2024-01-16 20:31:25.814000+08:00 [warning] <0.135.0> Using RABBITMQ_ADVANCED_CONFIG_FILE: c:/Users/12061/AppData/Roaming/RabbitMQ/advanced.config
2024-01-16 20:31:28.604000+08:00 [notice] <0.44.0> Application syslog exited with reason: stopped
2024-01-16 20:31:28.604000+08:00 [notice] <0.235.0> Logging: switching to configured handler(s); following messages may not be visible in this log output

  ##  ##      RabbitMQ 3.12.12
  ##  ##
  ##########  Copyright (c) 2007-2023 Broadcom Inc and/or its subsidiaries
  ######  ##
  ##########  Licensed under the MPL 2.0. Website: https://rabbitmq.com

  Erlang:      26.2.1 [jit]
  TLS Library: OpenSSL - OpenSSL 3.1.0 14 Mar 2023
  Release series support status: supported

  Doc guides:  https://rabbitmq.com/documentation.html
  Support:     https://rabbitmq.com/contact.html
  Tutorials:   https://rabbitmq.com/getstarted.html
  Monitoring:  https://rabbitmq.com/monitoring.html

  Logs: <stdout>
        c:/Users/12061/AppData/Roaming/RabbitMQ/log/rabbit@zhangkai.log

  Config file(s): c:/Users/12061/AppData/Roaming/RabbitMQ/advanced.config

  Starting broker... completed with 3 plugins.

6. 测试

当服务启动后,浏览器访问http://127.0.0.1:15672/

1832669973072314368.png

登录进来之后就能看到这个页面了:

1832669973307195392.png

7. 添加rabbitmq到Windows的系统服务,方便设置开机启动

以管理员权限打开的终端才能执行下面的命令:

bash
# 添加rabbitmq到Windows的系统服务
# 执行一次成功即可,不需要重复执行
rabbitmq-plugins enable rabbitmq_management


# 启动和关闭rabbitmq服务
net start rabbitmq
net stop rabbitmq

1832669973735014400.png

设置开机启动:

1832669974624206848.png

Python操作rabbitmq

1. 下载对应的模块

bash
# 下载最新版本
pip install pika

# 我用的是1.3.2版本
pip install pika==1.3.2

2. 代码测试

你可以先运行消费者代码再运行生产者代码。

python
import pika

# 连接 RabbitMQ Server
credentials = pika.PlainCredentials('guest', 'guest')  # RabbitMQ 用户名和密码
connection = pika.BlockingConnection(
    pika.ConnectionParameters(
        host='127.0.0.1',
        port=5672,
        virtual_host='/',
        credentials=credentials)
)

# 消费者通过 channel 对象与 RabbitMQ Server 打交道
channel = connection.channel()

# 声明一个队列,如果该队列不存在就创建
channel.queue_declare(queue='news1')


# 回调函数
def callback(ch, method, properties, body):
    """
    回调函数执行时,表示消费者已经从队列中拿到了消息,可以实现具体的逻辑
    :param ch:
    :param method:
    :param properties:
    :param body: bytes类型的消息
    :return: None
    """

    print(" [x] Received %r" % body.decode())


# 配置监听队列的相关参数
channel.basic_consume(
    queue='news1',  # 监听指定队列
    auto_ack=True,  # auto_ack:True 表示当消费者从队列中取出消息后,缓存中就不再保存该消息了
    on_message_callback=callback  # 当监听的队列有消息时调用回调函数执行具体逻辑
)

# 开始监听
channel.start_consuming()

"""
[x] Received '今日新到绿茶0位'
[x] Received '今日新到绿茶1位'
[x] Received '今日新到绿茶2位'
[x] Received '今日新到绿茶3位'
[x] Received '今日新到绿茶4位'
[x] Received '今日新到绿茶5位'
[x] Received '今日新到绿茶6位'
[x] Received '今日新到绿茶7位'
[x] Received '今日新到绿茶8位'
[x] Received '今日新到绿茶9位'
"""
python
import pika

# 连接 RabbitMQ Server
credentials = pika.PlainCredentials('guest', 'guest')  # RabbitMQ 用户名和密码
connection = pika.BlockingConnection(
    pika.ConnectionParameters(
        host='127.0.0.1',
        port=5672,
        virtual_host='/',
        credentials=credentials)
)

# 生产者通过 channel 对象与 RabbitMQ Server 打交道
channel = connection.channel()

# 声明一个队列,如果该队列不存在就创建
channel.queue_declare(queue='news1')

# 声明并配置交换机规则并路由到指定的队列,然后投递消息
for i in range(10):
    channel.basic_publish(
        exchange='',  # 当 exchange 值为空时,使用默认的交换机模式
        routing_key='news1',   # 指定路由队列
        body=f'今日新到绿茶{i}位'.encode('utf-8')   # 投递消息
    )
    print(f'今日新到绿茶{i}位')  # 测试使用,与主体逻辑无关
    
"""
今日新到绿茶0位
今日新到绿茶1位
今日新到绿茶2位
今日新到绿茶3位
今日新到绿茶4位
今日新到绿茶5位
今日新到绿茶6位
今日新到绿茶7位
今日新到绿茶8位
今日新到绿茶9位
"""

for docker

1. 拉取镜像

bash
docker pull rabbitmq:management
# 注意,如果docker pull rabbitmq 后面不带management,启动rabbitmq后是无法打开管理界面的,所以我们要下载带management插件的rabbitmq

2. 启动镜像

bash
docker run \
-d \
--name rabbitmq \
--hostname myrabbitmq \
--restart=always \
-e RABBITMQ_DEFAULT_USER=guest \
-e RABBITMQ_DEFAULT_PASS=12346 \
-v /data/rabbitmq_data:/var/lib/rabbitmq \
-p 5672:5672 \
-p 15672:15672 \
rabbitmq:management

其中:

  • -d:后台运行容器。
  • --name rabbitmq:容器名。
  • --hostname myrabbitmq:主机名,RabbitMQ的一个重要注意事项是它根据所谓的 "节点名称"存储数据,默认为主机名。
  • --restart=always,表示将容器跟随docker服务重启而重启。
  • -e:指定环境变量:
    • RABBITMQ_DEFAULT_USER:默认用户名。
    • RABBITMQ_DEFAULT_PASS:默认密码。
  • -v:挂在本地目录。
  • -p:指定映射端口:
    • 5672:5672:应用访问端口。
    • 15672:15672:web访问端口。

3. 连接

你如果下载的是带web插件版的,可以通过ip:15672访问web页面:

1832669975748280320.png

也可以通过接口与其他语言进行通信,我这里及后续都通过Python与RabbitMQ通信,所以这里需要下载通信模块:

python
pip install pika==1.1.0

测试:

python
import pika

credentials = pika.PlainCredentials('guest', '12346')  # mq用户名和密码
connection = pika.BlockingConnection(
    pika.ConnectionParameters(
        host='192.168.10.91',
        port=5672,
        virtual_host='/',
        credentials=credentials)
)