为什么80%的码农都做不了架构师?>>>
RabbitMP简介以AMQP协议
- RabbitMP是开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,RabbitMP底层是用了Erlang语言来编写的,并且rabbitMP是基于AMQP协议的.
- RabbitMP不仅仅可以使用java客户端进行编写,且可以使用其他的语言(python,php等..),它提供了丰富的API
RabbitMP的优点:
- 开源,性能优秀,稳定性保障
- 与SpringAMQP完美的整合,API丰富 (Spring基于RabbitMP 提供了一套框架,叫做AMQP框架)这套框架不仅提呈了原生的RabbitMP,而且还提供了丰富可扩张的API帮助开发人员更好的去应用
- 集群模式丰富,表达式配置,HA模式,镜像队列模型
说明:(保证数据不丢失的提前做到高可靠性,可用性)普遍使用的镜像队列模式- AMQP全称:Advanced Message Queuing Protocl AMQP翻译过来:高级消息队列协议
AMQP模型图
- Publisher(生产者)把消息投递到server上,然后经过Virtual host再到Exchange就可以了.
- Consumer(消费者) 只需要和Messager Queue进行监听绑定就可以了,从而实现队列级别的结偶.
- 生产者不需要关系我的消息投递到哪个队列,但消费者只需要监听队列就好了,它们的关系是通过路由进行关联的.
- Exchange和Message Queue 之间有一个绑定的关系,然后通过路由key 关联,也就是说消息发到Exchange上通过某种路由规则,把消息路由到某一个队列上,这其实是RabbitMP的核心Publisher(生产者)把消息投递到server上,然后经过Virtual host再到Exchange就可以了.Consumer(消费者) 只需要和Messager Queue进行监听绑定就可以了,从而实现队列级别的结偶.生产者不需要关系我的消息投递到哪个队列,但消费者只需要监听队列就好了,它们的关系是通过路由进行关联的.
- Exchange和Message Queue 之间有一个绑定的关系,然后通过路由key 关联,也就是说消息发到Exchange上通过某种路由规则,把消息路由到某一个队列上,这其实是RabbitMP的核心.
Step2.RabbitMP安装与使用
官网地址:http://www.rabbitmp.com/
安装软件开发包
$ yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ kernel-devel m4 ncurses-devel tk tc xz
下载安装包
$ wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.5/rabbitmq-server-3.6.5-1.noarch.rpm$ wget http://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
安装
说明:先需要安装erlang & scat,然后再安装rabbitmp-server,因为rabbitmp-server依赖socat
$ rpm -ivh erlang-18.3-1.el7.centos.x86_64.rpm$ rpm -ivh socat-1.7.3.2-5.el7.lux.x86_64.rpm $ rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm
配置rabbitmp
$ vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app{loopback_users, [<<"guest">>]}, 修改为&#xff1a; {loopback_users, ["guest"]},
启动rabbitmp
$ rabbitmq-server start &#可以看到后台进程
$ lsof -i:5672
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
beam 16415 rabbitmq 49u IPv6 943337 0t0 TCP *:amqp (LISTEN)
查看rabbitmp 插件列表 &启动管理插件
#查看插件$ rabbitmq-plugins listConfigured: E &#61; explicitly enabled; e &#61; implicitly enabled| Status: * &#61; running on rabbit&#64;dong|/
[ ] amqp_client 3.6.5
[ ] cowboy 1.0.3
[ ] cowlib 1.0.1
[ ] mochiweb 2.13.1
[ ] rabbitmq_amqp1_0 3.6.5
[ ] rabbitmq_auth_backend_ldap 3.6.5
[ ] rabbitmq_auth_mechanism_ssl 3.6.5
[ ] rabbitmq_consistent_hash_exchange 3.6.5
[ ] rabbitmq_event_exchange 3.6.5
[ ] rabbitmq_federation 3.6.5
[ ] rabbitmq_federation_management 3.6.5
[ ] rabbitmq_jms_topic_exchange 3.6.5
[ ] rabbitmq_management 3.6.5
[ ] rabbitmq_management_agent 3.6.5
[ ] rabbitmq_management_visualiser 3.6.5
[ ] rabbitmq_mqtt 3.6.5
[ ] rabbitmq_recent_history_exchange 1.2.1
[ ] rabbitmq_sharding 0.1.0
[ ] rabbitmq_shovel 3.6.5
[ ] rabbitmq_shovel_management 3.6.5
[ ] rabbitmq_stomp 3.6.5
[ ] rabbitmq_top 3.6.5
[ ] rabbitmq_tracing 3.6.5
[ ] rabbitmq_trust_store 3.6.5
[ ] rabbitmq_web_dispatch 3.6.5
[ ] rabbitmq_web_stomp 3.6.5
[ ] rabbitmq_web_stomp_examples 3.6.5
[ ] sockjs 0.3.4
[ ] webmachine 1.10.3#启动管理插件$ rabbitmq-plugins enable rabbitmq_management The following plugins have been enabled:mochiwebwebmachinerabbitmq_web_dispatchamqp_clientrabbitmq_management_agentrabbitmq_managementApplying plugin configuration to rabbit&#64;dong... started 6 plugins.
访问rabbitmp管理后台
http://106.12.100.44:15672/
username:guest password:guest
登陆进来的界面
- 在Info显示目前使用的disc&#xff08;磁盘&#xff09;存储&#xff0c;也可以改为使用内存&#xff0c;也就说收到消息存到内存中&#xff0c;这样的可以提升性能.在启动rabbitmp 加上--ram 即可改为内存存储
Step3:RabbitMP核心概念
RabbitMQ架构图
AMQP核心概念
Server&#xff1a;又称Broker&#xff0c;接受客户端的连接&#xff0c;实现AMQP实体服务.
Connection:连接&#xff0c;应用程序与Broker的网络连接.
Channel&#xff1a;网络信道&#xff0c;几乎所有的操作都在Channel中进行&#xff0c;Channel是进行消息读写的通道. 客户端可建立多个Channel&#xff0c;每个Channel代表一个会话任务.
Message:消息&#xff0c;服务器应用程序之间传送的数据&#xff0c;由Properties和Body组成.Properties可以对消息进行修饰&#xff0c;比如消息的优先级以及延迟等高级特性&#xff1b;Body则就是消息体内容
Virtual Host&#xff1a;虚拟地址&#xff0c;用于进行逻辑隔离&#xff0c;最上层的消息路由&#xff0c;一个Virtual Host里面可以有若干个Exchange和Queue&#xff0c;同一个Virtual Host里面不能有相同名称的Exchange或Queue.
Exchange&#xff1a;交换机&#xff0c;接收消息&#xff0c;根据路由键转发消息到绑定的队列
Binding&#xff1a;Exchange和Queue之间的虚拟连接&#xff0c;Binding中可以包含routing key
Routing Key:一个路由规则&#xff0c;虚拟机可用它来确定如何路由一个特定消息
Queue&#xff1a;也称为Message Queue&#xff0c;消息队列&#xff0c;保存消息并将它们转发给消费者
RabbitMQ消息流转图
举例&#xff1a;生产者发送了一个消息给Message&#xff0c;指定了 exchange name叫做e1 ,正好Exchange 也叫做e1&#xff0c;指定一个routing key &#xff1a;123
消息规则路由过来&#xff0c;Message Queue 123 和routing key 123就匹配上了