一文读懂运维消息中间件之RabbitMQ
一文读懂运维消息中间件之RabbitMQ,适合小白学习及上班族日常工作参考。
目录
更多精彩博文详见:
(一)、RabbitMQ简介
1、RabbitMQ简介
消息队列(Message Queue)是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。
AMQP(Advanced Message Queue Protocol),即高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。
RabbitMQ 是一个由 Erlang 语言开发的 、实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。
2、RabbitMQ核心概念
(1)、Message
消息,消息是不具名的,它由消息头和消息体组成。消息体是不透明的,而消息头则由一系列的可选属性组成,这些属性包括routing-key(路由3键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等。
(2)、Publisher
消息的生产者,也是一个向交换器发布消息的客户端应用程序。
(3)、Exchange
交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。
(4)、Binding
绑定,用于消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。
(5)、Queue
消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。
(6)、Connection
网络连接,比如一个TCP连接。
(7)、Channel
信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内地虚拟连接,AMQP 命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说建立和销毁 TCP 都是非常昂贵的开销,所以引入了信道的概念,以复用一条 TCP 连接。
(8)、Consumer
消息的消费者,表示一个从消息队列中取得消息的客户端应用程序。
(9)、Virtual Host
虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 / 。
(10)、Broker
表示消息队列服务器实体。
3、AMQP中的消息路由
AMQP 中消息的路由过程和 Java 开发者熟悉的 JMS 存在一些差别,AMQP 中增加了 Exchange 和 Binding 的角色。生产者把消息发布到 Exchange 上,消息最终到达队列并被消费者接收,而 Binding 决定交换器的消息应该发送到那个队列。
Exchange分发消息时根据类型的不同分发策略有区别,目前共三种常见类型:direct、fanout、topic 。
(1)、direct
消息中的路由键(routing key)如果和 Binding 中的 binding key 一致, 交换器就将消息发到对应的队列中。路由键与队列名完全匹配,如果一个队列绑定到交换机要求路由键为“dog”,则只转发 routing key 标记为“dog”的消息,不会转发“dog.puppy”,也不会转发“dog.guard”等等。它是完全匹配、单播的模式。
(2)、fanout
每个发到 fanout 类型交换器的消息都会分到所有绑定的队列上去。fanout 交换器不处理路由键,只是简单的将队列绑定到交换器上,每个发送到交换器的消息都会被转发到与该交换器绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。fanout 类型转发消息是最快的。
(3)、topic
topic 交换器通过模式匹配分配消息的路由键属性,将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上。它将路由键和绑定键的字符串切分成单词,这些单词之间用点隔开。它同样也会识别两个通配符:符号“#”和符号“”。#匹配0个或多个单词,匹配不多不少一个单词。
(二)、RabbitMQ搭建模式
端口号 |
作用 |
5672 |
消息中间内部通讯的端口号 |
15672 |
rabbitmq管理平台端口号 |
25672 |
rabbitmq集群的端口号 |
4369 |
epmd进程,是Erlang Port Mapper Daemon的缩写,在Erlang集群中相当于dns的作用。 |
单机搭建部署过程
(1)安装Erlang环境
步骤一:安装相关依赖
[root@localhost ~]# yum -y install gcc glibc-devel make ncurses-devel openssl-devel xmlto perl wget gtk2-devel binutils-devel xz
步骤二:下载Erlang压缩包(官网下,很慢)
[root@localhost ~]# cd /usr/local/src/
[root@localhost src]# wget http://erlang.org/download/otpsrc22.0.tar.gz
步骤三:创建Erlang安装目录
[root@localhost src]# mkdir -p /usr/local/erlang
步骤四:解压、编译、安装Erlang
- 解压:
[root@localhost src]# tar -zxvf otpsrc22.0.tar.gz
[root@localhost src]# cd otpsrc22.0
- 编译:
[root@localhost otpsrc22.0]# ./configure --prefix=/usr/local/erlang
[root@localhost otpsrc22.0]# make install
步骤五:测试是否安装成功
[root@localhost otpsrc22.0]# ll /usr/local/erlang/bin/
步骤六:添加至环境变量
[root@localhost otpsrc22.0]# echo "export PATH=$PATH:/usr/local/erlang/bin" >> /etc/profile
[root@localhost otpsrc22.0]# source /etc/profile
[root@localhost otpsrc22.0]# erl
Erlang安装成功!
(2)安装RabbitMQ
步骤一:下载RabbitMQ
[root@localhost src]# wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.15/rabbitmq-server-generic-unix-3.7.15.tar.xz
步骤二:解压rabbitmq-server-generic-unix-3.7.15.tar.xz
[root@localhost src]# xz -d rabbitmq-server-generic-unix-3.7.15.tar.xz
[root@localhost src]# tar -xvf rabbitmq-server-generic-unix-3.7.15.tar
步骤三:将解压后的路径移至/usr/local路径下,命名为rabbitmq
[root@localhost src]# mv rabbitmq_server-3.7.15/ /usr/local/rabbitmq
步骤四:配置环境变量
[root@localhost sbin]# echo "export PATH=$PATH:/usr/local/rabbitmq/sbin" >> /etc/profile
[root@localhost sbin]# source /etc/profile
步骤五:启动RabbitMQ
[root@localhost rabbitmq]# rabbitmq-server -detached
步骤六:开启web插件
[root@localhost rabbitmq]# rabbitmq-plugins enable rabbitmq_management
打开浏览器:http://192.168.31.116:15672
步骤七:添加用户
- 添加:
用户名:lbj
密码:111111
[root@localhost rabbitmq]# rabbitmqctl adduser lbj 111111
- 查看用户列表
[root@localhost rabbitmq]# rabbitmqctl listusers
- 配置用户lbj的权限
[root@localhost rabbitmq]# rabbitmqctl setpermissions -p "/" lbj "." "." ".*"
- 查看用户lbj的权限
[root@localhost rabbitmq]# rabbitmqctl listuser_permissions lbj
- 配置用户lbj为administrator标签
[root@localhost rabbitmq]# rabbitmqctl setusertags lbj administrator
- 删除默认用户guest
[root@localhost rabbitmq]# rabbitmqctl delete_user guest
步骤八:使用新创建的用户登录web
打开浏览器:http://192.168.31.116:15672
至此,RabbitMQ安装配置完成!
(三)、常用命令
1、服务管理命令
(1)、后台方式启动RabbitMQ
[root@localhost rabbitmq]# rabbitmq-server -detached
(2)、查询RabbitMQ服务器状态
[root@localhost rabbitmq]# rabbitmqctl status
(3)、关闭RabbitMQ节点
我们知道 RabbitMQ 是用 Erlang 语言写的,在Erlang 中有两个概念:节点和应用程序。节点就是 Erlang 虚拟机的每个实例,而多个 Erlang 应用程序可以运行在同一个节点之上。节点之间可以进行本地通信(不管他们是不是运行在同一台服务器之上)。比如一个运行在节点A上的应用程序可以调用节点B上应用程序的方法,就好像调用本地函数一样。如果应用程序由于某些原因奔溃,Erlang 节点会自动尝试重启应用程序。
如果要关闭整个 RabbitMQ 节点可以用参数 stop
1)关闭本机节点
[root@localhost rabbitmq]# rabbitmqctl stop
2)关闭远程节点
关闭远程节点,只需要使用参数:-n node
node默认值是 rabbit@server
如果远程主机名是 RabbitMQ01 ,则node的值为:rabbit@RabbitMQ01
- 关闭远程主机名为RabbitMQ01的命令如下:
[root@RabbitMQ01 ~]# rabbitmqctl -n rabbit@RabbitMQ01 stop
(4)、关闭 RabbitMQ 应用程序
如果只想关闭应用程序,同时保持 Erlang 节点运行则可以用 stop_app
这个命令在集群模式中会很有用
[root@RabbitMQ01 ~]# rabbitmqctl stop_app
关闭后,web管理界面无法访问
(5)、启动 RabbitMQ 应用程序
[root@RabbitMQ01 ~]# rabbitmqctl start_app
启动后,web管理界面恢复访问
(6)、开启web插件
[root@localhost rabbitmq]# rabbitmq-plugins enable rabbitmq_management
浏览器可访问web界面:http://192.168.110.231:15672/
2、数据操作命令
(1)、列出所有队列信息
rabbitmqctl list_queues
例如:
rabbitmqctl list_queues | grep test_queues
(2)、清空指定queue队列的数据
rabbitmqctl purgequeue queuename
例如:
rabbitmqctl purgequeue testlistenerb
执行结果:
Purging queue 'testlistener_b' in vhost '/' …
(3)、删除指定队列
rabbitmqctl deletequeue queuename
例如:
rabbitmqctl deletequeue testlistenerb
执行结果:
Deleting queue 'testlistener_b' on vhost '/' …
Queue was successfully deleted with 1732 messages
(4)、列出所有的vhost
rabbitmqctl list_vhosts
执行结果:
Listing vhosts …
name
vh-test
/
(5)、新建一个名为vh-test的vhost
rabbitmqctl add_vhost vh-test
执行结果:
Adding vhost "vh-test" …
(6)、删除一个名为vh-uis-test的vhost
rabbitmqctl delete_vhost vh-test
执行结果:
Deleting vhost "vh-uis-test" …
(7)、新增一个用户
rabbitmqctl add_user Username Password
(8)、删除一个用户
rabbitmqctl delete_user Username
(9)、修改用户的密码
rabbitmqctl change_password Username Newpassword
(10)、查看当前用户列表
rabbitmqctl list_users
(11)、为用户test授予vh-test的vhost权限
rabbitmqctl setpermissions -p 'vh-test' test '.' '.' '.'
执行结果:
Setting permissions for user "test" in vhost "vh-test" …
(12)、重置RabbitMQ节点
该命令将清除所有的队列。
[root@RabbitMQ01 ~]# rabbitmqctl reset
(13)、查看交换器
[root@RabbitMQ01 ~]# rabbitmqctl list_exchanges
(14)、查看绑定
[root@RabbitMQ01 ~]# rabbitmqctl list_bindings
更多推荐
所有评论(0)