docker 安装rabbitmq并配置hyperf使用

这里我想完成的是
制作消息(多个协程制造)——》推送到rabbitmq——》订阅消息队列——》消费消息(ws协程客户端【一次消费多条】/ws前端)
利用 WebSocket 协议让客户端和服务器端保持有状态的长链接,保存链接上来的客户端 id。订阅发布者发布的消息针对已保存的客户端 id 进行广播消息。

一,安装rabbitmq

  • pull镜像
docker search rabbitmq
docker pull rabbitmq
  • 构建rabbitmq容器并加入hyperf环境组网
    这里我们构建容器的的就将他加入到了hyperf环境的网络lnmp_default(使用docker inspect hyperf 查看)
docker run -d --network=lnmp_default --hostname my-rabbit --name rabbit -p 15672:15672 -p 5673:5672 rabbitmq
-d 后台运行容器;--name 指定容器名;-p 指定服务运行的端口(5672:应用访问端口;15672:控制台Web端口号);-v 映射目录或文件;--network 网络名称--hostname  主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名);-e 指定环境变量;(RABBITMQ_DEFAULT_VHOST:默认虚拟机名;RABBITMQ_DEFAULT_USER:默认的用户名;RABBITMQ_DEFAULT_PASS:默认用户名的密码)
  • 进入容器并运行
docker exec -it rabbit /bin/bash
rabbitmq-plugins enable rabbitmq_management

这里须要修改配置文件,不然有的地方会报错 docker rabbitmq Management API returned status code 500

cd /etc/rabbitmq/conf.d/
echo management_agent.disable_metrics_collector = false > management_agent.disable_metrics_collector.conf

用户名和密码 guest
在这里插入图片描述

二,rabbitmq配置

生成配置文件 php bin/hyperf.php vendor:publish hyperf/amqp
并修改配置文件,这里的AMQP_HOST 就是lnmp_default 网络组中 rabbitmq的ip地址,可使用docker inspect rabbit 查看,端口即为容器内部映射ip这里默认是5672

三,测试代码

php bin/hyperf.php gen:amqp-producer DemoProducer
  • 生产者
<?phpdeclare(strict_types=1);namespace App\Amqp\Producer;use Hyperf\Amqp\Annotation\Producer;
use Hyperf\Amqp\Message\ProducerMessage;
use function Hyperf\Coroutine\co;//routingKey是指定路由到哪里,可以决定到哪个队列。队列通过路由键绑定到交换器
#[Producer(exchange: 'hyperf', routingKey: 'hyperf-queue.sj')]
//生产者方指定了exchange(交换机)和routing key,但是不指定queue(队列)也不将queue(队列)绑定到exchange,
//队列声明和绑定队列到exchange的工作由消费者方完成
//费者在消费消息时,需要声明队列(队列名字随便),并将声明的队列通过routing key绑定到exchange,这样才能接收到数据
class DemoProducer extends ProducerMessage
{public function __construct($id){$pdata['id']=$id;$pdata['time']=date("Y-m-d H:i:s",time());$pdata['name']=array_rand(['张三','李四','王虎','陆风','牛犇','冯晨','丁酉','郑和']);;$pdata['say']=bin2hex(random_bytes(10));$pdata['score']=array_rand(['61','80','75','77','99','88','97','81']);$this->payload = $pdata;}
}
  • 消费者
<?phpdeclare(strict_types=1);namespace App\Amqp\Consumer;use Hyperf\Amqp\Result;
use Hyperf\Amqp\Annotation\Consumer;
use Hyperf\Amqp\Message\ConsumerMessage;
use PhpAmqpLib\Message\AMQPMessage;#[Consumer(exchange: 'hyperf', routingKey: 'hyperf-queue.sj', queue: 'hyperf', name: "DemoConsumer", nums: 1)]
class DemoConsumer extends ConsumerMessage
{public function consumeMessage($data, AMQPMessage $message): Result{print_r($data);return Result::ACK;}
}
  • 控制器
 public function productMessage(){try {//这里使用协程创建100条消息$wg = new \Hyperf\Coroutine\WaitGroup();$wg->add(100);for($i=0;$i<100;$i++){//创建协程co(function () use ($wg){$message=new DemoProducer(1);//获取一个生产者实例$producer = ApplicationContext::getContainer()->get(Producer::class);//传递消息$producer->produce($message);$wg->done();});}$wg->wait();} catch (\Exception $exception) {throw new \Swoole\Exception($exception->getMessage());}return ['info' => "100条消息创建成功",];}

在这里插入图片描述

保存后重启服务 php hyperf.php start ,定义的消费者会自动消费,详见文档。

在这里插入图片描述
ps:这里有个小问题时间不对。这里实际上在composer hyperf的时候第一步就是可以设置时区Asia/Shanghai
都是我没设置,现在可以偷个懒在入口文件添加 date_default_timezone_set(‘Asia/Shanghai’); 即可。(或修改php.ini)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/513858.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

06 - 镜像管理

1 了解镜像 Docker镜像是一个特殊的文件系统&#xff0c;除了提供容器运行时所需的程序、库、资源、配置等文件外&#xff0c;还包含了一些为运行时准备的一些配置参数&#xff08;如匿名卷、环境变量、用户等&#xff09;。 但注意&#xff0c; 镜像不包含任何动态数据&#…

【Mining Data】收集数据(使用 Python 挖掘 Twitter 数据)

@[TOC](【Mining Data】收集数据(使用 Python 挖掘 Twitter 数据)) 具体步骤 第一步是注册您的应用程序。特别是,您需要将浏览器指向 http://apps.twitter.com,登录 Twitter(如果您尚未登录)并注册新应用程序。您现在可以为您的应用程序选择名称和描述(例如“Mining Demo”…

政安晨【TypeScript高级用法】(四):模块与声明文件

TypeScript是一种静态类型的JavaScript超集语言&#xff0c;它支持模块化开发和声明文件。 模块化开发是一种将代码分割为独立的模块&#xff0c;每个模块只关注自己的功能&#xff0c;然后通过导入和导出来实现模块之间的交互和复用。在TypeScript中&#xff0c;可以使用impo…

设置video的进度条常显

根据网上的方法&#xff0c;把隐藏的元素显示 在chrome中F12或者通过其他方式打开开发者工具&#xff08;相信应该知道从哪里打开&#xff09;&#xff0c;然后点击右上的齿轮&#xff0c;进入设置&#xff0c;勾选Show user agent shadow DOM 就能在elements里面查看视频的播…

【Leetcode】1588.所有奇数长度子数组的和

题目描述 思路 题目要求我们求解所有奇数长度数组的和。若暴力循环求解&#xff0c;时间复杂度过高。所以&#xff0c;我们可以采用前缀和优化。 如上图输入arr数组&#xff0c;sum[i]用于计算arr数组中前i个数的和。(在程序中&#xff0c;先给sum[0]赋值&#xff0c;等于arr[0…

libigl 极小曲面(全局优化)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 二、实现代码 #include <igl/colon.h> #include <igl/harmonic.h>

第三百八十三回

文章目录 1. 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了ModalBarrier组件相关的内容&#xff0c;本章回中将介绍Visibility组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中介绍的Visibility组件是一种容器类组件&#xff0c;主要…

使用 llama.cpp 在本地部署 AI 大模型的一次尝试

对于刚刚落下帷幕的2023年,人们曾经给予其高度评价——AIGC元年。随着 ChatGPT 的火爆出圈,大语言模型、AI 生成内容、多模态、提示词、量化…等等名词开始相继频频出现在人们的视野当中,而在这场足以引发第四次工业革命的技术浪潮里,人们对于人工智能的态度,正从一开始的…

【Flutter 】get-cli init报错处理

报错内容 get init 命令跳出,报错内如下 Select which type of project you want to creat Synchronous waiting using dart:cli waitFor Unhandled exceotion . Dart WaitforEvent is deprecated and disabled by default. This feature will be fully removed in Dart 3.4 …

seata服务器集群搭建

搭建seata-server-1.3服务器对应SpringBoot2.3.12&#xff0c;springcloud2.2.3 <spring-cloud-alibaba.version>2.2.3.RELEASE</spring-cloud-alibaba.version> 首先你安装了nacos 1解压文件 2修改cong/file.conf 让seata集群信息可以共享&#xff0c;我们应该…

Vue.js+SpringBoot开发高校学院网站

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学院院系模块2.2 竞赛报名模块2.3 教育教学模块2.4 招生就业模块2.5 实时信息模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 学院院系表3.2.2 竞赛报名表3.2.3 教育教学表3.2.4 招生就业表3.2.5 实时信息表 四、系…

JAVA中YML:几个用法

项目有一些配置文件&#xff0c;ini、prop类型的配置文件都考虑过后&#xff0c;还是选择yml文件&#xff0c;如上图&#xff1a;xxconfig.yml。 要求&#xff1a; 1、允许实施人员手动配置 2、配置文件要能轻便的转化为一个JAVA对象 3、程序启动后&#xff0c;打印这些配置项&…