Rabbitmq
简介:
1.Server(broker)
: 接受客户端连接,实现AMQP消息队列和路由功能的进程。
2.Virtual Host
:其实是一个虚拟概念,类似于权限控制组,一个Virtual Host里面可以有若干个Exchange
和Queue
,但是权限控制的最小粒度是Virtual Host
3.Exchange:接受生产者发送的消息,并根据Binding规则将消息路由给服务器中的队列。ExchangeType决定了Exchange路由消息的行为,例如,在RabbitMQ中,ExchangeType有header、direct、Fanout和Topic 4种,不同类型的Exchange路由的行为是不一样的。
4.Message Queue
:消息队列,用于存储还未被消费者消费的消息。(支持储存模式AMQP_DURABLE
,AMQP_PASSIVE
,AMQP_EXCLUSIVE
,AMQP_AUTODELETE
)
5.Message: 由Header和Body组成,Header是由生产者添加的各种属性的集合,包括Message是否被持久化、由哪个Message Queue接受、优先级是多少等。而Body是真正需要传输的APP数据。
6.Binding:Binding联系了Exchange与Message Queue。Exchange在与多个Message Queue发生Binding后会生成一张路由表,路由表中存储着Message Queue所需消息的限制条件即Binding Key。当Exchange收到Message时会解析其Header得到Routing Key,Exchange根据Routing Key与Exchange Type将Message路由到Message Queue。Binding Key由Consumer在Binding Exchange与Message Queue时指定,而Routing Key由Producer发送Message时指定,两者的匹配方式由Exchange Type决定。
7.Connection:连接,对于RabbitMQ而言,其实就是一个位于客户端和Broker之间的TCP连接。
8.Channel:信道,仅仅创建了客户端到Broker之间的连接后,客户端还是不能发送消息的。需要为每一个Connection创建Channel,AMQP协议规定只有通过Channel才能执行AMQP的命令。一个Connection可以包含多个Channel。之所以需要Channel,是因为TCP连接的建立和释放都是十分昂贵的,如果一个客户端每一个线程都需要与Broker交互,如果每一个线程都建立一个TCP连接,暂且不考虑TCP连接是否浪费,就算操作系统也无法承受每秒建立如此多的TCP连接。RabbitMQ建议客户端线程之间不要共用Channel,至少要保证共用Channel的线程发送消息必须是串行的,但是建议尽量共用Connection。
9.Command:AMQP的命令,客户端通过Command完成与AMQP服务器的交互来实现自身的逻辑。例如在RabbitMQ中,客户端可以通过publish命令发送消息,txSelect开启一个事务,txCommit提交一个事务。
安装Erlang
服务器版本:centos7.2
IP地址:192.168.153.130
官方安装地址:Rabbitmq官方介绍地址
因为rabbitMQ是Erlang
语言编写的,所以我们首先需要安装Erlang
rpm -Uvh http://www.rabbitmq.com/releases/erlang/erlang-18.1-1.el7.centos.x86_64.rpm
或者
yum install erlang
安装rabbitMQ-server服务端并开启服务
官网提供的安装方式:
rpm --import https://www.rabbitmq.com/rabbitmq-signing-key-public.asc
yum install rabbitmq-server-3.7.8-1.el7.noarch.rpm
或者
yum install rabbitmq-server 一直输入Y即可
查看rabbitmq-server是否已经安装好了,能查到说明已经安装完成了。
rpm -qa|grep rabbitmq
[root@test ~]# rpm -qa|grep rabbitmq
rabbitmq-server-3.3.5-34.el7.noarch
[root@test ~]#
开启rabbit-server: systemctl start rabbitmq-server
查看状态:rabbitmqctl status
注意:这样虽然我们已经将rabbitmq的服务正常启动了,但是我们在物理机的浏览器中输入192.168.153.130:15672时,并不能连接,因为我们还没有配置维护插件和开启远程连接。
rabbitmqctl 基础命令介绍
查看命令:#rabbitmqctl [root@test ~]# rabbitmqctl
# rabbitmqctl list_queues
关闭应用
# rabbitmqctl stop_app
启动应用,和上述关闭命令配合使用,达到清空队列的目的
# rabbitmqctl start_app
清除所有队列
# rabbitmqctl reset
更多用法及参数,可以执行如下命令查看
# rabbitmqctl
(1)首先关闭rabbitmq: rabbitmqctl stop_app
(2)还原: rabbitmqctl reset
(3)启动: rabbitmqctl start_app
(4)添加用户: rabbitmqctl add_user root root
(5)设置权限:rabbitmqctl set_permissions -p / root ".*" ".*" ".*"
(6)查看用户: rabbitmqctl list_users
(7)删除用户:rabbitmqctl delete_user root
(8)修改密码:rabbitmqctl change_password root 123456
(9)清除密码:rabbitmqctl clear_password root
安装命令维护插件
执行此命令:rabbitmq-plugins enable rabbitmq_management
设置配置文件,并开启用户远程访问:
新建配置文件 /etc 会默认生成一个 rabbitmq 安装后rabbitmq默认命令在/usr/lib/rabbitmq/bin
vi /etc/rabbitmq/rabbitmq.conf
#默认用户名
default_user = guest
#默认密码
default_pass = guest
#远程用户访问
loopback_users = none
然后重启rabbitmq:
开启浏览器web端访问
浏览器输入:192.168.153.130:15672
默认端口是15672
默认账号密码:
账号:guest
密码:guest
登录成功以后,显示界面
PHP安装rabbitmq扩展需要安装rabbitmq-c
1.安装rabbitmq-c
在安装amqp之前还需要安装另外一个通讯扩展rabbitmq-c。
去github下载最新版本的源码包并解压缩,https://github.com/alanxz/rabbitmq-c/releases
最新版本链接:点击下载,https://github.com/alanxz/rabbitmq-c/releases/download/v0.8.0/rabbitmq-c-0.8.0.tar.gz
2.下载解压编译:
[root@test~]#wget -c https://github.com/alanxz/rabbitmq-c/releases/download/v0.8.0/rabbitmq-c-0.8.0.tar.gz
[root@test ~]# tar -zxvf rabbitmq-c-0.8.0.tar.gz
rabbitmq-c-0.8.0/
rabbitmq-c-0.8.0/config.h.in
rabbitmq-c-0.8.0/depcomp
rabbitmq-c-0.8.0/librabbitmq/
rabbitmq-c-0.8.0/librabbitmq/amqp_openssl_hostname_validation.c
rabbitmq-c-0.8.0/librabbitmq/amqp_ssl_socket.h
rabbitmq-c-0.8.0/librabbitmq/amqp_hostcheck.h
rabbitmq-c-0.8.0/librabbitmq/amqp_tcp_socket.c
rabbitmq-c-0.8.0/librabbitmq/amqp_tcp_socket.h
rabbitmq-c-0.8.0/librabbitmq/amqp_framing.h
rabbitmq-c-0.8.0/librabbitmq/amqp_openssl.c
rabbitmq-c-0.8.0/librabbitmq/amqp_openssl_hostname_validation.h
rabbitmq-c-0.8.0/librabbitmq/amqp_connection.c
[root@test rabbitmq-c-0.8.0]# ./configure --prefix=/usr/local/rabbitmq-c-0.8.0
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking whether make supports nested variables... (cached) yes
checking for style of include used by make... GNU
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
3.Make&&make install 编译安装出错,以下为报错信息
[root@test rabbitmq-c-0.8.0]# make && make install
cd . && /bin/sh /root/rabbitmq-c-0.8.0/missing automake-1.14 --foreign
/root/rabbitmq-c-0.8.0/missing: line 81: automake-1.14: command not found
WARNING: 'automake-1.14' is missing on your system.
You should only need it if you modified 'Makefile.am' or
'configure.ac' or m4 files included by 'configure.ac'.
The 'automake' program is part of the GNU Automake package:
It also requires GNU Autoconf, GNU m4 and Perl in order to run:
make: *** [Makefile.in] Error 1
如果遇到上面编译出错的问题则,需要先执行 autoreconf -ivf
然后 make && make install就成功啦 !
安装PHP扩展amqp
下载地址:PHP的mq扩展amqp
tar zxf amqp-1.9.3.tgz
cd amqp-1.9.3
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-amqp --with-librabbitmq-dir=/usr/local/rabbitmq-c-0.8.0
make && make installl
[root@test ~]# wget -c http://pecl.php.net/get/amqp-1.9.3.tgz
[root@test ~]# tar zxf amqp-1.9.3.tgz
[root@test amqp-1.9.3]# /usr/bin/phpize (或者/usr/local/php/bin/phpize 可以whereis phpize查看)
[root@test amqp-1.9.3]# ./configure --with-php-config=/usr/bin/php-config --with-amqp --with-librabbitmq-dir=/usr/local/rabbitmq-c-0.8.0
[root@test amqp-1.9.3]# make && make install
配置amqp扩展
vi /usr/local/php/etc/php.ini
添加 extension=amqp.so
查看是否已经安装好amqp扩展
[root@test amqp-1.9.3]# php -m
[PHP Modules]
amqp
关于rabbitmq的原理图说明
几个概念说明:
Broker:简单来说就是消息队列服务器实体。
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
Queue:消息队列载体,每个消息都会被投入到一个或多个队列。
Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
Producer:消息生产者,就是投递消息的程序。
Consumer:消息消费者,就是接受消息的程序。
Channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。
消息队列的使用过程:
1、客户端连接到消息队列服务器,打开一个channel。
2、客户端声明一个exchange,并设置相关属性。
3、客户端声明一个queue,并设置相关属性。
4、客户端使用routing key,在exchange和queue之间建立好绑定关系。
5、客户端投递消息到exchange。
6、exchange接收到消息后,就根据消息的key和已经设由binding,进行消息路里,将消息投递到一个或多个队列里
ps:通过durable参数来进行exchang、queue、消息持久化