微服务框架 SpringCloud微服务架构 服务异步通讯 53 MQ 集群 53.1 集群分类 53.2 普通集群

news2024/12/23 6:15:57

微服务框架

【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】

服务异步通讯

文章目录

      • 微服务框架
      • 服务异步通讯
      • 53 MQ 集群
        • 53.1 集群分类
          • 53.1.1 集群分类
        • 53.2 普通集群
          • 53.2.1 普通集群
          • 53.2.2 搭建普通 集群

53 MQ 集群

53.1 集群分类

53.1.1 集群分类

RabbitMQ的是基于Erlang语言编写,而Erlang又是一个面向并发的语言,天然支持集群模式。

RabbitMQ的集群有两种模式:

  • 普通集群:是一种分布式集群,将队列分散到集群的各个节点,从而提高整个集群的并发能力。

  • 镜像集群:是一种主从集群,普通集群的基础上,添加了主从备份功能,提高集群的数据可用性。

镜像集群虽然支持主从,但主从同步并不是强一致的【存在一定延迟】,某些情况下可能有数据丢失的风险。

因此在RabbitMQ的3.8版本以后,推出了新的功能:仲裁队列来代替镜像集群,底层采用Raft协议确保主从的数据一致性。

53.2 普通集群

53.2.1 普通集群

普通集群,或者叫标准集群(classic cluster),具备下列特征:

  • 会在集群的各个节点间共享部分数据,包括:交换机、队列元信息【队列的描述信息(反正不包含消息本身)】。不包含队列中的消息。

【举个栗子】

在这里插入图片描述

现在有三台 RabbitMQ

在这里插入图片描述

现在创建了一个交换机,它可以在各个MQ 上共享

在这里插入图片描述

现在创建了一个 test.queue1 的队列,在第一个节点上

在这里插入图片描述

那就只有第一个 节点有

在这里插入图片描述

同理,另外还有两个 队列

虽然没有消息,但是有队列的“元信息”

在这里插入图片描述

在另外两个节点上可以有q1 的名字、在哪儿 等信息

  • 当访问集群某节点时,如果队列不在该节点,会从数据所在节点传递到当前节点并返回

现在有个消费者

在这里插入图片描述

绑定了q1

但是它在访问的时候不小心 访问到了 第三个节点

在这里插入图片描述

但是在第三个 节点上没有q1,但是它有q1 的元信息,就是说q3 知道 q1 在哪儿

在消费者获取数据时,它就会帮助消费者 找到真正的q1

在这里插入图片描述

拿到数据后,从q3 返回

  • 队列所在节点宕机,队列中的消息就会丢失

比如说 现在的第一个节点挂了

在这里插入图片描述

因为q1 在第一个节点上,

在这里插入图片描述

队列也会跟着 就没了,现在消费者再来,就拿不到了,这就是普通集群

53.2.2 搭建普通 集群

【课前资料,永远滴神!!!!!!】

在这里插入图片描述

【集群分类】

在RabbitMQ的官方文档中,讲述了两种集群的配置方式:

  • 普通模式:普通模式集群不进行数据同步,每个MQ都有自己的队列、数据信息(其它元数据信息如交换机等会同步)。例如我们有2个MQ:mq1,和mq2,如果你的消息在mq1,而你连接到了mq2,那么mq2会去mq1拉取消息,然后返回给你。如果mq1宕机,消息就会丢失。
  • 镜像模式:与普通模式不同,队列会在各个mq的镜像节点之间同步,因此你连接到任何一个镜像节点,均可获取到消息。而且如果一个节点宕机,并不会导致数据丢失。不过,这种方式增加了数据同步的带宽消耗。

我们先来看普通模式集群,我们的计划部署3节点的mq集群:

主机名控制台端口amqp通信端口
mq18081 —> 156728071 —> 5672
mq28082 —> 156728072 —> 5672
mq38083 —> 156728073 —> 5672

集群中的节点标示默认都是:rabbit@[hostname],因此以上三个节点的名称分别为:

  • rabbit@mq1
  • rabbit@mq2
  • rabbit@mq3

【获取cookie】

RabbitMQ底层依赖于Erlang,而Erlang虚拟机就是一个面向分布式的语言,默认就支持集群模式。集群模式中的每个RabbitMQ 节点使用 cookie 来确定它们是否被允许相互通信。

要使两个节点能够通信,它们必须具有相同的共享秘密,称为Erlang cookie。cookie 只是一串最多 255 个字符的字母数字字符。

每个集群节点必须具有相同的 cookie。实例之间也需要它来相互通信。

我们先在之前启动的mq容器中获取一个cookie值,作为集群的cookie。执行下面的命令:

docker exec -it mq cat /var/lib/rabbitmq/.erlang.cookie

在这里插入图片描述

可以看到cookie值如下:

FXZMCVGLBIXZCDEMMVZQ

笔者的是 HULXWPIGGMYCNKDSPZAM

接下来,停止并删除当前的mq容器,我们重新搭建集群。

docker rm -f mq

在这里插入图片描述

OK

再清理一下数据卷 docker volume prune

在这里插入图片描述

OK

【准备集群配置】

在/tmp目录新建一个配置文件 rabbitmq.conf:

cd /tmp
# 创建文件
touch rabbitmq.conf

文件内容如下:

loopback_users.guest = false
listeners.tcp.default = 5672
cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_config
cluster_formation.classic_config.nodes.1 = rabbit@mq1
cluster_formation.classic_config.nodes.2 = rabbit@mq2
cluster_formation.classic_config.nodes.3 = rabbit@mq3

在这里插入图片描述

OK

再创建一个文件,记录cookie

cd /tmp
# 创建cookie文件
touch .erlang.cookie
# 写入cookie
echo "HULXWPIGGMYCNKDSPZAM" > .erlang.cookie
# 修改cookie文件的权限
chmod 600 .erlang.cookie

在这里插入图片描述

OK

准备三个目录,mq1、mq2、mq3:

cd /tmp
# 创建目录
mkdir mq1 mq2 mq3

在这里插入图片描述

然后拷贝rabbitmq.conf、cookie文件到mq1、mq2、mq3:

# 进入/tmp
cd /tmp
# 拷贝
cp rabbitmq.conf mq1
cp rabbitmq.conf mq2
cp rabbitmq.conf mq3
cp .erlang.cookie mq1
cp .erlang.cookie mq2
cp .erlang.cookie mq3

在这里插入图片描述

【启动集群】

创建一个网络:

docker network create mq-net

运行命令

docker run -d --net mq-net \
-v ${PWD}/mq1/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=itcast \
-e RABBITMQ_DEFAULT_PASS=123321 \
--name mq1 \
--hostname mq1 \
-p 8071:5672 \
-p 8081:15672 \
rabbitmq:3.8-management
docker run -d --net mq-net \
-v ${PWD}/mq2/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=itcast \
-e RABBITMQ_DEFAULT_PASS=123321 \
--name mq2 \
--hostname mq2 \
-p 8072:5672 \
-p 8082:15672 \
rabbitmq:3.8-management
docker run -d --net mq-net \
-v ${PWD}/mq3/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf \
-v ${PWD}/.erlang.cookie:/var/lib/rabbitmq/.erlang.cookie \
-e RABBITMQ_DEFAULT_USER=itcast \
-e RABBITMQ_DEFAULT_PASS=123321 \
--name mq3 \
--hostname mq3 \
-p 8073:5672 \
-p 8083:15672 \
rabbitmq:3.8-management

笔者在启动时,遇到特多问题,最主要的就是一个权限问题,说什么不能写入配置,笔者换成3.9 的RabbitMQ ,然后把配置文件的第一行删掉才启动成功 了

在这里插入图片描述

OK了

随便访问一个 ,试试8081

在这里插入图片描述

没问题

试试8082 和 8083

在这里插入图片描述

在这里插入图片描述

没毛病

在这里插入图片描述

但是我下面和老师不一样,它没有检测到 8083

啊这,感觉还是不行

在这里插入图片描述

笔者又重新启动了 一次,OK,仨都有了

【测试】

在mq1 这个节点上新建一个队列

在这里插入图片描述

直接创建

在这里插入图片描述

OK,创建完成

现在我直接切到 8082

在这里插入图片描述

没毛病

看看 8083

在这里插入图片描述

也没问题,这就是我们之前说 的【可以看到】

现在在 8081 上写点儿数据,直接发个消息到队列 里

在这里插入图片描述

等下

在这里插入图片描述

OK,mq1 节点上有了

看看另外两个节点

在这里插入图片描述

OK, 没毛病,能看到, 而且能拿到,虽然仅仅是 引用,但是取的时候可以 传过来

现在把MQ1 节点停掉 docker stop mq1

在这里插入图片描述

回到8082 的控制台

在这里插入图片描述

现在就是一个down 的状态 了

在这里插入图片描述

8083 直接啥也看不到了

重新启动mq1 docker start mq1

在这里插入图片描述

回到浏览器

在这里插入图片描述

OK,这样就恢复了 【这就是普通集群】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/99961.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2022 FIFA World Cup Final

我希望梅西能够捧杯,因为我怕再看见那个眼神!写在总决赛开始前 12/18/2022 22:04 在一个周日的晚上收到了邹总发的活动信,我记得还在CSDN问答区在回答问题,突然看见私信的红点,其实看到活动(活动链接点击这…

万字长文,彻底搞懂分布式缓存Redis

最近系统性地整理了Redis的知识点,在此和大家做些分享,希望能帮助到大家。 为什么Redis这么受欢迎 时代产物 随着互联网规模的不断扩张,越来越多的企业在技术架构上会采用分布式架构,而且对于系统的吞吐量以及响应速率的要求也…

非零基础自学Golang 第11章 文件操作 11.2 文件基本操作 11.2.3 文件写入 11.2.4 删除文件

非零基础自学Golang 文章目录非零基础自学Golang第11章 文件操作11.2 文件基本操作11.2.3 文件写入11.2.4 删除文件第11章 文件操作 11.2 文件基本操作 11.2.3 文件写入 与之前的文件读取相比,向文件写入内容也有两个接口,分别为Write和WriteAt。 fu…

数据管理篇之元数据

第12章 元数据 1.元数据概述 元数据定义 元数据是关于数据的数据。按照用途可以分为两类: 技术元数据 业务元数据 阿里巴巴常见的技术元数据: 分布式计算系统存储元数据 分布式计算系统运行元数据 数据开发平台中数据同步,计算任务、任务调…

【编译原理】第四章部分课后题答案

第 四 章 课 后 习 题 T 4.1 根据表4.1的语法制导定义,为输入表达式5∗(4∗32)5*(4*32)5∗(4∗32)构造注释分析树。 T 4.2 构造表达式((a∗b)(c))((a*b)(c))((a∗b)(c))的分析树和语法树: (a)根据表4.3的语法制导定义。 &…

C++中你不知道的namespace和using的用法

目录 引言 一: 冒号作用域 二、名字控制 1 命令空间 2 命令空间的使用 三、 using的指令 1 using的声明 2 using的编译指令 引言 你是不是只认为namespace 和 using 在C中是基本的语法框架,但是却不知道它们的真正用法,看完文章你会对using和name…

计算机毕设Python+Vue校园志愿者服务系统(程序+LW+部署)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

软件测试零基础如何快速入门 ?这里有全网最详细的学习资料

目录 前言 一、首先,我们要了解清楚用人部门对初级测试人员的定位: 二、清楚了初级测试人员需要具备的能力 三、找到正确的方向 四、最后需要做的就是储备自己的能力。 一.找本软件测试基础的书 二.写文档 三.执行测试 四.多关注技术博文 五、…

城市管理网站

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字): “模块划分:公告类型,公告信息,城管信息,居民信息,设诉类型&…

工程师为微型晶体管开发新的集成路线

新南威尔士大学悉尼团队展示了高 κ 钙钛矿膜如何充当二维晶体管的绝缘体 新南威尔士大学悉尼分校的研究人员开发了一种微小、透明且灵活的材料,可用作晶体管中的新型电介质(绝缘体)组件。 最近发表在《自然》杂志上的研究“高 κ 钙钛矿膜…

面试题61. 扑克牌中的顺子

晚上做了道题,写完看了大佬的题解发现自己很蠢,思维不够光想着模拟了,来回考虑细节磕磕绊绊写完这么一道题。虽然也是写出来了,复杂度都是ok的,不过代码长,处理细节麻烦。 记录一下这道题 从若干副扑克牌中…

对DataFrame的列标签增加后缀的DataFrame.add_suffix()方法

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 为DataFrame的列标签增加后缀 DataFrame.add_suffix() [太阳]选择题 关于以下python代码说法错误的一项是? import pandas as pd df pd.DataFrame({"A": [1,2],"B":[1…

基于Unity整合BEPUphysicsint物理引擎实战

上一节我们详细的讲解BEPUphysicsint 的物理事件。此物理引擎会产生了碰撞事件与非碰撞事件,碰撞事件大家好理解,非碰撞事件例如: 物理Entity的update事件,Entity的activation/deactivation事件等。本节课来实战如何编译BEPUphysicsint源码到自己的项目,…

Linux 服务器数据同步利器

一、简介 1 认识 Rsync(remote synchronize)是一个远程数据同步工具,可通过LAN/WAN快速同步多台主机间的文件。Rsync使用所谓的“Rsync算法”来使本地和远 程两个主机之间的文件达到同步,这个算法只传送两个文件的不同部分&#x…

【毕业设计_课程设计】基于机器视觉的害虫种类及数量检测(源码+论文)

文章目录0 项目说明1 研究目的2 研究内容及结论3 文件介绍4 论文目录5 项目源码0 项目说明 基于机器视觉的害虫种类及数量检测 提示:适合用于课程设计或毕业设计,工作量达标,源码开放 1 研究目的 研究的目的在于建立一套远程病虫害自动识别…

UNION 和 UNION ALL

合并查询结果 利用UNION关键字,可以给出多条SELECT语句,并将它们的结果组合成单个结果集。合并时,两个表对应的列数和数据类型必须相同,并且相互对应。 各个SELECT语句之间使用UNION或UNION ALL关键字分隔。 语法格式 SELECT c…

(附源码)node.js外卖平台 毕业设计 151448

摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于外卖平台当然也不能排除在外,随着网络技术的不断成熟,带动了外卖平台,它彻底改变了过去传统的管理方式…

神州数码交换机CS6200命令(二)

神州数码交换机CS6200命令(二) 1.基于流的重定向 QOS(Quality of Servcie)-服务品质保障,不产生新的带宽而是根据需求控制带宽 简易配置顺序: 1.配置分类表(class map) 对数据建立一个分类规则 2.配置策略表(policy map) 对…

左(9)--题目讲解

前言 仅记录学习笔记,如有错误欢迎指正。 题目: leetcode的洗衣机问题 思路: 首先看能不能数量相等 总和%机器数量 0 然后分情况讨论:对于任何一个位置都有至少需要搬动n次,最大值就是答案! 题目2&am…

APT最佳学习案例:写个简易版 ButterKnife

前言 目的:写个简易版 ButterKnife,借手写 ButterKnife 去了解如何实现注解、annotationProcessor 的等使用。 先看下butterknife的结构: 源码地址 https://github.com/LucasXu01/MyButterKnife ButterKnife的使用 在build.gradle添加依…