1 RabbitMQ介绍
1.1 简介
RabbitMQ是流行的开源消息队列系统,是AMQP(Advanced Message Queuing Protocol高级消息队列协议)的标准实现,用erlang语言开发。RabbitMQ据说具有良好的性能和时效性,同时还能够非常好的支持集群和负载部署,非常适合在较大规模的分布式系统中使用。
1.2 原理图
工作原理深入理解参考地址:
https://www.cnblogs.com/dwlsxj/p/RabbitMQ.html ,
https://www.sojson.com/blog/48.html,
https://www.cnblogs.com/sxzwj/p/6422870.html,
https://blog.csdn.net/seven__________7/article/details/70225830
1.3 相关说明:
1.3.1连接
AMQP连接通常是长连接。AMQP是一个使用TCP提供可靠投递的应用层协议。AMQP使用认证机制并且提供TLS(SSL)保护。当一个应用不再需要连接到AMQP代理的时候,需要优雅的释放掉AMQP连接,而不是直接将TCP连接关闭。
1.3.2通道
有些应用需要与AMQP代理建立多个连接。无论怎样,同时开启多个TCP连接都是不合适的,因为这样做会消耗掉过多的系统资源并且使得防火墙的配置更加困难。AMQP 0-9-1提供了通道(channels)来处理多连接,可以把通道理解成共享一个TCP连接的多个轻量化连接。
在涉及多线程/进程的应用中,为每个线程/进程开启一个通道(channel)是很常见的,并且这些通道不能被线程/进程共享。
一个特定通道上的通讯与其他通道上的通讯是完全隔离的,因此每个AMQP方法都需要携带一个通道号,这样客户端就可以指定此方法是为哪个通道准备的。
1.3.3交互机:
’’ 默认交换机 匿名交换器 未显示声明类型都是该类型
Direct exchange(直连交换机):(Empty string) and amq.direct;直连交换器,该交换机将会对绑定键(binding key)和路由键(routing key)进行精确匹配
Fanout exchange(扇型交换机):amq.fanout;会发送消息到它所知道的所有队列,每个消费者获取的消息都是一致的
Topic exchange(主题交换机): amq.topic;该交换机会对路由键正则匹配,必须是*(一个单词)、#(多个单词,以.分割) 、 user.key .abc.* 类型的key
Headers exchange(头交换机) :amq.match (and amq.headers in RabbitMQ);有时消息的路由操作会涉及到多个属性,此时使用消息头就比用路由键更容易表达,头交换机(headers exchange)就是为此而生的。
1.3.4虚拟主机
为了在一个单独的代理上实现多个隔离的环境(用户、用户组、交换机、队列 等),AMQP提供了一个虚拟主机(virtual hosts - vhosts)的概念。这跟Web servers虚拟主机概念非常相似,这为AMQP实体提供了完全隔离的环境。当连接被建立的时候,AMQP客户端来指定使用哪个虚拟主机。
2 安装
##2.1 安装erlang
安装erlang
# yum install openssl-devel
# yum install unixODBC-devel
# wget http://www.erlang.org/download/otp_src_R16B01.tar.gz
# tar -zxvf otp_src_R16B01.tar.gz
# cd otp_src_R16B01
# ./configure --prefix=/usr/local/erlang --enable-hipe --enable-threads --enable-smp-support --enable-kernel-poll --without-javac
# make
# make install
配置erlang
vim /etc/profile
export ERLANG_HOME=/opt/rabbitmq/erlang
export PATH=$ERLANG_HOME/bin:$PATH
# source /etc/profile
# erl
3安装RabbitMQ服务端
# wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.1.5/rabbitmq-server-generic-unix-3.1.5.tar.gz
# tar -zxvf rabbitmq-server-generic-unix-3.1.5.tar.gz
3.1启动
# cd rabbitmq_server-3.1.5/
# ./sbin/rabbitmq-server start
# ./sbin/rabbitmq-server -detached #后台运行
3.2查看状态
# ./sbin/rabbitmqctl status
3.3安装插件(页面管理模块,重启后生效)
# ./sbin/rabbitmq-plugins enable rabbitmq_management
重启rabbitmq服务
# ./sbin/rabbitmqctl stop
# ./sbin/rabbitmq-server start
到此,就可以通过http://ip:15672 使用guest,guest 进行登陆web页面了
3.4用户管理:
官方使用说明文档:
https://www.rabbitmq.com/rabbitmqctl.8.html
RabbitMQ有一个默认的用户"guest",密码也是"guest",这个用户默认只能通过本机访问,eg:http://localhost:15672/,在通过http访问之前记得启用management插件:
list_users,用户列表
add_user {username} {password},添加用户
delete_user {username},删除用户
change_password {username} {newpassword},修改密码
clear_password {username},删除密码,密码删除后就不能访问了。This user now cannot log in with a password (but may be able to through e.g. SASL EXTERNAL if configured)
authenticate_user {username} {password},用户认证
set_user_tags {username} {tag …},为用户设置角色,tag可以是0个、一个、或多个,eg:rabbitmqctl set_user_tags chris administrator,设置为管理员;rabbitmqctl set_user_tags chris,清除chris与角色的关联。
查看用户
# ./sbin/rabbitmqctl list_users
添加用户
# ./sbin/rabbitmqctl add_user clevercode pwd123456
删除用户
# ./sbin/rabbitmqctl delete_user clevercode
修改密码
# ./sbin/rabbitmqctl change_password clevercode pwd12345678
设置标签(management,monitoring,administrator)
#./sbin/rabbitmqctl set_user_tags clevercode administrator
然后就可以通过http://host:15672 登录management界面管理rabbitmq了,但此时用户clevercode还没有访问队列资源的权限
3.5权限管理:
RabbitMQ客户端连接到一个服务端的时候,在它的操作指令中指定了一个虚拟主机。服务端首先检查是否有访问该虚拟主机的权限,没有权限的会拒绝连接。
对于exchanges和queues等资源,位于某个虚拟主机内;不同虚拟主机内即便名称相同也代表不同的资源。当特定操作在资源上执行时第二级访问控制开始生效。
RabbitMQ在某个资源上区分了配置、写和读操作。配置操作创建或者销毁资源,或者更改资源的行为。写操作将消息注入进资源之中。读操作从资源中获取消息。
要执行特定操作用户必须授予合适的权限。
list_vhosts [vhostinfoitem …],获取vhosts列表
add_vhost {vhost}, eg:rabbitmqctl add_vhost test
delete_vhost {vhost}
set_permissions [-p vhost] {user} {conf} {write} {read},给用户分在对应的vhost上分配相应的权限。eg:rabbitmqctl set_permissions -p /myvhost chris “^chris-." ".” “.*”,这条指令,给用户chris在myvhost分配了权限,权限包括:以"chris-"开头的全部资源的配置权限,和所有资源的读写权限
clear_permissions [-p vhost] {username},清除权限
list_permissions [-p vhost],vhost权限分配列表
list_user_permissions {username},user权限列表
查看主机列表
# ./sbin/rabbitmqctl list_vhosts
添加主机
# ./sbin/rabbitmqctl add_vhost host_clevercode
删除主机
# ./sbin/rabbitmqctl delete_vhost host_clevercode
给用户配置主机权限(此时用户clevercode才有访问host_clevercode空间下面队列资源的权限)
# ./sbin/rabbitmqctl set_permissions -p host_clevercode clevercode ".*" ".*" ".*"
清除权限
# ./sbin/rabbitmqctl clear_permissions -p host_clevercode clevercode
vhost权限分配列表
# ./sbin/rabbitmqctl list_permissions -p host_clevercode
user权限列表
# ./sbin/rabbitmqctl list_user_permissions clevercode
4安装客户端
4.1安装
# wget https://github.com/alanxz/rabbitmq-c/releases/download/v0.6.0/rabbitmq-c-0.6.0.tar.gz
# tar -zxvf rabbitmq-c-0.6.0.tar.gz
# cd rabbitmq-c-0.6.0
# ./configure
# make && make install
4.2 测试
1 开启消费者(终端1)
# ./examples/amqp_listen localhost 5672 amq.direct test
开启消费者(再开一个终端)
# ./examples/amqp_listen localhost 5672 amq.direct test2
查看管理页面(会有两个连接,查看队列,会看到test2)
2 生成者(再开一个终端)
#./examples/amqp_sendstring localhost 5672 amq.direct test "hello world"
#./examples/amqp_sendstring localhost 5672 amq.direct test "hello world"
#./examples/amqp_sendstring 127.0.0.1 5672 amq.direct test2 "hello world2"
查看消费者中的页面
5 安装PHP扩展
# wget http://pecl.php.net/get/amqp-1.6.0beta3.tgz
# tar -zxvf amqp-1.6.0beta3.tgz
# cd amqp-1.6.0beta3/
# phpize
# ./configure --with-php-config=/usr/local/php5/bin/php-config --with-amqp
# make
# make install
注意,如果make install时候,提示了以下文案,不是安装失败,而是,你提示你需要配置/etc/php.ini,将amqp.so扩展加入进来。
Installing shared extensions: /usr/local/php5/lib/php/extensions/no-debug-non-zts-20121212/
加入amqp.so扩展模块。
# vim /etc/php.ini
修改 php.ini 文件 在最后加入 如下内容:
extension_dir = “/usr/local/php5/lib/php/extensions/no-debug-non-zts-20121212/”
[amqp]
extension=amqp.so