RabbitMQ是一个开源的消息代理软件,它使用高级消息队列协议(AMQP)来实现消息的发送和接收。RabbitMQ支持多种消息协议,包括STOMP、MQTT等,并且能够与多种编程语言和平台集成,如Java、.NET、Python等。
AMQP 即
Advanced Message Queuing Protocol
(高级消息队列协议),是一个网络协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。
图片来源:https://blog.csdn.net/cuierdan/article/details/123824300
这里使用1Panel安装,1Panel 是一个现代化、开源的 Linux 服务器运维管理面板
注:这里需要勾选【端口外部访问】,方便本地调试
安装成功后,就可以在镜像中找到已安装好的RabbitMQ镜像容器
外网可访问地址:http://{{你的公网ip}}:15672
,如果是在云服务器,记得安全策略放开端口15672
15672
。是一个Web应用程序,用于管理和监控RabbitMQ消息代理5672
。是一种网络协议,用于在应用程序之间传递消息,通常用于消息队列系统。登陆控制台,账号和密码都是rabbitmq
这里使用webman插件RabbitMQ客户端,插件地址:https://www.workerman.net/plugin/67
,
非常感谢兔子大佬的插件贡献!🌻
非常感谢兔子大佬的插件贡献!🌻
非常感谢兔子大佬的插件贡献!🌻
RabbitMQ
须安装插件);通过composer包管理安装
composer require workbunny/webman-rabbitmq
注:安装该插件前,请确保你已经安装好webman框架,相关安装文档:
https://www.workerman.net/doc/webman/install.html
插件所有配置文件路径:config/plugin/workbunny/webman-rabbitmq/app.php
<?php
return [
'enable' => true,
'host' => '120.120.120.74',
'vhost' => '/',
'port' => 5672,
'username' => 'rabbitmq',
'password' => 'rabbitmq',
'mechanisms' => 'AMQPLAIN',
...
];
host
修改为服务器公网ipport
修改为15672这里使用命令创建一个拥有单进程消费者的RestyBuilder
./webman workbunny:rabbitmq-builder resty --mode=queue
ℹ️ Config updated.
ℹ️ Builder created.
✅ Builder RestyBuilder created successfully.
创建完成后完整的消费者文件位置process/workbunny/rabbitmq/RestyBuilder.php
<?php declare(strict_types=1);
namespace process\workbunny\rabbitmq;
use Bunny\Channel as BunnyChannel;
use Bunny\Async\Client as BunnyClient;
use Bunny\Message as BunnyMessage;
use Workbunny\WebmanRabbitMQ\Constants;
use Workbunny\WebmanRabbitMQ\Builders\QueueBuilder;
class RestyBuilder extends QueueBuilder
{
/**
* @var array = [
* 'name' => 'example',
* 'delayed' => false,
* 'prefetch_count' => 1,
* 'prefetch_size' => 0,
* 'is_global' => false,
* 'routing_key' => '',
* ]
*/
protected array $queueConfig = [
// 队列名称 ,默认由类名自动生成
'name' => 'process.workbunny.rabbitmq.RestyBuilder',
// 是否延迟
'delayed' => false,
// QOS 数量
'prefetch_count' => 0,
// QOS size
'prefetch_size' => 0,
// QOS 全局
'is_global' => false,
// 路由键
'routing_key' => '',
];
/** @var string 交换机类型 */
protected string $exchangeType = Constants::DIRECT;
/** @var string|null 交换机名称,默认由类名自动生成 */
protected ?string $exchangeName = 'process.workbunny.rabbitmq.RestyBuilder';
/** @inheritDoc */
public function handler(BunnyMessage $message, BunnyChannel $channel, BunnyClient $client): string
{
echo '[RabbitMQ][队列消费] Tag:' .$message->consumerTag. PHP_EOL;
echo '[RabbitMQ][队列消费着] Content:' .$message->content. PHP_EOL;
echo '[RabbitMQ][队列消费着] Exchange:' .$message->exchange. PHP_EOL;
return Constants::ACK;
}
}
php start.php start
Workerman[start.php] start in DEBUG mode
----------------------------------------------------------------------- WORKERMAN -----------------------------------------------------------------------
Workerman version:4.1.15 PHP version:8.2.18 Event-Loop:\Workerman\Events\Event
------------------------------------------------------------------------ WORKERS ------------------------------------------------------------------------
proto user worker listen processes status
tcp root webman http://0.0.0.0:8217 2 [OK]
tcp root monitor none 1 [OK]
tcp root plugin.workbunny.webman-rabbitmq.process.workbunny.rabbitmq.RestyBuilder none 1 [OK]
---------------------------------------------------------------------------------------------------------------------------------------------------------
use function Workbunny\WebmanRabbitMQ\sync_publish;
use process\workbunny\rabbitmq\RestyBuilder;
sync_publish(RestyBuilder::instance(), '兔子大佬你好呀!'); # return bool
[RabbitMQ][队列消费] Tag:process.workbunny.rabbitmq.RestyBuilder
[RabbitMQ][队列消费着] Content:开源技术小栈你好呀!
[RabbitMQ][队列消费着] Exchange:process.workbunny.rabbitmq.RestyBuilder
...
[RabbitMQ][队列消费] Tag:process.workbunny.rabbitmq.RestyBuilder
[RabbitMQ][队列消费着] Content:兔子大佬你好呀!
[RabbitMQ][队列消费着] Exchange:process.workbunny.rabbitmq.RestyBuilder
通过RabbitMQ管理界面端发送消息
消费者消费情况