快速导航:

安装RabbitMQ

放行防火墙

常见RabbitMQ Ctl命令

RabbitMQ 角色说明

MQ 是中高级别Java程序员,必须要掌握的一门技术。

什么是MQ?

Message Quete 消息队列,是指消息传输中存储消息的容器。多用于分布式系统。

发送方:生产者,接收放:消费者

MQ的优势 劣势

优势

  • 应用解耦 :系统耦合性越高,容错性、可维护性就很低。(降低服务与服务之间的远程调用)
  • 异步提速 :服务与服务之间交流会消耗大量的时间,使用消息中间件,不用担心对方有没有直接收到消息,会节省很多的时间。。
  • 削峰填谷 :将大量的直接的访问,打在MQ中,不直接打在服务上。然后服务慢慢的从MQ中拉取处理。牺牲时间换稳定性 。例如:高并发情况,用户操作数据库,数据库容易挂,只需将操作的消息,存储到MQ中,让其他服务获取MQ消息,慢慢处理。顺时压力转移到MQ上。

劣势

  • 一致性问题 :消息由A、B 、C依次处理,A、B成功,C失败,消息就不一致了。
  • 系统可用性降低 :引入MQ,就需要保证MQ正常启动。
  • 系统复杂度提高 :引入MQ,需要保证消息正常被获取。

使用MQ的场景

  • 生产者不需要从消费者获取反馈。(如果需要A调用B -> B做完 ->A获取B做完后 继续做下面的事情。就不适合使用MQ)
  • 容许短暂的不一致性
  • MQ 优势确实大,但需确保有实力能做好MQ

常见的MQ产品

Erlang是 为高并发设计的语言 ,他不是Golang!

得益于微妙级别的延迟,RabbitMQ更适合做游戏中间件使用。

RabbitMQ的简介:

AMQP,06年发布,Advanced Meaagse Quruing Ptorocol 即高级队列协议,是一个网络协议,属应用层,为面向消息的中间件设计。基于此协议的客户端与消息中间件产品进行通信,不受客户端\中间件产品不同的限制,不同语言均可开发。

可以把AMQP 理解成HTTP 协议,AMQP 协议中 定义了一些角色

  • Publisher:消息生产者
  • Excange:交换机:分发消息
  • Routes:路由
  • Queue:消息存储的容器
  • Consumer:消息消费者

RabbitMQ 基础架构图

RabbitMQ 基本概念

Broker:接收、分发消息的应用。核心

Virtual Host:虚拟机:逻辑分区,可理解为 Mysql的数据库。

Connection:生产者、消费者、Broker 之间的TCP连接。

Channel:信道:减少TCP的Connection的开销作用。

Exchange:交换机:消息到达 Broker的第一站。常见类型有 direct、topic、fanout

Queue:队列:消息在这等待消费者取走。

Binding:交换机与队列绑定的过程。Binding信息保存于exchange中的查询表中,用与message的分发依据。

RabbitMQ 的7种工作模式

上图分为下面的模式

简单模式

work queues

Publich/Subscribe发布订阅模式

路由模式

Topics主题模式

RPC远程调用模式 (不算MQ)

官网:https://www.rabbitmq.com/
下载地址:https://github.com/rabbitmq/rabbitmq-server/releases
Java 官方文档:https://www.rabbitmq.com/tutorials/tutorial-one-java.html

JMS :Java Message Server,是Jave SE 提供面向消息中间件的API接口

ActiveMQ 遵循JMS规范,但是RabbitMQ 没有遵循。

RabbitMQ Linux 安装

centOS7 请参考:https://www.zanglikun.com/13183.html

服务端口 5672 WEB端口 15672

(安装前,需要安装erlang环境,RabbitMQ)

不同版本的RabbitMQ 必须使用对应范围的erlang环境:这点很重要,如果你是新手,不信这点,你还会再回来,看这句话的。版本对应地址:https://www.rabbitmq.com/which-erlang.html

RabbitMQ的配置:https://www.rabbitmq.com/configure.html#config-items

服务器需要设置:安全组,防火墙 开放 5672、15672 tcp端口

放行一些防火墙的端口(如果是云服务器的,话安全组 我默认你开放了)

开放端口(开放后需要要重启防火墙才生效)
firewall-cmd --zone=public --add-port=端口号/tcp --permanent

重启防火墙
firewall-cmd --reload

1、环境确认

这里,我不扯淡,翻以前的资料确实坑,CentOS8 不支持一些erlang的版本,但是老版本RabbitMQ 又依赖于它。不如我们干脆,干最新的版本
首先 先去找你想要的RabbitMQ版本 ,我们需要满足2个条件 centOS8 能安装rabbitMQ、又要满足与centOS8 能安装erlang,所以RabbitMQ 版本越新越好。

这里我使用的RabbitMQ 是3.8.9
Erlang版本是 从GitHub上弄下来的,你可以看下面自己弄。

2、卸载老版本RabbitMQ、erlang 没有的直接跳过

# 如果有老版本 直接干掉 这里有问题,可以去百度卸载 即可。
# 先暂停服务 
service rabbitmq-server stop

# 卸载RabbitMQ
yum -y remove rabbitmq-server.noarch

# 卸载erlang
yum -y remove erlang-*
yum remove erlang.x86_64

# 删不干净,但不影响使用,具体可以百度。但不保证 能删干净。

3、安装

一、安装erlang
 
# 添加仓库
curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash
Detected operating system as centos/8.

# 查看erlang版本
yum list | grep erlang

# cnetso 8 安装erlang
dnf install erlang
# centOS 7 安装 请使用 yum install erlang

# 查看当前erlang的版本
erl -version

# 找到合适的RabbitMQ的版本下载下来 https://github.com/rabbitmq/rabbitmq-server/releases
# 格式:rpm -ivh 你下载的mq.rpm文件,上传到服务器
rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm 

#centOS7 可能会缺失socat的话,那就
yum install socat

安装完成后,就可以启动了,RabbitMQ 安装后,就是内置的服务,可以直接service启动

# 启动命令
service rabbitmq-server start
service rabbitmq-server stop
service rabbitmq-server restart
不同版本显示不一样,最终还是需要以 lsof -i:5672 被占用为准

(这里有个巨大的BUG,启动提示你成功,一定要看 lsof -i:5672 看下端口是否被占用,不占用,一定要去看下 erl -v 看下版本,再去看下 https://www.rabbitmq.com/which-erlang.html 看下rabbitMQ 与 erlang 的版本是否兼容,不兼容,你累死,也找不到原因

这是看当前相关软件版本的命令

# 查看erlang的版本
yum list | grep erlang

# 查看rabbitMQ的版本
yum list | grep rabbitmq-server

然后去开启RabbitMQ的管理界面端口15672

默认此插件是不开启的,我们只有开启才能访问Dashboard

# 直接输入命令:开启管理界面
rabbitmq-plugins enable rabbitmq_management


# 修改默认配置信息,一般不要动
vim /usr/lib/rabbitmq/lib/rabbitmq_server-版本/ebin/rabbit.app 
# 比如修改密码、配置等等,例如:loopback_users 中的 <<"guest">>,只保留guest

保存文件 重启即可

常用命令

# 添加开机启动RabbitMQ服务
chkconfig rabbitmq-server on

# 启动服务
service rabbitmq-server start

# 开启web端ui
 占用端口15672  请务必 开启云服务器的 安全组与防火墙放行
rabbitmq-plugins enable rabbitmq_management

# 停止服务
service rabbitmq-server stop

# 查看当前所有用户
rabbitmqctl list_users

# 由于RabbitMQ默认的账号用户名和密码都是guest。为了安全起见, 先删掉默认用户
rabbitmqctl delete_user guest

# 必须先启动才能执行
# 添加新用户
rabbitmqctl add_user 用户名 密码
# 比如 rabbitmqctl add_user zanglikun zanglikun


# 设置权限,并开启远程访问
rabbitmqctl set_user_tags 用户名 administrator
rabbitmqctl set_permissions -p / 用户名 ".*" ".*" ".*"
# 比如 rabbitmqctl set_user_tags zanglikun administrator
# 比如 rabbitmqctl set_permissions -p / zanglikun ".*" ".*" ".*"

# 重启服务
service rabbitmq-server restart

访问吧 http://192.168.3.10:15672/ IP 你自己替换下

RabbitMQ角色说明

权限角色说明

1、 超级管理员(administrator)

可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。

2、 监控者(monitoring)

可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)

3、 策略制定者(policymaker)

可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息(上图红框标识的部分)。

4、 普通管理者(management)

仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。

5、 其他

无法登陆管理控制台,通常就是普通的生产者和消费者。

Virtual Hosts

每个Virtual Hosts相当于一个相对独立的RabbitMQ服务器,每个VirtualHost之间是相互隔离的。exchange、queue、message不能互通。

特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取全部资料 ❤