RabbitMQ简介及安装
本来我想写一篇文章介绍下RabbitMq,学着学着发现内容还挺多,不然就干脆都写的短点形成一系列的文章,这样方便以后学习和查阅,今天是周末,一人在被我们的美丽的帝都写写文章吧,时间再长就忘记了原来自己学的东西了,上周在公司使用到了jmq,感觉有些东西稍微的生疏了,原来的文章都在草稿箱里面,一直没看整理完整,今天借着这个机会把RabbitMq整理下,忘记介绍jmq这个东西是什么了,是京东自己开发的消息中间件,目前应该是没开源,后面有时间可以稍微整理下看看,京东是如何实现的mq,言归正传开始工作吧!
技术背景知识介绍
AMQP高级消息队列协议
AMQP(Advanced Message Queuing Protocol)高级消息队列协议:高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言灯条件的限制。
AMQP中消息的路由过程和JMS存在一些差别。AMQP中增加了Exchange和Binging的角色。生产者把消息发布到Exchange上,消息最终到达队列并被消费者接收,而Binding决定交换器的消息应该发送到哪个队列。
Erlang语言
Erlang语言最初用于交换机领域的架构模式,这样使得RabbitMQ在Broker之间进行数据交互的性能非常优秀(Erlang有着和原生Socket一样的延迟)。
所以后面安装的时候我们必须先安装erlang环境
RabbitMQ
RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议在不同的应用之间共享数据(跨平台跨语言)。RabbitMQ是使用Erlang语言编写,并且基于AMQP协议实现。
RabbitMQ的优势:
- 可靠性(Reliablity):使用了一些机制来保证可靠性,比如持久化、传输确认、发布确认。
- 灵活的路由(Flexible Routing):在消息进入队列之前,通过Exchange来路由消息。对于典型的路由功能,Rabbit已经提供了一些内置的Exchange来实现。针对更复杂的路由功能,可以将多个Exchange绑定在一起,也通过插件机制实现自己的Exchange。
- 消息集群(Clustering):多个RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker。
- 高可用(Highly Avaliable Queues):队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。
- 多种协议(Multi-protocol):支持多种消息队列协议,如STOMP、MQTT等。
- 多种语言客户端(Many Clients):几乎支持所有常用语言,比如Java、.NET、Ruby等。
- 管理界面(Management UI):提供了易用的用户界面,使得用户可以监控和管理消息Broker的许多方面。
- 跟踪机制(Tracing):如果消息异常,RabbitMQ提供了消息的跟踪机制,使用者可以找出发生了什么。
- 插件机制(Plugin System):提供了许多插件,来从多方面进行扩展,也可以编辑自己的插件。
RabbitMQ的整体架构
RabbitMQ的消息流转
RabbitMQ各组件功能
- Broker:标识消息队列服务器实体.
- Virtual Host:虚拟主机。标识一批交换机、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个vhost本质上就是一个mini版的RabbitMQ服务器,拥有自己的队列、交换器、绑定和权限机制。vhost是AMQP概念的基础,必须在链接时指定,RabbitMQ默认的vhost是 /。
- Exchange:交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。
- Queue:消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。
- Banding:绑定,用于消息队列和交换机之间的关联。一个绑定就是基于路由键将交换机和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。
- Channel:信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内地虚拟链接,AMQP命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说,建立和销毁TCP都是非常昂贵的开销,所以引入了信道的概念,以复用一条TCP连接。
- Connection:网络连接,比如一个TCP连接。
- Publisher:消息的生产者,也是一个向交换器发布消息的客户端应用程序。
- Consumer:消息的消费者,表示一个从一个消息队列中取得消息的客户端应用程序。
- Message:消息,消息是不具名的,它是由消息头和消息体组成。消息体是不透明的,而消息头则是由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(优先级)、delivery-mode(消息可能需要持久性存储[消息的路由模式])等。
RabbitMQ的多种Exchange类型
Exchange分发消息时,根据类型的不同分发策略有区别。目前共四种类型:direct、fanout、topic、headers(headers匹配AMQP消息的header而不是路由键(Routing-key),此外headers交换器和direct交换器完全一致,但是性能差了很多,目前几乎用不到了。所以直接看另外三种类型。)。
fanout
每个发到 fanout 类型交换器的消息都会分到所有绑定的队列上去。fanout 交换器不处理路由键,只是简单的将队列绑定到交换器上,每个发送到交换器的消息都会被转发到与该交换器绑定的所有队列上。很像子网广播,每台子网内的主机都获得了一份复制的消息。fanout 类型转发消息是最快的。
direct
消息中的路由键(routing key)如果和 Binding 中的 binding key 一致, 交换器就将消息发到对应的队列中。路由键与队列名完全匹配,如果一个队列绑定到交换机要求路由键为“dog”,则只转发 routing key 标记为“dog”的消息,不会转发“dog.puppy”,也不会转发“dog.guard”等等。它是完全匹配、单播的模式。
topic
topic 交换器通过模式匹配分配消息的路由键属性,将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上。它将路由键和绑定键的字符串切分成单词,这些单词之间用点隔开。它同样也会识别两个通配符:符号“#”和符号“*”。#匹配0个或多个单词,*匹配一个单词。
我们大致了解了rabbitmq的原理,我们现在就安装一下,下节就开启我们的代码之路
安装
在介绍消息中间件的时候所提到的“消息系统” 便是我们这节的主题:RabbitMq 如同redis一样 他也是采用c/s架构
由服务端 与客户端组成, 我们现在我们计算机上部署他的服务端
由于我们刚刚介绍过了RabbitMQ服务端是由Erlang语言编写所以我们这里先下载Erlang语言的环境
注意:如果是在官网下的RabbitMQ服务端的话 Erlang语言的版本不能太低, 不然要卸载掉旧的去装新的
注意! 需要先下载Erlang再下载安装包安装, 不然安装RabbitMQ服务端的时候会提示你本地没有Erlang环境
安装的话, 基本上就是默认的选项不用改
这类的安装非常简单不想说太多截几个图吧先
如何看RabbitMq安装完成了? 在系统-服务中找到如下即可:
包括启动 停止 重启 服务等
RabbitMQ安装会附带一个管理工具(方便我们能直观的查看整个RabbitMQ的运行状态和详细数据等,有点像
Navicat 对应Mysql的关系) 值得一提的是, 管理工具和RabbitMQ是两码事 希望同学们不要混稀了。
管理工具启动方式:
到你们安装的 RabbitMQ Server\rabbitmq_server-3.7.12\sbin 目录下面 执行一条cmd命令:
rabbitmq-plugins enable rabbitmq_management
当然也可以配置path
输入完启动命令后 稍微等一下会有结果返回 然后可以打开浏览器 输入
http://127.0.0.1:15672
访问管理页面:
默认账号密码都是
guest 即
username :guest
password:guest
管理端的简单介绍
从上面的图中我们看到其中有connections,channels,exchanges,queues等管理,admin里面有账号的管理等管理功能这也是为啥上面我先介绍rabbitmq中的各种概念不然进去一脸懵逼,没啥意思了就
新增用户
首先 点击admin页签, 在下面找到Add User
填写完之后点击AddUser 就可以添加一个用户了, 添加完用户之后还要给这个用户添加对应的权限(注:Targ不
等于权限)
比如说 我刚刚添加了一个admin角色
点击这个admin可以进去给他添加权限 这个权限可以是 Virtual host 级别的 也可以是交换机级别的 甚至是细化到某
一个读写操作 我这里就给他添加一个Virtual host权限
这里 我们给了他 test这个Virtual host的权限 正则匹配都是* 也就是所有权限
然后点击set添加完毕
那么管理页面 我们就讲到这里
新增vhost
其他的这里不太多赘述了,后面使用的时候再看吧