rabbitMQ docker安装测试

本文详细介绍了消息队列(MQ)的基本概念及其不同类型的特性对比,重点解析了RabbitMQ的安装配置、运行管理和API使用等核心内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MQ是什么

消息队列就是用存放消息的队列结构,简称MQ;
参考:
http://blog.51cto.com/lee90/2058126

选型

参考
+ https://www.sojson.com/blog/48.html
+ https://blog.youkuaiyun.com/pkueecser/article/details/50613989

特性ActiveMQRabbitMQKafkaNMQ
PRODUCER-COMSUMER支持支持支持-
PUBLISH-SUBSCRIBE支持支持支持支持
REQUEST-REPLY支持支持-不支持
API完备性低(静态配置)
多语言支持支持,JAVA优先语言无关支持,JAVA优先C/C++
单机呑吐量万级万级十万级单机万级
消息延迟-微秒级毫秒级-
可用性高(主从)高(主从)非常高(分布式)非常高(分布式)
消息丢失-理论上不会丢失-
消息重复-可控制理论上会有重复-
文档的完备性
提供快速入门
首次部署难度-

RabitMq 搭建

参考
+ https://hub.docker.com/_/rabbitmq/

安装
docker pull rabiitmq:3.7-alpine
运行方式

几个注意点:

  • 设置hostname, 因为rabbimq数据存放依赖node name; 而默认的节点名称是hostname;
$ docker run -d --hostname my-rabbit --name some-rabbit rabbitmq:3.7-alpine
# 为持久化可在启动时增加以下两参数
-v "rabbitmq_log:/var/log/rabbitmq" \
-v "rabbitmq_data:/var/lib/rabbitmq" \

默认监听端口5672;

  • 内存限制
    rabbitmq参数vm_memory_high_watermark, 由环境变量RABBITMQ_VM_MEMORY_HIGH_WATERMARK决定;

    –memory 2048m (and the implied upstream-default RABBITMQ_VM_MEMORY_HIGH_WATERMARK of 40%) will set the effective limit to 819MB (which is 40% of 2048MB).

  • Erlang Cookie

    RabbitMQ nodes 和 CLI 命令行工具 (e.g. rabbitmqctl) 利用 cookie来决定是否允许互相通讯;

RABBITMQ_ERLANG_COOKIE 环境变量设置cookie
RABBITMQ_NODENAME 可反复唤起rabbitmqctl

$ docker run -it --rm --link some-rabbit:my-rabbit -e RABBITMQ_ERLANG_COOKIE='secret cookie here' -e RABBITMQ_NODENAME=rabbit@my-rabbit rabbitmq:3 bash

管理插件

带管理插件的rabbitmq镜像

安装

docker pull rabbitmq:3.7-management-alpine

运行

$ docker run -d --hostname my-rabbit --name some-rabbit -p 8080:15672 rabbitmq:3.7-management-alpine

默认端口15672, 默认账号密码: guest / guest; 可通过RABBITMQ_DEFAULT_USER 和 RABBITMQ_DEFAULT_PASS修改;

配置

参考

HiPE(High Performance Erlang) 霸爷有一个一语中的的描述”erlang的hipe相当于jit, 根据语言评测有hipe支持在纯erlang的运算上会快2-3倍,这个性能的提升对于计算密集型的应用还是比较可观的。”

插件

通过docker file来查看运行

FROM rabbitmq:3.7-alpine-management
RUN rabbitmq-plugins enable --offline rabbitmq_mqtt rabbitmq_federation_management rabbitmq_stomp

使用

参考
+ https://www.rabbitmq.com/getstarted.html

启动服务
docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672 rabbitmq:3.7-management-alpine
docker logs some-rabbit
 node           : rabbit@my-rabbit
 home dir       : /var/lib/rabbitmq
 config file(s) : /etc/rabbitmq/rabbitmq.conf
 cookie hash    : 9dc/v2egQn2ldwnTkb+DSg==
 log(s)         : <stdout>
 database dir   : /var/lib/rabbitmq/mnesia/rabbit@my-rabbit
2018-08-07 10:20:49.914 [info] <0.205.0> Memory high watermark set to 801 MiB (840700723 bytes) of 2004 MiB (2101751808 bytes) total
...
2018-08-07 10:20:49.925 [info] <0.197.0> Node database directory at /var/lib/rabbitmq/mnesia/rabbit@my-rabbit is empty. Assuming we need to join an existing cluster or initialise from scratch...
...
2018-08-07 10:20:50.201 [info] <0.197.0> Adding vhost '/'
2018-08-07 10:20:50.227 [info] <0.415.0> Making sure data directory '/var/lib/rabbitmq/mnesia/rabbit@my-rabbit/msg_stores/vhosts/628WB79CIFDYO9LJI6DKMI09L' for vhost '/' exists
2018-08-07 10:20:50.233 [info] <0.415.0> Starting message stores for vhost '/'
2018-08-07 10:20:50.233 [info] <0.419.0> Message store "628WB79CIFDYO9LJI6DKMI09L/msg_store_transient": using rabbit_msg_store_ets_index to provide index
2018-08-07 10:20:50.235 [info] <0.415.0> Started message store of type transient for vhost '/'
2018-08-07 10:20:50.236 [info] <0.422.0> Message store "628WB79CIFDYO9LJI6DKMI09L/msg_store_persistent": using rabbit_msg_store_ets_index to provide index
2018-08-07 10:20:50.237 [warning] <0.422.0> Message store "628WB79CIFDYO9LJI6DKMI09L/msg_store_persistent": rebuilding indices from scratch
2018-08-07 10:20:50.238 [info] <0.415.0> Started message store of type persistent for vhost '/'
2018-08-07 10:20:50.240 [info] <0.197.0> Creating user 'guest'
2018-08-07 10:20:50.247 [info] <0.197.0> Setting user tags for user 'guest' to [administrator]
2018-08-07 10:20:50.250 [info] <0.197.0> Setting permissions for 'guest' in '/' to '.*', '.*', '.*'
2018-08-07 10:20:50.256 [info] <0.460.0> started TCP Listener on 0.0.0.0:5672
2018-08-07 10:20:50.263 [info] <0.197.0> Setting up a table for connection tracking on this node: 'tracked_connection_on_node_rabbit@my-rabbit'
2018-08-07 10:20:50.269 [info] <0.197.0> Setting up a table for per-vhost connection counting on this node: 'tracked_connection_per_vhost_on_node_rabbit@my-rabbit'
python post/subscribe模型

需要Pika库;

pip3 install pika
hello wold

publish端

# 建立连接
#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

# 建立queue
channel.queue_declare(queue='hello')

# 消息不能直接发送到queue,必须经过exchange; 
channel.basic_publish(exchange='',
                      routing_key='hello',
                      body='Hello World!')
print(" [x] Sent 'Hello World!'")
connection.close()

client端


#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()

channel.queue_declare(queue='hello')  #可以多次调用,总是同一个queue (即idempotent)

def callback(ch, method, properties, body):
    print(" [x] Received %r" % body)

channel.basic_consume(callback,
                      queue='hello',
                      no_ack=True)

print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()
exchange绑定多个queue

send.py

#!/usr/bin/env python
import pika
import sys

connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()

channel.exchange_declare(exchange='logs',
                         exchange_type='fanout')

message = ' '.join(sys.argv[1:]) or "info: Hello World!"
channel.basic_publish(exchange='logs',
                      routing_key='',
                      body=message)
print(" [x] Sent %r" % message)
connection.close()

receive.py

#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()

channel.exchange_declare(exchange='logs',
                         exchange_type='fanout')

result = channel.queue_declare(exclusive=True)
queue_name = result.method.queue

channel.queue_bind(exchange='logs',
                   queue=queue_name)

print(' [*] Waiting for logs. To exit press CTRL+C')

def callback(ch, method, properties, body):
    print(" [x] %r" % body)

channel.basic_consume(callback,
                      queue=queue_name,
                      no_ack=True)

channel.start_consuming()

AMQ 基本API

https://www.rabbitmq.com/amqp-0-9-1-quickref.html

basic
basic.ack
basic.cancel
basic.consume
basic.deliver
basic.get
basic.nack
basic.publish
basic.qos
basic.recover
basic.recover-async
basic.reject
basic.return
channel 
channel.close
channel.flow
channel.open
confirm
confirm.select
exchange  路由/交换
exchange.bind
exchange.declare
exchange.delete
exchange.unbind
queue 队列
queue.bind
queue.declare
queue.delete
queue.purge
queue.unbind
tx  事物
tx.commit
tx.rollback
tx.select

权限

参考

RabbitMQ的用户角色分类:
none、management、policymaker、monitoring、administrator
两种数据;
* 定义类 Definitions (Topology)
定义类数据在内部数据库保存,并在所有集群节点内自动同步. 当一个节点改变时,其他节点也会同步改变; 也即备份时,从任一节点备份皆可.
- 消息数据 Messages data
消息数据存在消息store区域; 对用户透明; 用户也不需要关心;

### 谷粒商城 RabbitMQ Docker 配置教程 #### 1. 拉取 RabbitMQ 官方镜像 为了在谷粒商城项目中使用 RabbitMQ 并通过 Docker 部署,首先需要拉取官方的 RabbitMQ 镜像。可以通过以下命令完成此操作: ```bash docker pull rabbitmq:management ``` 该命令会下载带有管理插件支持的 RabbitMQ 镜像版本[^3]。 #### 2. 创建并运行 RabbitMQ 容器 接下来,创建并运行一个 RabbitMQ 容器。以下是完整的命令示例: ```bash mkdir -p /usr/local/docker/rabbitmq docker run -d \ --name rabbitmq \ -v /usr/local/docker/rabbitmq:/var/lib/rabbitmq \ -p 15672:15672 \ -p 5672:5672 \ -e RABBITMQ_DEFAULT_USER=admin \ -e RABBITMQ_DEFAULT_PASS=admin \ rabbitmq:management ``` 上述命令的作用如下: - `-d` 表示以后台模式运行容器。 - `--name rabbitmq` 设置容器名称为 `rabbitmq`。 - `-v` 将本地目录 `/usr/local/docker/rabbitmq` 映射到容器内的 `/var/lib/rabbitmq` 目录,用于持久化数据存储。 - `-p` 将主机端口映射到容器内部服务端口,其中 `5672` 是 RabbitMQ 的消息通信端口,而 `15672` 则是 Web 管理界面使用的端口。 - `-e` 设定环境变量,定义默认用户名和密码分别为 `admin` 和 `admin`[^2]。 #### 3. 测试 RabbitMQ 是否启动成功 启动完成后,可通过浏览器访问 RabbitMQ 的管理页面以验证其是否正常工作。输入地址 `http://<服务器IP>:15672`,登录时使用之前设置的用户名和密码(即 `admin/admin`)。如果能够成功进入管理界面,则说明 RabbitMQ 已经正确部署[^4]。 #### 4. 查看 RabbitMQ 日志 若遇到任何问题,可查看 RabbitMQ 的日志文件进一步排查原因。执行以下命令即可实时跟踪日志输出: ```bash docker logs -f rabbitmq ``` #### 5. 在谷粒商城中集成 RabbitMQ 在谷粒商城项目的 Spring Boot 或其他框架配置文件中,添加 RabbitMQ 的连接参数。例如,在 `application.yml` 中写入以下内容: ```yaml spring: rabbitmq: host: localhost port: 5672 username: admin password: admin ``` 确保以上配置中的 IP 地址、端口号、用户名和密码与实际部署一致。之后重启应用以使更改生效[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值