生产者发送消息到 broker server(RabbitMQ),在 Broker 内部,用户创建

Exchange/Queue,通过 Binding 规则将两者联系在一起,Exchange 分发消息,

根据类型/binding 的不同分发策略有区别,消息最后来到 Queue 中,等待消费

者取走。

JMS 是在 2001 年发布的 Java 消息服务(Java Message Service)应用程序接口,是一个 Java 平台中关于面向消息中间件(MOM,message oriented middleware) 的 API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信

二. RabbitMQ 单机部署

===================================================================================

官网下载地址

https://www.rabbitmq.com/download.html

github 下载地址

https://github.com/rabbitmq/rabbitmq-server/releases

Ubuntu安装单机 RabbitMQ

主机名解析:

在当前 MQ 服务器配置本地主机名解析:

172.18.0.51 mq-server1 mq-server1.qcq.net

安装基础命令及添加 key

sudo apt-get install curl gnupg

curl -fsSL https://github.com/rabbitmq/signingkeys/releases/download/2.0/rabbitmq-release-signing-key.asc | sudo apt-key add -

安装 apt HTTPS 传输

sudo apt-get install apt-transport-https

各节点添加 apt 源:

sudo tee /etc/apt/sources.list.d/bintray.rabbitmq.list <

Installs the latest Erlang 22.x release.

Change component to “erlang-21.x” to install the latest 21.x version.

“bionic” as distribution name should work for any later Ubuntu or Debian release.

See the release to distribution mapping table in RabbitMQ doc guides to learn more.

deb https://dl.bintray.com/rabbitmq-erlang/debian bionic erlang

deb https://dl.bintray.com/rabbitmq/debian bionic main

EOF

更新软件包列表并安装:

sudo apt-get update

apt-cache madison rabbitmq-server #查看可以安装的版本

apt install rabbitmq-server=3.7.22-1 #安装较新版本的 RabbitMQ

安装完成

启动 RabbitMQ 服务

systemctl start rabbitmq-server

systemctl enable rabbitmq-server

开启 web 界面管理插件:

下面这是一条命令

rabbitmq-plugins enable rabbitmq_management

listeners.tcp.default = 5673 消费者访问的 端口

15672:web 管理端口

25672:集群状态通信端口

登陆 web 管理界面:

rabbitmq 从 3.3.0 开始禁止使用 guest/guest 权限通过除 localhost 外的访问,直接访问报错如下:

允许方式:

vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.7.22/ebin/rabbit.app

#删除被禁止登陆的 guest 账户

39 {loopback_users, []},

#重启 rabbitmq 服务

systemctl restart rabbitmq-server.service

三. RabbitMQ 集群部署

===================================================================================

Rabbitmq 集群分为二种方式:

普通模式:创建好 RabbitMQ 之后的默认模式。

镜像模式:把需要的队列做成镜像队列。

普通集群模式:queue 创建之后,如果没有其它 policy,消息实体只存在于其中一个节点,A、B 两个 Rabbitmq 节点仅有相同的元数据,即队列结构,但队列的数据仅保存有一份,即创建该队列的 rabbitmq 节点(A 节点),当消息进入 A 节点的 Queue 中后,consumer 从 B 节点拉取时,RabbitMQ 会临时在 A、B 间进行

消息传输,把 A 中的消息实体取出并经过 B 发送给 consumer,所以 consumer 可以连接每一个节点,从中取消息,该模式存在一个问题就是当 A 节点故障后,B节点无法取到 A 节点中还未消费的消息实体。

镜像集群模式:

把需要的队列做成镜像队列,存在于多个节点,属于 RabbitMQ 的 HA 方案(镜像模式是在普通模式的基础上,增加一些镜像策略)该模式解决了上述问题,其实质和普通模式不同之处在于,消息实体会主动在镜像节点间同步,而不是在 consumer 取数据时临时拉取。该模式带来的副作用也很明显,除了降低系统性能外,如果镜像队列数量过多,加之大量的消息进入,集群内部的网络带宽将会被这种同步通讯大大消耗掉。所以在对可靠性要求较高的场合中适用,一个队列想做成镜像队列,需要先设置 policy,然后客户端创建队列的时候,rabbitmq 集群根据“队列名称”自动设置是普通集群模式或镜像队列。

集群中有两种节点类型:

内存节点:只将数据保存到内存

磁盘节点:保存数据到内存和磁盘。

内存节点虽然不写入磁盘,但是它执行比磁盘节点要好,集群中,只需要一个磁盘节点来保存数据就足够了如果集群中只有内存节点,那么不能全部停止它们,否则所有数据消息在服务器全部停机之后都会丢失

推荐设计架构:

在一个 rabbitmq 集群里,有 3 台或以上机器,其中 1 台使用磁盘模式,其它节点使用内存模式,内存节点无访问速度更快,由于磁盘 IO 相对较慢,因此可作为数据备份使用

Ubuntu 安装集群 RabbitMQ:

集群环境,三台服务器,具体 IP 如下:

172.18.0.51

172.18.0.52

172.18.0.53

主机名解析配置: 各 MQ 服务器配置本地主机名解析:

172.18.0.51 mq-server1 mq-server1.qcq.net

172.18.0.52 mq-server2 mq-server2.qcq.net

172.18.0.53 mq-server3 mq-server3.qcq.net

各服务器安装 RabbitMQ: 各 RabbitMQ 服务器安装基础命令及添加 key

sudo apt-get install curl gnupg

curl -fsSL https://github.com/rabbitmq/signingkeys/releases/download/2.0/rabbitmq-release-signing-key.asc | sudo apt-key add -

各 RabbitMQ 安装 apt HTTPS 传输

sudo apt-get install apt-transport-https

各 RabbitMQ 服务器添加 apt 源:

sudo tee /etc/apt/sources.list.d/bintray.rabbitmq.list <

Installs the latest Erlang 22.x release.

Change component to “erlang-21.x” to install the latest 21.x version.

“bionic” as distribution name should work for any later Ubuntu or Debian release.

See the release to distribution mapping table in RabbitMQ doc guides to learn more.

deb https://dl.bintray.com/rabbitmq-erlang/debian bionic erlang

deb https://dl.bintray.com/rabbitmq/debian bionic main

EOF

各 RabbitMQ 更新软件包列表并执行安装:

sudo apt-get update

#查看可以安装的版本

apt-cache madison rabbitmq-server

#安装较新版本的 RabbitMQ

apt install rabbitmq-server=3.7.22-1

启动 RabbitMQ 服务

Server1:

root@mq-server1:~# systemctl enable rabbitmq-server

root@mq-server1:~# systemctl start rabbitmq-server

Server2:

root@mq-server2:~# systemctl start rabbitmq-server

root@mq-server2:~# systemctl enable rabbitmq-server

Server3:

root@mq-server3:~# systemctl start rabbitmq-server

root@mq-server3:~# systemctl enable rabbitmq-server

创建 RabbitMQ 集群:

Rabbitmq 的集群是依赖于 erlang 的集群来工作的,所以必须先构建起 erlang 的集群环境,而 Erlang 的集群中各节点是通过一个 magic cookie 来实现的,这个cookie 存放在/var/lib/rabbitmq/.erlang.cookie 中,文件是 400 的权限,所以必须保证各节点 cookie 保持一致,否则节点之间就无法通信

各服务器关闭 RabbitMQ:

root@mq-server1:~# systemctl stop rabbitmq-server

root@mq-server2:~# systemctl stop rabbitmq-server

root@mq-server3:~# systemctl stop rabbitmq-server

在 mq-server1 同步.erlang.cookie 至其他两台服务器:

scp /var/lib/rabbitmq/.erlang.cookie 172.18.0.52:/var/lib/rabbitmq/.erlang.cookie

scp /var/lib/rabbitmq/.erlang.cookie 172.18.0.53:/var/lib/rabbitmq/.erlang.cookie

各服务器启动 RabbitMQ:

root@mq-server1:~# systemctl start rabbitmq-server

root@mq-server2:~# systemctl start rabbitmq-server

root@mq-server3:~# systemctl start rabbitmq-server

查看当前集群状态:

root@mq-server1:~# rabbitmqctl cluster_status

Cluster status of node rabbit@mq-server1 …

[{nodes,[{disc,[‘rabbit@mq-server1’]}]},

{running_nodes,[‘rabbit@mq-server1’]},

{cluster_name,<<“rabbit@mq-server1”>>},

{partitions,[]},

{alarms,[{‘rabbit@mq-server1’,[]}]}]

root@mq-server2:~# rabbitmqctl cluster_status

Cluster status of node rabbit@mq-server2 …

[{nodes,[{disc,[‘rabbit@mq-server2’]}]},

{running_nodes,[‘rabbit@mq-server2’]},

{cluster_name,<<“rabbit@mq-server2”>>},

{partitions,[]},

{alarms,[{‘rabbit@mq-server2’,[]}]}]

root@mq-server3:~# rabbitmqctl cluster_status

Cluster status of node rabbit@mq-server3 …

[{nodes,[{disc,[‘rabbit@mq-server3’]}]},

{running_nodes,[‘rabbit@mq-server3’]},

{cluster_name,<<“rabbit@mq-server3”>>},

{partitions,[]},

{alarms,[{‘rabbit@mq-server3’,[]}]}]

创建 RabbitMQ 集群:

在 mq-server1 作为内存节点连接起来,并作为内存节点,在 mq-server1 执行以下命令

#停止 app 服务

root@mq-server1:~# rabbitmqctl stop_app

#清空元数据

root@mq-server1:~# rabbitmqctl reset

Resetting node rabbit@mq-server1 …

#将 rabbitmq-server1 添加到集群当中,并成为内存节点,不加–ram 默认是磁盘节点

root@mq-server1:~# rabbitmqctl join_cluster rabbit@mq-server3 --ram

Clustering node rabbit@mq-server1 with rabbit@mq-server3

#启动 app 服务

root@mq-server1:~# rabbitmqctl start_app

Starting node rabbit@mq-server1 …

completed with 3 plugins.

在 mq-server2 作为内存节点连接起来,并作为内存节点,在 mq-server2 执行以下命令:

root@mq-server2:~# rabbitmqctl stop_app

Stopping rabbit application on node rabbit@mq-server2 …

root@mq-server2:~# rabbitmqctl reset

Resetting node rabbit@mq-server2 …

root@mq-server2:~# rabbitmqctl join_cluster rabbit@mq-server3 --ram

Clustering node rabbit@mq-server2 with rabbit@mq-server3

root@mq-server2:~# rabbitmqctl start_app

Starting node rabbit@mq-server2 …

completed with 0 plugins

将集群设置为镜像模式:

只要在其中一台节点执行以下命令即可:

root@mq-server1:~# rabbitmqctl set_policy ha-all “#” ‘{“ha-mode”:“all”}’

Setting policy “ha-all” for pattern “#” to “{“ha-mode”:“all”}” with priority “0” for

vhost “/” …

验证当前集群状态:

root@mq-server1:~# rabbitmqctl cluster_status

[{nodes,[{disc,[‘rabbit@mq-server3’]}, #集群中至少有一个节点是磁盘节点用于数

据持久化

{ram,[‘rabbit@mq-server2’,‘rabbit@mq-server1’]}]}, #集群中的内存节点

{running_nodes,[‘rabbit@mq-server2’,‘rabbit@mq-server3’,‘rabbit@mq-server1’]},

{cluster_name,<<“rabbit@mq-server3”>>}, #当前正在运行的节点

{partitions,[]},

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

最后

由于篇幅限制,小编在此截出几张知识讲解的图解

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取! 的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!**

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

最后

由于篇幅限制,小编在此截出几张知识讲解的图解

[外链图片转存中…(img-AU1LJgjq-1713372830029)]

[外链图片转存中…(img-z68t7PKY-1713372830029)]

[外链图片转存中…(img-hziU4Qe8-1713372830029)]

[外链图片转存中…(img-Vdmv7MXB-1713372830030)]

[外链图片转存中…(img-d3rM3uCO-1713372830030)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

精彩链接

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。