docker + hyperf + rabbitmq打造高性能高并发高可用的服务架构
创建hyperf
docker run --name hyperf \
-v /www/wwwroot/project:/data/project \
-p 9501:9501 -it \
--privileged -u root \
--entrypoint /bin/sh \
hyperf/hyperf:7.4-alpine-v3.11-swoole
查看容器
docker ps -a
启动容器
docker start 容器id
进入容器
docker exec -it 容器id /bin/bash
设置阿里云镜像
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer
创建项目
cd data/project/
composer create-project hyperf/hyperf-skeleton
启动项目
cd hyperf-skeleton
php bin/hyperf.php start
访问
[root@iZvixj0oze6411Z webman]# curl 127.0.0.1:9501
{"method":"GET","message":"Hello Hyperf."}
创建rabbitmq
拉取rabbitmq镜像
[root@iZvixj0oze6411Z ~]# docker pull rabbitmq:3.9-management
3.9-management: Pulling from library/rabbitmq
eaead16dc43b: Pull complete
d5e775568c00: Pull complete
de99a1ffedd3: Pull complete
32e52a38037e: Pull complete
5ed4b54cb161: Pull complete
32bea722cea4: Pull complete
d547a307a70f: Pull complete
e29573589782: Pull complete
1e7b56521e24: Pull complete
95bcf5c80f3f: Pull complete
Digest: sha256:a40aee9f0eaebd910883d5b3d2fe26ee3a04e8e66a37032175167cb0ac58feb2
Status: Downloaded newer image for rabbitmq:3.9-management
docker.io/library/rabbitmq:3.9-management
查看镜像
[root@iZvixj0oze6411Z ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rabbitmq 3.9-management dd952ebca9a2 2 weeks ago 262MB
创建容器
[root@iZvixj0oze6411Z ~]# docker run -d --name MyRabbitMq -p 15672:15672 -p 5672:5672 rabbitmq:3.9-management
fcfc4cc56a733e6d4b580b7cebd354cb074864d739699673a201a1d5bdd9fabc
访问
http://ip:15672/
账号guest
密码guest
配置hyperf容器连接rabbitmq服务
进入容器
[root@iZvixj0oze6411Z ~]# docker attach c30542df1122
/ #
AMQP 组件
安装
composer require hyperf/amqp
命令行
composer require hyperf/command
创建 rabbitmq 配置文件
添加一个用户amqptest,密码为123456
点击添加权限
点击set permission后返回即可
<?php
return [
'default' => [
// 'host' => 'localhost',
'host' => '47.113.xxx.xx', //用的容器需要用到宿主机的ip地址
'port' => 5672,
'user' => 'amqptest', //rabbitmq 设置
'password' => '123456',//rabbitmq 设置
'vhost' => '/',//rabbitmq 设置
'concurrent' => [
'limit' => 1,
],
'pool' => [
'connections' => 1,
],
'params' => [
'insist' => false,
'login_method' => 'AMQPLAIN',
'login_response' => null,
'locale' => 'en_US',
'connection_timeout' => 3.0,
'read_write_timeout' => 6.0,
'context' => null,
'keepalive' => false,
'heartbeat' => 3,
'close_on_destruct' => false,
],
],
// 'pool2' => [
// ...
// ]
];
创建一个生产者
/data/project/hyperf-skeleton # php bin/hyperf.php gen:amqp-producer DemoProducer
添加一个hyperf交换机
'vhost' => '/'
对应 Can access virtual hosts
添加一个测试队列
交换机绑定队列
队列绑定交换机
一定要相互绑定,不然写不入队列数据
生成命令
/data/project/hyperf-skeleton # php bin/hyperf.php gen:command FooCommand
<?php
declare(strict_types=1);
namespace App\Command;
use App\Amqp\Producer\DemoProducer;
use Hyperf\Amqp\Producer;
use Hyperf\Command\Command as HyperfCommand;
use Hyperf\Command\Annotation\Command;
use Hyperf\Utils\ApplicationContext;
use Psr\Container\ContainerInterface;
/**
* @Command
*/
#[Command]
class FooCommand extends HyperfCommand
{
/**
* @var ContainerInterface
*/
protected $container;
public function __construct(ContainerInterface $container)
{
$this->container = $container;
parent::__construct('demo:command');
}
public function configure()
{
parent::configure();
$this->setDescription('Hyperf Demo Command');
}
public function handle()
{
$wg = new \Hyperf\Utils\WaitGroup();
$wg->add(1000); //1000并发
try {
for ($i = 0; $i < 1000; $i++) {
var_dump('执行:' . $i);
co(function () use ($wg) {
$message = new DemoProducer(['title' => '1000并发生产者']);
$producer = ApplicationContext::getContainer()->get(Producer::class);
$producer->produce($message);
$wg->done();
});
}
} catch (\Exception $exception) {
var_dump($exception->getMessage());
}
var_dump('执行完成1');
$wg->wait();
var_dump('执行完成2');
}
}
引入类
Alt + Enter
执行命令
/data/project/hyperf-skeleton # php bin/hyperf.php demo:command
[DEBUG] Event Hyperf\Framework\Event\BootApplication handled by Hyperf\Config\Listener\RegisterPropertyHandlerListener listener.
[DEBUG] Event Hyperf\Framework\Event\BootApplication handled by Hyperf\ExceptionHandler\Listener\ExceptionHandlerListener listener.
[DEBUG] Event Hyperf\Framework\Event\BootApplication handled by Hyperf\DbConnection\Listener\RegisterConnectionResolverListener listener.
如果不行,重新相互绑定,不然写不入队列数据
进入队列查看3条数据
消费者
php bin/hyperf.php gen:amqp-consumer DemoConsumer
消费(启动就可以消费)
php bin/hyperf.php start
参考视频
Docker+HyperF+RabbitMq打造高性能高并发高可用的服务架构
本作品采用《CC 协议》,转载必须注明作者和本文链接
以梦