AMQP
高级消息队列协议(Advanced Message Queuing Protocl,AMQP)
具有现代特性的二进制协议。是一个提供统一消息服务的应用层标准高级消息队列协议,
是应用层协议的一个开放标准,为面向消息的中间件设计的。
AMQP协议模型
- Server(Broker): 接受客户端的连接,实现AMQP实体服务
- Connection:连接,应用程序与Broker的网络连接
- Channel:网络信道,几乎所有的操作都在Channel中进行。客户端可以建立多个Channel,每个Channel代表一个会话任务。
- Message:消息,服务器和应用程序需之间传递的数据。由Properties和Body组成。Properties可以对消息进行修饰,比如消息的优先级、延迟等高级特性;Body表示消息体内容
- Virtual host:虚拟主机,用于进行逻辑隔离,最上层的消息路由(用于划分具体的服务)。一个Virtual host里面可以有若干个Exchange和Queue,同一个Virtural Host里面不能有相同名称的Exchange或Queue。(类似redis中的不同数据库)
- Exchange:交换机,接收消息,根据路由键转发消息到绑定的队列。
- Binding:Exchange和Queue之间的虚拟连接,binding中可以包含routing key
- Routing key:路由键,一个路由规则,虚拟机可以用它来确定如何路由一个特定消息
- Queue:消息队列,保存消息并将它们转发给消费者
RabbitMQ
是一个开源的消息代理队列服务器,基于AMQP协议。
优点
- 开源
- 性能优秀
- 稳定性保障
- 提供可靠性消息投递模式(confirm)、返回模式(return)
- 与SpringAMQP完美整合
- API丰富
- 集群模式丰富
- 支持表达式配置
- 支持高可用模式
- 支持镜像队列模型
- 保证数据不丢失的前提做到高可靠性、可用性
高性能的原因
- Erlang语言最初在于交换机领域的架构模式,这样使得RabbitMQ在Broker之间进行数据交互的性能是非常优秀的
- Erlang的优点:Erlang有着和原生Socket一样的延迟性能
Rabbit MQ整体架构
P表示Producer,消息生产者
C表示Consumer,消息消费者
P把消息传递到了绿色的Exchange,然后Exchange把消息传递到红色的消息队列,再由消费者来消息消息。
这样,生产者不关心消息投递到了哪个队列;消费者也不关心消息是从哪个Exchange中来的
RabbitMQ消息流转流程
生产者生产的消息投递到MQ的Exchange(交换机)上,一个交换机可以绑定多个消息队列的,根据路由策略(路由键)路由消息到某个消息队列上。然后就可以由消费者消费。
安装与启动
我们在虚拟机CentOS7里面进行安装
我选择的是minimal安装,安装下面这篇文章配置网络
接下来安装相关工具:
yum install -y build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ kernel-devel m4 ncurses-devel tk tc xz
wget www.rabbitmq.com/releases/erlang/erlang-18.3-1.el7.centos.x86_64.rpm
wget http://repo.iotti.biz/CentOS/7/x86_64/socat-1.7.3.2-5.el7.lux.x86_64.rpm
wget www.rabbitmq.com/releases/rabbitmq-server/v3.6.5/rabbitmq-server-3.6.5-1.noarch.rpm
首先安装erlang语言的安装包
rpm -ivh erlang-18.3-1.el7.centos.x86_64.rpm
接下来安装socat
rpm -ivh socat-1.7.3.2-5.el7.lux.x86_64.rpm
最后安装消息队列
rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm
安装成功了!
接下来修改配置文件
vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app
找到
{queue_index_embed_msgs_below, 4096},
{default_user, <<"guest">>},
{default_pass, <<"guest">>},
{default_user_tags, [administrator]},
{default_vhost, <<"/">>},
{default_permissions, [<<".*">>, <<".*">>, <<".*">>]},
{loopback_users, [<<"guest">>]},
修改loopback_users 中的 <<"guest">>
,只保留guest
如:{loopback_users, [guest]},
相关命令
[root@localhost ~]# rabbitmq
rabbitmqctl rabbitmq-plugins rabbitmq-server
输入rabbitmq按下Tab可以看到以下三个命令:
- rabbitmqctl 控制相关,可以增加队列、交换机等
- rabbitmq-server 启停服务
- rabbitmq-plugins 插件管理
启动
通过下面的命令启动RabbitMQ
[root@localhost ~]# rabbitmq-server start &
[1] 20039
通过如下命令检测是否启动成功
[root@localhost ~]# lsof -i:5672
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
beam 20151 rabbitmq 48u IPv6 43519 0t0 TCP *:amqp (LISTEN)
停止
[root@localhost ~]# rabbitmqctl stop_app
Stopping node rabbit@localhost ...
开启可视化控制台插件
rabbitmq-plugins enable rabbitmq_management
然后访问 http://host:15672/ 即可
用户名密码都是 guest
rabbitmqctl命令
- 关闭应用:rabbitmqctl stop_app
- 启动应用:rabbitmqctl start_app
- 查看节点状态:rabbitmqctl status
- 添加用户:rabbitmqctl add_user test test
- 列出所有用户:rabbitmqctl list_users
[root@centos7-1 ~]# rabbitmqctl list_users
Listing users ...
test []
guest [administrator]
- 创建虚拟主机:rabbitmqctl add_vhost vhostpath
- 列出所有虚拟主机:rabbitmqctl list_vhosts
- 列出虚拟主机上所有权限:rabbitmqctl list_permissions -p vhostpath
- 删除虚拟主机:rabbitmqctl delete_vhost vhostpath
- 查看所有队列信息:rabbitmqctl list_queues
- 移除所有数据(需要先停止服务):rabbitmqctl reset
- 组成集群:
rabbitmqctl join_cluster <clusternode> [--ram]
- 查看集群状态:rabbitmqctl cluster_status
- 忘记节点(移除失效节点):rabbitmqctl forget_cluster_node [–offline]