Mac安装
1 安装
mac安装我们采用快速的brew的安装方式
参考:http://www.rabbitmq.com/download.html
- 安装之前现更新homebrew
brew update # 我这里就不处理了
- 然后安装RabbitMQ server
brew install rabbitmq
- 安装过程及提示
Updating Homebrew...
==> Downloading https://github.com/rabbitmq/rabbitmq-server/releases/download/v3
==> Downloading from https://github-production-release-asset-2e65be.s3.amazonaws
######################################################################## 100.0%
==> /usr/bin/unzip -qq -j /usr/local/Cellar/rabbitmq/3.8.3/plugins/rabbitmq_mana
==> Caveats
Management Plugin enabled by default at http://localhost:15672
Bash completion has been installed to:
/usr/local/etc/bash_completion.d
To have launchd start rabbitmq now and restart at login:
brew services start rabbitmq
Or, if you don't want/need a background service you can just run:
rabbitmq-server
==> Summary
/usr/local/Cellar/rabbitmq/3.8.3: 281 files, 20.4MB, built in 6 seconds
这里已经明确的说明了
后台运行命令:brew services start rabbitmq
前台启动命令:rabbitmq-server
2 使用
RabbitMQ服务的脚本和CLI工具安装在/usr/local/sbin目录下,该目录不在环境变量中,因此需要先把该目录添加到环境变量中,才能使用rabbitmq-server命令。
临时添加
export PATH=/usr/local/sbin:${PATH}
永久添加
Mac中可以通过修改以下几个文件来添加环境变量(按加载顺序排列):
/etc/profile /etc/paths ~/.bash_profile ~/.bash_login ~/.profile ~/.bashrc
在此,我们修改~/.bash_profile文件。
首先,打开文件:vi ~/.bash_profile
然后在文件末尾添加:export PATH=/usr/local/sbin:${PATH}
启动RabbitMQ
Linux->Centos下yum安装
参考:
https://www.cnblogs.com/gne-hwz/p/10714321.html
https://www.cnblogs.com/yang-hao/p/11737646.html
yum install rabbitmq-server
Linux安装
好吧,这段话献给自己。采坑可怕,一台主机上配置服务,另外一台主机上面做验证那就坑B了。
参考文章:https://blog.csdn.net/qq_42238331/article/details/106427856
- 查看你要安装的rabbitmq版本和对应的erlang版本
进入官网查看要安装的版本
https://www.rabbitmq.com/which-erlang.html
我这里选择最高的版本3.8.5 -
开始查找和下载对应的文件
因为RabbitMq的运行依赖erlang,所以还需要下载erlang
下载链接 https://www.rabbitmq.com/install-rpm.html
- 安装
-
安装erlang
rpm -ivh erlang-22.3-1.el7.x86_64.rpm
-
安装socat
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum -y install socat
-
安装RabbotMQ
rpm -ivh rabbitmq-server-3.8.4-1.el7.noarch.rpm
-
安装web界面插件
rabbitmq-plugins enable rabbitmq_management
-
启动
systemctl start rabbitmq-server
-
添加用户
rabbitmqctl add_user admin adminadmin123
赋予用户administrator角色
rabbitmqctl set_user_tags admin administrator
授权远程访问
rabbitmqctl set_permissions -p / admin "." "." ".*"
防火墙配置
# 开启 service firewalld start
# 重启 service firewalld restart
# 关闭 service firewalld stop
开放端口
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --zone=public --add-port=5672/tcp --permanent
重启防火墙
firewall-cmd --reload
查看已开放端口
firewall-cmd --list-ports
-
浏览器访问
ip:15672/
使用前面设置的用户名密码 admin adminadmin123 进行登录
相关命令:
- 运行命令
后台运行:brew services start rabbitmq
停止后台运行:brew services stop rabbitmq
前台启动命令:rabbitmq-server
查看状态:rabbitmqctl status
停止前台启动:rabbitmqctl stop - 用户管理命令
查看所有用户:rabbitmqctl list_users
添加一个用户:rabbitmqctl add_user zhaobl 123456
配置权限:rabbitmqctl set_permissions -p "/" zhaobl "." "." ".*"
查看用户权限:rabbitmqctl list_user_permissions zhaobl
设置tag:rabbitmqctl set_user_tags zhaobl administrator
删除用户(安全起见,删除默认用户):rabbitmqctl delete_user guest
PHP扩展安装
Mac版本PHP扩展
-
安装rabbitmq-c
php中的rabbitmq 扩展是amqp ,而amqp依赖于rabbitmq-c ,首先需要安装rabbitmq-c
安装成功后,我们可以再/usr/local/Cellar下看到rabbitmq-c
image.png -
安装amqp
使用pecl 安装amqp,直至出现Set the path to librabbitmq install prefix [autodetect] ,这里我们将rabbitmq-c的路径复制过去,然后回车(我这里路径为/usr/local/Cellar/rabbitmq-c/0.9.0=>看上一张截图后面就有安装位置)
添加扩展到php.ini
amqp安装成功后,一般会把安装amqp.so安装位置(查看执行结果中有一行:Installing '/usr/local/Cellar/php/**********/amqp.so')打印出来给你。我们打开php.ini配置文件(找不到可以执行命令php -i | grep php.ini来找,也可以find / -name php.ini查找),加上extension=amqp.so(这里个人建议还是全路径吧,前面的安装位置/usr/local/Cellar/php/**********/amqp.so拿过来用就是了)文件。
执行命令:php -m | grep amqp 就能找到结果,证明已经安装好了。
Centos版本PHP扩展
- 安装rabbitmq-c
在安装amqp之前还需要安装另外一个通讯扩展rabbitmq-c。
去github下载最新版本(目前是0.10.0)的源码包并解压缩。
cd rabbitmq-c-0.10.0/
mkdir build && cd build #这一步是在rabbitmq-c的根目录下创建一个build子目录
# 这一步是让cmake根据../CMakeList.txt,即rabbitmq-c的根目录下的CMakeList.txt创建Makefile文件
# Makefile文件会被创建到build目录中
# 注意,不要漏后面的'..'
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/rabbitmq-c ..
# 这一步是真正的build rabbitmq-c库的,注意,不要漏掉点 '.'
cmake --build . --target install
到这里就已经安装完成了。不过这里有一个坑。你可以看一下/usr/local/rabbitmq-c下的目录只有include和lib64。因为后面编译安装amqp扩展的时候系统会到/usr/local/rabbitmq-c/lib目录下搜索依赖库,导致错误。所以这里需要加一步:
在/usr/local/rabbitmq-c/目录下
ln -s lib64 lib
- 安装amqp
# 从pecl官方库中下载最新的amqp扩展包
# 官网地址:https://pecl.php.net/package/amqp
# 我下的是最新版本
wget https://pecl.php.net/get/amqp-1.10.2.tgz
# 解压并编译安装
cd amqp-1.10.2
phpize
# 这里需要配置 with-php-config 如果不知道自己的php安装位置,可以执行查找命令 find / -name php-config 来查找。
# --with-librabbitmq-dir 就是前面步骤1执行的rabbitmq-c的安装目录
./configure --with-php-config=/usr/local/php/bin/php-config --with-amqp --with-librabbitmq-dir=/usr/local/rabbitmq-c
make && make install
- 添加扩展到php.ini
amqp安装成功后,一般会把安装amqp.so安装位置(查看执行结果中有一行:Installing '/usr/local/*********/amqp.so')打印出来给你。我们打开php.ini配置文件(找不到可以执行命令php -i | grep php.ini来找,也可以find / -name php.ini查找),加上extension=amqp.so(这里个人建议还是全路径吧,前面的安装位置/usr/local/Cellar/php/**********/amqp.so拿过来用就是了)文件。
执行命令:php -m | grep amqp 就能找到结果,证明已经安装好了。
测试PHP的Amqp
-
查看基本情况
- 消费者调试
消费者代码consume.php
'127.0.0.1',
'vhost' => '/',
'port' => 5672,
'login' => 'guest',
'password' => 'guest'
);
//连接broker
$cnn = new AMQPConnection($config);
if (!$cnn->connect()) {
echo "Cannot connect to the broker";
exit();
}
//在连接内创建一个通道
$ch = new AMQPChannel($cnn);
//创建一个交换机
$ex = new AMQPExchange($ch);
//声明路由键
$routingKey = 'key_1';
//声明交换机名称
$exchangeName = 'exchange_1';
//设置交换机名称
$ex->setName($exchangeName);
//设置交换机类型
//AMQP_EX_TYPE_DIRECT:直连交换机
//AMQP_EX_TYPE_FANOUT:扇形交换机
//AMQP_EX_TYPE_HEADERS:头交换机
//AMQP_EX_TYPE_TOPIC:主题交换机
$ex->setType(AMQP_EX_TYPE_DIRECT);
//设置交换机持久
$ex->setFlags(AMQP_DURABLE);
//声明交换机
$ex->declareExchange();
//创建一个消息队列
$q = new AMQPQueue($ch);
//设置队列名称
$q->setName('queue_1');
//设置队列持久
$q->setFlags(AMQP_DURABLE);
//声明消息队列
$q->declareQueue();
//交换机和队列通过$routingKey进行绑定
$q->bind($ex->getName(), $routingKey);
//接收消息并进行处理的回调方法
function receive($envelope, $queue) {
//休眠两秒,
sleep(2);
//echo消息内容
echo $envelope->getBody()."\n";
//显式确认,队列收到消费者显式确认后,会删除该消息
$queue->ack($envelope->getDeliveryTag());
}
//设置消息队列消费者回调方法,并进行阻塞
$q->consume("receive");
//$q->consume("receive", AMQP_AUTOACK);//隐式确认,不推荐
以上是消费者代码,打开两个命令行/终端
此时再看RabbitMQ管理界面:
Connections
- 生产者调试
生产者代码publisher.php
'127.0.0.1',
'vhost' => '/',
'port' => 5672,
'login' => 'guest',
'password' => 'guest'
);
$cnn = new AMQPConnection($config);
if (!$cnn->connect()) {
echo "Cannot connect to the broker";
exit();
}
$ch = new AMQPChannel($cnn);
$ex = new AMQPExchange($ch);
//消息的路由键,一定要和消费者端一致
$routingKey = 'key_1';
//交换机名称,一定要和消费者端一致,
$exchangeName = 'exchange_1';
$ex->setName($exchangeName);
$ex->setType(AMQP_EX_TYPE_DIRECT);
$ex->setFlags(AMQP_DURABLE);
$ex->declareExchange();
//创建10个消息
for ($i=1;$i<=10;$i++){
sleep(1);//便于区分
//消息内容
$msg = array(
'data' => 'message_'.$i."_".date('Y-m-d H:i:s'),//便于监控
'hello' => 'world',
);
//发送消息到交换机,并返回发送结果
//delivery_mode:2声明消息持久,持久的队列+持久的消息在RabbitMQ重启后才不会丢失
echo "Send Message:".$ex->publish(json_encode($msg), $routingKey, AMQP_NOPARAM, array('delivery_mode' => 2))."\n";
//代码执行完毕后进程会自动退出
}
在执行之前,先关掉前面的两个消费者,打开一个命令行/终端,输入php publisher.php,由于生产者不需要阻塞,执行完进程便退出,所以现在RabbitMQ管理界面中既没有Connections也没有Channels,但是Queues已经被Exchanges投递过去了10条消息
因为我们执行生产者之前已经关掉了全部消费者,所以此时消息在队列中等待获取;
因为在发送消息时设置了delivery_mode:2来声明消息持久化,此时如果重启RabbitMQ,消息还会恢复;此时重新执行消费者,假设还是两个,打开两个命令行/终端,输入php consumer.php,我们可以看到消息被消费,如下图:
提醒:生产者在生产消息时,如果不存在指定队列,并且没有创建队列,或者队列存在但消息路由键和交换机与队列绑定的键(路由规则)不一致(直连交换机必须一致),则消息会被交换机丢弃。