rabbitmq安装Linux和Mac版本

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

  1. 查看你要安装的rabbitmq版本和对应的erlang版本
    进入官网查看要安装的版本
    https://www.rabbitmq.com/which-erlang.html
    image.png

    我这里选择最高的版本3.8.5
  2. 开始查找和下载对应的文件


    image.png

    image.png

    image.png

    image.png

    image.png

因为RabbitMq的运行依赖erlang,所以还需要下载erlang
下载链接 https://www.rabbitmq.com/install-rpm.html

image.png

image.png
  1. 安装
  • 安装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/


    image.png

    使用前面设置的用户名密码 admin adminadmin123 进行登录


    image.png

相关命令:

  • 运行命令
    后台运行: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扩展

  1. 安装rabbitmq-c
    php中的rabbitmq 扩展是amqp ,而amqp依赖于rabbitmq-c ,首先需要安装rabbitmq-c
    安装成功后,我们可以再/usr/local/Cellar下看到rabbitmq-c


    image.png
  2. 安装amqp
    使用pecl 安装amqp,直至出现Set the path to librabbitmq install prefix [autodetect] ,这里我们将rabbitmq-c的路径复制过去,然后回车(我这里路径为/usr/local/Cellar/rabbitmq-c/0.9.0=>看上一张截图后面就有安装位置)


    image.png
  3. 添加扩展到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扩展

  1. 安装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
  1. 安装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
  1. 添加扩展到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

  1. 查看基本情况


    还没有任何连接(Connections)

    还没有任何通道(Channels)

    交换机只有系统默认的

    还没有任何队列
  1. 消费者调试

消费者代码consume.php

<?php

//声明连接参数
$config = array(
    'host' => '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);//隐式确认,不推荐

以上是消费者代码,打开两个命令行/终端

image.png

此时再看RabbitMQ管理界面:
Connections


出现两个连接,这两个就是消费者,因为他们在阻塞着等待消息

消费者在各自的连接里都打开了一个通道

其中一个消费者创建了一个持久的直连交换机

消息队列已经创建,但消息数是0,因为此时还没有生产者
  1. 生产者调试
    生产者代码publisher.php
<?php
// 生产者
$config = array(
    'host' => '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条消息


image.png

image.png

因为我们执行生产者之前已经关掉了全部消费者,所以此时消息在队列中等待获取;
因为在发送消息时设置了delivery_mode:2来声明消息持久化,此时如果重启RabbitMQ,消息还会恢复;此时重新执行消费者,假设还是两个,打开两个命令行/终端,输入php consumer.php,我们可以看到消息被消费,如下图:


image.png

提醒:生产者在生产消息时,如果不存在指定队列,并且没有创建队列,或者队列存在但消息路由键和交换机与队列绑定的键(路由规则)不一致(直连交换机必须一致),则消息会被交换机丢弃。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270