快速入门高级消息中间件RabbitMQ

1 消息中间件简介

消息队列( Message Queue )是 种进程间或者线程间的异步通信方式,使用消息队列,消息

生产者在产生消息后,会将消息保存在消息队列中,直到消息消费者来取走它 ,即 消息的发送者和

接收者不需要同时与消息队列交互 使用消息队列可以有效实现服务的解耦,并提高系统的可靠性

以及可扩展性。目前,开源的消息队列服务非常多,如 Apache ActiveMQ、RabbitMQ、RocketMQ和Kafka等,这些产 品也就是常说的消息中间件

1.1 JMS简介

JMS (Java Message Service )即 Java 消息服务,它通过统JAVA API层面的标准,使得多

客户端可以通过 JMS行交互 ,大部分消息中 间件提供商都对JMS提供支持 JMS ActiveMQ

的关系就像JDBCJDBC驱动的关系。JMS 包括两种消息模型:点对点和发布者/订阅者,同时

JMS仅支持 Java 平台。

1.2 AMQP简介

AMQP (Advanced Message Queuing Protocol ,高级消息队列协议)是 个线路层的协议规范,

而不是 API规范(例如 JMS)。由于AMQP 是一个线路层协议规范,因此它天然就是跨平台的,

就像 SMTP HTTP 等协议 样,只要开发者按照规范的格式发送数据,任何平台都可以通过 AMQP

进行消息交互。像目前流行的 StormMQ、RabbitMQ等都实现了 AMQP

1.3AMQP 协议中的基本概念
  • Broker:接收和分发消息的应用,我们在介绍消息中间件的时候所说的消息系统就是Message Broker

  • Virtual host: 出于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的分组中,类似于网络中 的namespace概念。当多个不同的用户使用同一个RabbitMQ server提供的服务时,可以划分出多个vhost, 每个用户在自己的vhost创建exchange/queue

  • Connection: publisher/consumerbroker之间的TCP连接。断开连接的操作只会在client端进行,Broker 不会断开连接,除非出现网络故障或broker服务出现问题

  • Channel: 如果每一次访问RabbitMQ都建立一个Connection,在消息量大的时候建立TCP Connection的开 销将是巨大的,效率也较低。Channel是在connection内部建立的逻辑连接,如果应用程序支持多线程,通 常每个thread创建单独的channel进行通讯,AMQP method包含了channel id帮助客户端和message broker识别channel,所以channel之间是完全隔离的。Channel作为轻量级的Connection极大减少了操作系统建立 TCP connection的开销。

  • Exchange: message到达broker的第一站,根据分发规则,匹配查询表中的routing key,分发消息到queue 中去。常用的类型有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast)

  • Queue: 消息最终被送到这里等待consumer取走,一个message可以被同时拷贝到多个queue中。

  • Binding: exchange和queue之间的虚拟连接,binding中可以包含routing key。Binding信息被保存到 exchange中的查询表中,用于message的分发依据。

  • Producer:消息生产者,主要将消息投递到对应的 Exchange 上面;

  • Consumer:消息消费者,消息的接收者,一般是独立的程序;

Exchange的类型

  • direct: 只有绑定时的 routing_key 与发送消息的 routing_key 完全匹配时,消息才会被交换器投送到绑定的队列中去;

  • fanout: 转发消息到所有绑定队列;

  • topic: 按规则转发消息, topic他可以根据:星,#( 星号代表过滤一单词,#代 表过滤后面所有单词, 用.隔开)来识别routingKey 。打个比方假设我绑定的routingKey有队列A和B ,A的 routingKey是:*.user,B的routingKey是: #.user;那么我生产一条消息routingKey为: error.user 那么此时 2个队列都能接受到, 如果改为topic.error.user 那么这时候 只有B能接受到了

  • headers: 设置 Header Attribute 参数类型的交换机;这个类型的交换机很少用到,他的路由规则与routingKey无关,而是通过判断header参数来识别的, 基本上没有应用场景,因为上面的三种类型已经能应付了。

1.4 消息中间件的应用场景

​ 消息中间件主要用于典型的异步处理、应用解耦、流量削峰和消息通讯等四个场景,

典型的应用如电商系统中使用消息中间件处理下订单和查库存

消息中间件处理订单: 用户下订单->订单系统给消息中间件发送订单信息->

消息系统异步查询库存系统->异步返回库存信息给订单系统:

如果这张图能理解的话, 那么 上面的消息系统, 就是消息中间件。

2 RabbitMQ介绍

MQ: message Queue顾名思义 消息队列, 队列大家都知道, 存放内容的一个东西, 存放的内容先进先出, 消 息队列, 只是里面存放的内容是消息而已。

RabbitMq是一个开源的 基于AMQP协议实现的一个完整的企业级消息中间件,服务端语言由Erlang(面向并发编 程)语言编写 ,对于高并发的处理有着天然的优势,客户端支持非常多的语言,如Python、Java、Ruby、PHP、C#、JavaScript、GO、Objective-C和Swift等

主流MQ之间的对比

特性 ActiveMQ RabbitMQ RocketMQ Kafka
单机吞吐量 万级,比RocketMq和Kafaka低一个数量级 ActiveMQ 10万级,支持高吞吐 十万级,高吞吐,一般配合大数据类系统来进行实时数据计算、日志采集等场景
topic数量对吞吐量的影响 topic可以达到几百/几千的级别、吞吐量会有较小幅度的下降,这是RocketMq的一大优势,同等机器下可以支撑大量的topic topic从几十到几百的时候,吞吐量会大幅度下降,在同等机器下,kafka尽量保证topic数量不要过多;如果要支撑大规模的topic,需要增加机器资源
时效性 毫秒级 微妙级,这是RabbitMq的一大特点,延迟最低 毫秒级 毫秒级
可用性 高,基于主从架构实现高可用 ActiveMQ 非常高、分布式架构 非常高,分布式,一个数据多个副本,少数机器宕机不会导致数据丢失,也不会导致不可用
消息可靠性 有较低的概率丢失数据 经过参数优化配置可以做到零丢失 RocketMQ
功能支持 MQ领域功能及其完备 基于Erlang语言开发,并发能力很强、性能极好、延迟很低 MQ功能较为完善,还是分布式的,扩展性好 功能较为简单,主要支持简单的MQ功能,在大数据领域的实时计算以及日志采集中被规模使用
3 下载和安装RabbitMQ服务端

最新的RabbitMQ是3.8.5版本,可至官方网站下载:https://www.rabbitmq.com/

3.1 Windows系统下安装

在安装RabbitMQ之前需要先安装ERlang语言环境(官方下载特别慢,读者可至这个链接通过百度云盘下载:https://pan.baidu.com/s/1pZJ8l2f3omrgnuCm9a8DVA)
笔者本机windows系统上安装的是rabbitmq-server-3.7.9版本

安装的话, 基本上就是默认的选项不用改

如何看RabbitMq安装完成了? 在系统-服务中找到如下即可:

包括启动 停止 重启 服务等

使用管理工具添加用户并配置权限

到你们安装的 RabbitMQ Server\rabbitmq_server-3.7.12\sbin目录下面 执行一条cmd命令:

rabbitmq-plugins enable rabbitmq_management

直接复制这条命令即可 , 当然 嫌每次都要去目录中去执行的麻烦的话, 可以配置一个环境变量 或者在我们的开

始菜单栏中找到这个:

输入完启动命令后 稍微等一下会有结果返回 然后可以打开浏览器 输入:

http://127.0.0.1:15672

默认账号密码都是

guest 即 username :guest password:guest

登录进去之后会看到如下界面:

注意: 管理工具和rabbitmq是两码事 ,所以端口也就不一样

这个页面在笔记里面介绍起来可能比较复杂, 就不一一介绍了, 我这里讲个重点, 就是线上环境下一定要吧

guest用户(当然 guest这个用户只能本机才能登陆)删掉并且新加一个用户, 这里就演示一下这个功能

首先 点击admin页签, 在下面找到Add User

然后输入账号 密码 确认密码 这个Tags其实是一个用户权限标签, 关于他的介绍可以看官方介绍(点旁边那个小问

号就好了,我这里直接翻译他的介绍)

Comma-separated list of tags to apply to the user. Currently supported by the management plugin:
以逗号分隔的标签列表,应用于用户。目前由管理插件支持
management
管理
User can access the management plugin
用户可以管理插件
policymaker
政策制定者
User can access the management plugin and manage policies and parameters for the vhosts they have access to.
用户可以访问管理插件并管理他们有权访问的vhosts的策略和参数
monitoring
监控
User can access the management plugin and see all connections and channels as well as node-related information.
用户可以访问插件以及连接和通道以及与节点有关的信息
administrator
管理员
User can do everything monitoring can do, manage users, vhosts and permissions, close other user's connections, and manage policies and parameters for all vhosts.
用户可以执行任何监控可以做的事情,管理用户、虚拟主机和权限,关闭其他用户的连接以及管理所有虚拟主机的策略和参数
Note that you can set any tag here; the links for the above four tags are just for convenience.
注意:你可以在此处设置任何标记,以上四个标签的链接只是为了方便

首先添加admin用户,密码:admnin123

填写完之后点击AddUser 就可以添加一个用户了, 添加完用户之后还要给这个用户添加对应的权限(注:Targ不

等于权限)

这里 我们给了他/这个Virtual host的权限 ,正则匹配都是* 也就是所有权限

然后点击Set permission添加完毕

3.2 Linux系统下安装 RabbitMQ

这里在常用的CentOS 7系统下安装RabbitMQ

CentOS 7系统中安装Erlang 21.2

3.2.1 添加Erlang 源

由于 RabbitMQ 使用 Erlang 编写,因此需要先安装 Erlang 环境 CentOS 中安装 Erlang 21.0

的步骤如下:

  1. 使用XShell6客户端登录CentOS 7执行如下命令

执行 命令新建 software目录:mkdir /usr/local/software,

并执行cd /usr/local/software命令切换到software目录下;

2)在XShell6 上使用新建文件传输将otp_src_21.2.tar压缩包上传到/usr/local/software目录下

使用微信扫描下方二维码关注作者的微信公众号后发送消息【erlang】获取压缩包下载百度网盘地址和提取码

对应安装rabbitmq3.7.12版本

  1. 解压和编译
#解压
tar -zxvf otp_src_21.2.tar `
cd otp_src_21.2
#编译
. /otp build autoconf
./configure
#编译过程称出现报错
configure: error: No curses library functions found
#提示 ,需要首先安装 ncurses-devel
yum install  ncurses-devel
#重新编译
./configure
#编译过程中出现如下错误信息(先忽略)
odbc           : ODBC library - link check failed
wx             : wxWidgets not found, wx will NOT be usable
#安装,先后执行下面两个命令
make
make install
#检验
erl

最后一步是检验,如果看到下图所示的效果图,表示安装成功。

  1. 将最新的 Erlang 包添加到 yum 源中

vim /etc/yum.repos.d/rabbitmq-erlang.repo,按住i键后进入编辑模式,在文件中添加如下内容

[rabbitmq-erlang]
name=rabbitmq-erlang
baseurl=https://dl.bintray.com/rabbitmq-erlang/rpm/erlang/22/el/7
gpgcheck=1
gpgkey=https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
repo_gpgcheck=0
enabled=1

添加完后,按住esc键后再按住shift+:输入wq!后回车保存

  1. 清除原有缓存并创建新缓存
yum clean all
yum makecache
3.2.2 安装RabbitMQ
  1. 将下载的安装包rabbitmq-server-3.7.12-1.el7.noarch.rpm使用新建文件传输上传到/usr/local/software目录下

扫描下方二维码,关注作者的微信公众号后发送消息【rabbitmq-server】获取压缩包下载百度网盘地址和提取码

2) 上传到/usr/local/software目录后开始在software目录下开始安装

yum install rabbitmq-server-3.7.12-1.el7.noarch.rpm

安装过程中涉及到程序自动询问安装erlang.x86_64socat,一律输入y回车确认下载安装

yum install erlang.x86_64
yum install socat

3)安装成功后,接下来就可以启动 RabbitMQ井进行用户管理了,命令如下

#启动
service rabbitmq-server start
#查看状态
rabbitmqctl status
#开启web插件
rabbitmq-plugins enable rabbitmq_management
#重启
service  rabbitmq-server restart
#添加一个用户名为admin,登录密码为admin123的用户
rabbitmqctl add_user admin admin123
#设置admin 用户的角色为管理员
rabbitmqctl set_user_tags admin administrator
#配置admin用户可远程登录
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

4)通过rabbitmqctl -?或者rabbitmqctl help --list-commands可以查看到 rabbitmqctl下几乎所有的指令。

  1. rabbitmq相关端口开通防火墙
#开通rabbitmq管理界面15672端口
firewall-cmd --permanent --zone=public --add-port=15672/tcp
#开通rabbitmq服务5672端口
firewall-cmd --permanent --zone=public --add-port=5672/tcp
#重启防火墙服务
systemctl restart firewalld.service
  1. 如果Linux系统使用的是腾讯云或者阿里云,还需要前往登录腾讯云控制台在安全组中添加入站规则
  1. 在浏览器中输入:http://134.175.187.61:15672/地址就可以访问rabbitmq-management的首页了
  1. 输入用户名admin和密码admin123登录成功就可以访问rabbitmq-management的管理界面

4 小结

1)高级消息队列协议(AMQP)的包含的重要概念:Broker、vhost、Connection、Channel、Exchange、Queue、Binding、Producer和ConsumerExchange主要有四种类型:Direct、Fanout、Topic和headers,而topic类型的Exchange按照一定的路由规则转发消息在应用中使用得最多;

2)rabbitmq具有基于Erlang语言开发,并发能力很强、性能极好、延迟很低,客户端支持Python、Java、GO等大那部分编程语言等一系列优势;

3)rabbitmq服务端的安装需要先安装Erlang语言环境,然后再安装rabbitmq服务端程序,windows环境下安装比较简单,Linux环境下安装较为复杂。在文章重点演示了Linux环境下安装erlang-21.2语言环境rabbitmq-server-3.7.12程序,以及Linux环境下防火墙开放与rabbitmq相关的端口

4)下一篇文章笔者会详细演示rabbitmq消息中间件在spring-boot项目中的应用,敬请期待!

参考资料

[1] 王松著《Spring Boot+Vue全栈开发实战》第12章消息服务;

[2] 鲁班学院《RabbitMq第一节》课程讲义;

[3] Rabbitmq安装过程和踩过的坑( 一 安装 );

[4] Requires: erlang >= 20.3 Available: erlang-R16B-03.18.el7.x86_64

欢迎读者朋友们扫描下面的二维码,关注作者的微信公众号,与作者一起学习成长,向着java架构师的方向前进!

本文地址:https://blog.csdn.net/heshengfu1211/article/details/107420045