面试官问我微服务注册中心如何保证数据强一致性?头秃了。。。

news2024/11/18 5:50:27

目录

  • 1、再回顾:什么是服务注册中心?
  • 2、Consul服务注册中心的整体架构
  • 3、Consul如何通过Raft协议实现强一致性?
  • 4、Consul如何通过Agent实现分布式健康检查?

1、再回顾:什么是服务注册中心?

先回顾一下什么叫做服务注册中心?

顾名思义,假设你有一个分布式系统,里面包含了多个服务,部署在不同的机器上,然后这些不同机器上的服务之间要互相调用。

举个现实点的例子吧,比如电商系统里的订单服务需要调用库存服务,如下图所示。

在这里插入图片描述

现在的问题在于,订单服务在192.168.31.154这台机器上,库存服务在192.137.1.33这台机器上。

现在订单服务是想要调用库存服务,但是他并不知道库存服务在哪台机器上啊!毕竟人家都是在不同机器上的。

所以这个时候就需要服务注册中心出场了,这个时候你的系统架构中需要引入独立部署在一台机器上的服务注册中心,如下图所示。

然后订单服务、库存服务之类的兄弟,都需要配置上服务注册中心部署在哪台机器上,比如192.168.31.45这台机器。

在这里插入图片描述

接着订单服务、库存服务他们自己启动的时候,就得发送请求到到服务注册中心上去进行服务注册。

也就是说,得告诉服务注册中心,自己是哪个服务,然后自己部署在哪台机器上。

然后服务注册中心会把大家注册上来的信息放在注册表里,如下图。

在这里插入图片描述

接着订单服务假如想要调用库存服务,那么就找服务注册中心问问:能不能告诉我库存服务部署在哪台机器上

服务注册中心是知道这个信息的,所以就会告诉订单服务:库存服务部署在192.1371.133这台机器上,你就给这台机器发送请求吧。

然后,订单服务就可以往库存服务的那台机器发送请求了,完成了服务间的调用。

整个过程,如下图所示:

在这里插入图片描述

上述就是服务注册中心的作用、地位以及意义,现在大家应该知道服务注册中心的作用了吧。

好!接着我们就来看看Consul作为服务注册中心,他的架构设计原理是什么?


2、Consul服务注册中心的整体架构

如果要基于Consul作为服务注册中心,那么首先必须在每个服务所在的机器上部署一个Consul Agent,作为一个服务所在机器的代理。

然后还得在多台机器上部署Consul Server,这就是核心的服务注册中心。

这个Consul Agent可以用来收集你的服务信息然后发送给Consul Server,还会对你的服务不停的发送请求检查他是否健康。

然后你要发现别的服务的时候,Consul Agent也会帮你转发请求给Consul Server,查询其他服务所在机器。

Consul Server一般要求部署3~5台机器,以保证高可用以及数据一致性。

他们之间会自动实现数据同步,而且Consul Server集群会自动选举出一台机器作为leader,其他的Consul Server就是follower。

咱们看下面的图,先感受一下这个Consul他整体的架构。

在这里插入图片描述

3、Consul如何通过Raft协议实现强一致性?

OK,那么这里就来讨论一下Consul是如何实现数据一致性的。

首先,大家知道Consul Server是部署集群的,而且他会选举出来一台Server作为Leader。

接下来各个服务发送的注册请求都会落地给Leader,由Leader同步给其他Follower。

所以首先第一点,Leader Server是绝对有最新的服务注册信息的,是不是?

比如库存服务发起注册了,那么Leader Server上一定有库存服务的注册信息。

接着如果比如订单服务要发现库存服务的话,这个查询请求会发送给Leader Server。

这样服务注册和发现,都是通过一台Leader Server来进行的,就可以保证服务注册数据的强一致性了,大家看下图。

在这里插入图片描述

接着大家想,假如说库存服务在注册的时候数据刚写到Leader Server,结果Leader Server就宕机了,这时候怎么办

那么此时这条注册数据就丢失了,订单服务就没法发现那个库存服务了。没关系,这里Consul会基于Raft协议来解决这个问题

首先,库存服务注册到Leader Server的时候,会采取Raft协议,要求必须让Leader Server把这条注册数据复制给大部分的Follower Server才算成功。

这就保证了,如果你认为自己注册成功了,那么必然是多台Consul Server都有这条注册数据了。

如果你刚发送给Leader Server他自己就宕机了,那么这次注册会认为失败。

此时,Consul Server集群会重新选举一个Leader Server出来,你需要再次重新注册。

这样就可以保证你注册成功的数据绝对不会丢,然后别人发现服务的时候一定可以从Leader Server上获取到最新的强一致的注册数据。

整个过程,如下图所示:

在这里插入图片描述

上面的图就可以看到,只要你注册的时候基于Raft协议强制同步到大多数Server,哪怕是Leader挂了,也会选举新的Leader。

这样就可以让别人从新的Leader Server来发现你这个服务,所以数据是绝对强一致的。


4、Consul如何通过Agent实现分布式健康检查?

最后说说Consul是如何通过各个服务机器上部署Agent来实现分布式健康检查的。

集中式的心跳机制,比如传统的Eureka,是让各个服务都必须每隔一定时间发送心跳到Eureka Server。

如果一段时间没收到心跳,那么就认为这个服务宕机了。

但是这种集中式的心跳机制会对Eureka Server造成较大的心跳请求压力,实际上平时Eureka Server接收最多的请求之一就是成千上万服务发送过来的心跳请求。


所以Consul在这块进行了架构优化,引入了Agent概念。

每个机器上的Consul Agent会不断的发送请求检查服务是否健康,是否宕机。如果服务宕机了,那么就会通知Consul Server。

怎么样?是不是发现各个服务自己不用再发送心跳请求去Server了?减小了Server这部分的压力吧?

没错,这就是Consul基于Agent实现的分布式健康检查机制,可以大幅度的减小Server端的压力。

这样一来,哪怕你就部署个三五台机器,可以轻松支持成千上万个服务。

咱们再来一张图,一起来看看:

在这里插入图片描述

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

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

相关文章

Promise 详解

Promise 详解示例一个抽奖小游戏原生 JavaScript 实现Promise 实现读取文件原生 JavaScript 实现Promise 实现Promise 对象Promise 对象的状态Promise 对象的创建Promise 对象的状态的改变pending 转换为 fulfilledpending 转换为 rejected与 Promise 对象相关的 APIPromise.th…

Linux---gdb调试方法

1. 背景 程序的发布方式有两种,debug模式和release模式 Linux gcc/g出来的二进制程序,默认是release模式 要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项2. gdb调试 进入/退出调试: list/l 行号:显…

佳能2420报错代码E000007-0000

应该是定影的问题,先试一下清零,如果还是出现这个问题,不是电压就是应该换定影了。(包含:轴套、定影膜、缺硅油了【定影膜硅油、润滑脂】) 维修模式菜单: CLEAR > ENGIN > ERRCLR &…

交大博士学长:研究生计算机专业的方向选择!

Datawhale干货 作者:一辈闲,上海交大博士,Datawhale邀约作者作者知乎:https://www.zhihu.com/people/yi-bei-xian-16目前计算机专业的研究方向主要分为四个大方向分别是:AI(人工智能)、Systems&…

常微分方程组解稳定性的分析

文章未完相空间的绘制我们随机选一个方程,随机选的,不是有数学手册吗,一般来说考题不可能出数学手册上的例子import scipy.integrate as si import matplotlib.pyplot as plt import numpy as np## dx/dt x**2-y**2xy ## dy/dt x*y**2 - x**2*yf lambda x,y:x**2-y**2xy g…

HashMap、HashTable和ConcurrentHashMap的区别

HashMap是线程不安全的,HashTable和ConcurrentHashMap是线程安全的。HashTable的实现线程安全的方式是:将所有的方法都加上锁,也就相当于对this加锁,此时,无论访问HashTable的任何一个元素都会加锁操作,在多…

ESP32设备驱动-MMA8451加速度计驱动

MMA8451加速度计驱动 1、MMA8451介绍 MMA8451 是一款具有 14 位分辨率的低功耗加速度计,具有灵活用户可编程选项的嵌入式功能,可配置为两个中断引脚。嵌入式中断功能可实现整体节能,从而使主机处理器免于连续轮询数据访问低通滤波数据和高通滤波数据,最大限度地减少颠簸检…

DockerCompose安装卸载、文件语法格式

DockerCompose安装卸载、文件语法格式 一、DockerCompose的概念和作用 1.1 相关概念 DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,不需要我们手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如…

【蓝桥杯】时间显示(省赛)Java

【问题描述】 小蓝要和朋友合作开发一个时间显示的网站。在服务器上,朋友已经获取了当前的时间,用一个整数表示,值为从1970年1月1日O0:00:00到当前时刻经过的毫秒数。 现在,小蓝要在客户端显示出这个时间。小蓝不用显示出年月日&a…

IIC通信协议

数据有效性 IC由两条线组成,一条双向串行数据线SDA,一条串行时钟线SCL。 SDA线上的数据必须在时钟的高电平周期保持稳定,数据线的高或低电平状态只有在 SCL 线的时钟信号是低电平时才能改变。 换言之, SCL为高电平时表示有效数据…

Crack:结构分析和设计软件:Cross Section Analysis-Design

Cross Section Analysis & Design (美国、欧洲、亚洲和澳大利亚最受好评的结构软件)是一款功能强大的应用程序,可以执行各种横截面计算,包括钢筋混凝土截面的设计(钢筋计算器)。所提供的横截面可以是简…

Python之argparse模块的使用

我们在写一个成熟的Python项目时候,需要传入若干指定的参数。而不是写死在程序里,这个时候就要用到argparse模块。argparse 是 Python 内置的一个用于命令项选项与参数解析的模块,通过在程序中定义好我们需要的参数,argparse 将会…

【FPGA笔记系列3】assign语句和if-esle语句

结构化建模 前面几节中采用的方法称为结构化建模。 assign语法(数据流建模方式) assign语句仅能描述组合逻辑电路,没有涉及时钟、触发器等! 五人投票电路(由于CGD100板子原因,需修改逻辑使按下点亮,弹起熄灭) 因为板子当key按下时为低电平,弹起时为高电平;led高电平点…

MyBatis查询接收数据 批量删除

MyBatis查询接收数据 批量删除查询出的数据只有一条通过实体类对象接收通过List集合接收通过map集合接收查询出的数据有多条通过list集合接收通过map类型的list集合接收MapKey注解模糊查询批量删除${}和#{}的区别查询出的数据只有一条 通过实体类对象接收 mapper接口代码: 映射…

Lr 12 ACR 15:传统蒙版工具

在 Lr 或 ACR 中,可以用各种不同的方式创建或添加蒙版。其中主题、天空、背景、对象及人物(若照片上有)都是由 AI 技术提供支持。画笔、线性渐变、径向渐变、范围等是传统的蒙版工具。画笔Brush手动绘制要选择的区域。创建一个画笔&#xff1…

C#,图像二值化(24)——局部阈值算法的NiBlack算法及源程序

1、局部阈值算法的NiBlack算法摘要-医学图像的处理最为复杂人和计算机。磁性捐赠的脑组织共振成像(MRI)在许多领域是非常重要的问题例如手术和治疗。最常见的分割图像的最简单方法是使用阈值。在这项工作中,我们提出了一个有效的实现阈值&…

SpringBoot整合Mybatis和MybatisPlus

目录 一、整合MyBatis操作 1、配置模式 2、注解模式 3、混合模式 二、整合 MyBatis-Plus 完成CRUD 1、什么是MyBatis-Plus 2、整合MyBatis-Plus 3、CRUD功能 一、整合MyBatis操作 官网:MyBatis GitHub SpringBoot官方的Starter:spring-boot-st…

兼容东西,贯通南北:超聚变的“四水归堂”

四水归堂,是中国建筑艺术中的一种独特形式。这种形式下,由四面房屋围出一个天井,房屋内侧坡向天井内倾斜,下雨时雨水会从东西南北四方流入天井,从而起到收集水源,防涝护屋的作用,寓意水聚天心&a…

每日一问-ChapGPT-20230114-关于小年

文章目录每日一问-ChapGPT系列起因每日一问-ChapGPT-20230114-关于小年腊月每天都做些什么的歌谣为什么现在的年味淡了很多,感觉不到过年为什么春节放假要调休,不能多放几天吗说说现在世界上极端气候,以及多少年后,地球存在不适宜…

Asp.Net项目的部署到Linux中(Linux + Jexus+Nginx )

因为老项目用的Asp.Net Web API技术开发部署到Window系统上,而新项目用的是.Net Core部署到Ubuntu系统中,所以在管理切换上有些不便。于是决定将老项目的测试服部署到Ubuntu中,试试水。 一、简述 要实现Asp.Net项目部署到Linux中&#xff0c…