RabbitMQ是一个被广泛使用的开源消息队列。它是轻量级且易于部署的,它能支持多种消息协议。RabbitMQ可以部署在分布式和联合配置中,以满足高规模、高可用性的需求。
1、查找镜像
docker search rabbitmq
2、拉取镜像
docker pull rabbitmq:3.7.16-management
默认情况下,会拉取rabbitmq的latest版本。这里拉取 Web浏览器管理页面的tag
3.7.16-management
3、启动镜像
docker run -p 15672:15672 -p 5672:5672 -d --hostname dnmp-rabbitmq \
--name dnmp-rabbitmq --network dnmp_backend \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \
rabbitmq:3.7.16-management
参数解释
15672
:表示 RabbitMQ 控制台端口号,可以在浏览器中通过控制台来执行 RabbitMQ 的相关操作。5672
: 表示 RabbitMQ 所监听的 TCP 端口号,应用程序可通过该端口与 RabbitMQ 建立 TCP 连接,完成后续的异步消息通信RABBITMQ_DEFAULT_USER
:用于设置登陆控制台的用户名,这里我设置 admin
RABBITMQ_DEFAULT_PASS
:用于设置登陆控制台的密码,这里我设置 admin
容器启动成功后,可以在浏览器输入地址:http://ip:15672/
访问控制台4、访问地址查看是否安装成功:http://127.0.0.1:15672/
5、输入账号密码并登录 admin admin
6、创建帐号并设置其角色为管理员 resty resty
7、创建一个新的虚拟host为 resty
8、点击 resty 用户进入用户配置页面9、给 resty 用户配置该虚拟host的权限
10、至此,RabbitMQ的安装和配置完成
标志 | 中文名 | 英文名 | 描述 |
---|---|---|---|
P | 生产者 | Producer | 消息的发送者,可以将消息发送到交换机 |
C | 消费者 | Consumer | 消息的接收者,从队列中获取消息进行消费 |
X | 交换机 | Exchange | 消息的发送者,可以将消息发送到交换机 |
Q | 队列 | Queue | 存储从交换机发来的消息 |
type | 交换机类型 | type | direct表示直接根据路由键(orange/black)发送消息 |
以下以ThinkPHP5.1 框架为测试环境
docker run --rm --interactive --tty \
-v e:/dnmp/www/iot.tinywan.com:/app \
composer require php-amqplib/php-amqplib \
v2.9.0 --ignore-platform-reqs
mq_send.php 脚本
#!/usr/bin/env php
<?php
namespace think;
define('APP_PATH', __DIR__ . '/application/');
require __DIR__ . '/thinkphp/base.php';
Container::get('app',[APP_PATH])->bind('http/RabbitMq/send')->run()->send();
业务代码
public function send()
{
$connection = new AMQPStreamConnection('dnmp-rabbitmq', 5672, 'admin', 'admin'); $channel = $connection->channel();
$channel->queue_declare('hello', false, false, false, false);
$msg = new AMQPMessage('Hello World!');
$channel->basic_publish($msg, '', 'hello');
echo " [x] Sent 'Hello World!'\n";
$channel->close();
$connection->close();
}
注意
1、 user
和 password
就是docker启动时候的 RABBITMQ_DEFAULT_USER=admin
和 RABBITMQ_DEFAULT_PASS=admin
。前面我们设置的 admin
和admin
2、连接主机host
是dnmp-rabbitmq
,由于是在docker容器之内
在终端中,运行消费者(接收者)
> docker exec -it dnmp-php72 sh -c \"php /var/www/iot.tinywan.com/mq_receive.php" [*] Waiting for messages. To exit press CTRL+C
[x] Received Hello World!
[x] Received Hello World!
[x] Received Hello World!
[x] Received Hello World!
mq_receive.php脚本
#!/usr/bin/env php
<?php
namespace think;
define('APP_PATH', __DIR__ . '/application/');
require __DIR__ . '/thinkphp/base.php';
Container::get('app',[APP_PATH])->bind('http/RabbitMq/receive')->run()->send();
业务代码
public function receive()
{
$connection = new AMQPStreamConnection('dnmp-rabbitmq', 5672, 'admin', 'admin');
$channel = $connection->channel();
$channel->queue_declare('hello', false, false, false, false);
echo " [*] Waiting for messages. To exit press CTRL+C\n";
$callback = function ($msg) {
echo ' [x] Received ', $msg->body, "\n";
};
$channel->basic_consume('hello', '', false, true, false, false, $callback);
while (count($channel->callbacks)) {
$channel->wait();
}
}
在终端中,运行发布者(发件人)
> docker exec -it dnmp-php72 sh -c "php /var/www/iot.tinywan.com/mq_send.php"
[x] Sent 'Hello World!'