Eureka的设计理念

2023-05-16

目录

1.概述

1.1 服务实例如何注册到服务中心

1.2服务实例如何从服务中心剔除

1.3 服务实例信息的一致性问题

2.AP优于CP

3.Peer to Peer架构

3.1 主从复制

3.2 对等复制

4.Zone及Region设计

5.SELF PRESERVATION设计

1.概述

Eureka作为一个服务注册及发现中心,主要解决如下几个问题:

1.1 服务实例如何注册到服务中心

本质上就是在服务启动的时候,需要调用Eureka Server的REST API的register方法,去注册该应用实例的信息。对于使用Java的应用服务,可以使用Netflix的Eureka Client封装的API去调用;对于Spring Cloud的应用,可以使用spring-cloud-starter-netflix-eureka-client,基于Spring Boot的自动配置,自动帮你实现服务信息的注册。


1.2服务实例如何从服务中心剔除

正常情况下服务实例在关闭应用的时候,应该通过钩子方法或其他生命周期回调方法去调用Eureka Server的REST API的de-register方法,来删除自身服务实例的信息。另外为了解决服务实例挂掉或其他异常情况没有及时删除自身信息的问题,Eureka Server要求Client端定时进行续约,也就是发送心跳,来证明该服务实例还是存活的,是健康的,是可以调用的。如果租约超过一定时间没有进行续约操作,Eureka Server端会主动剔除。这一点Eureka Server采用的就是分布式应用里头经典的心跳模式。

1.3 服务实例信息的一致性问题

由于服务注册及发现中心不可能是单点的,其自身势必有个集群,那么服务实例注册信息如何在这个集群里保持一致呢?这跟Eureka Server的架构有关,其设计理念主要分AP优于CP、Peer to Peer架构、Zone及Region设计、SELF PRESERVATION设计四个方面。
 

2.AP优于CP

分布式系统领域有个重要的CAP理论,该理论由加州大学伯克利分校的Eric Brewer教授提出,由麻省理工学院的Seth Gilbert和Nancy Lynch进行理论证明。该理论提到了分布式系统的CAP三个特性:
(1)Consistency:数据一致性,即数据在存在多副本的情况下,可能由于网络、机器故障、软件系统等问题导致数据写入部分副本成功,部分副本失败,进而造成副本之间数据不一致,存在冲突。满足一致性则要求对数据的更新操作成功之后,多副本的数据保持一致。
(2)Availability:在任何时候客户端对集群进行读写操作时,请求能够正常响应,即在一定的延时内完成。
(3)Partition Tolerance:分区容忍性,即发生通信故障的时候,整个集群被分割为多个无法相互通信的分区时,集群仍然可用。


       对于分布式系统来说,一般网络条件相对不可控,出现网络分区是不可避免的,因此系统必须具备分区容忍性。在这个前提下分布式系统的设计则在AP及CP之间进行选择。不过不能理解为CAP三者之间必须三选二,它们三者之间不是对等和可以相互替换的。
      对于ZooKeeper,它是"C"P的,之所以C加引号是因为ZooKeeper默认并不是严格的强一致,比如客户端A提交一个写操作,ZooKeeper在过半数节点操作成功之后就返回,此时假设客户端B的读操作请求到的是A写操作尚未同步到的节点,那么读取到的就不是客户端A写操作成功之后的数据。如果在使用的时候需要强一致,则需要在读取数据的时候先执行一下sync操作,即与leader节点先同步下数据,这样才能保证强一致。在极端的情况下发生网络分区的时候,如果leader节点不在non-quorum分区,那么对这个分区上节点的读写请求将会报错,无法满足Availability特性。
       Eureka部署是在AWS的背景下设计的,其设计者认为,在云端,特别是在大规模部署的情况下,失败是不可避免的,可能因为Eureka自身部署失败,注册的服务不可用,或者由于网络分区导致服务不可用。针对这个问题,就需要Eureka在网络分区的时候,还能够正常提供服务注册及发现功能,因此Eureka需要选择满足Availability这个特性。

3.Peer to Peer架构

一般而言,分布式系统的数据在多个副本之间的复制方式,可分为主从复制和对等复制。

3.1 主从复制


主从复制就是Master-Slave模式,即有一个主副本,其他副本为从副本。所有对数据的写操作都提交到主副本,最后再由主副本更新到其他从副本。具体更新的方式,还可以细分为同步更新、异步更新、同步及异步混合。
对于主从复制模式来讲,写操作的压力都在主副本上,它是整个系统的瓶颈,但是从副本可以帮主副本分担读请求。

3.2 对等复制

即Peer to Peer的模式,副本之间不分主从,任何副本都可以接收写操作,然后每个副本之间相互进行数据更新。
        对于对等复制模式来讲,由于任何副本都可以接收写操作请求,不存在写操作压力瓶颈。但是由于每个副本都可以进行写操作处理,各个副本之间的数据同步及冲突处理是一个比较棘手的问题。
        Eureka Server采用的就是Peer to Peer的复制模式,其重点要解决的另外一个问题就是数据复制的冲突问题。针对这个问题,Eureka采用如下两个方式来解决:
·lastDirtyTimestamp标识
·heartbeat
针对数据的不一致,一般是通过版本号机制来解决,最后在不同副本之间只需要判断请求复制数据的版本号与本地数据的版本号高低就可以了。Eureka没有直接使用版本号的属性,而是采用一个叫作lastDirtyTimestamp的字段来对比。
如果开启SyncWhenTimestampDiffers配置(默认开启),当lastDirtyTimestamp不为空的时候,就会进行相应的处理:
·如果请求参数的lastDirtyTimestamp值大于Server本地该实例的lastDirtyTimestamp值,则表示Eureka Server之间的数据出现冲突,这个时候就返回404,要求应用实例重新进行register操作。

·如果请求参数的lastDirtyTimestamp值小于Server本地该实例的lastDirtyTimestamp值,如果是peer节点的复制请求,则表示数据出现冲突,返回409给peer节点,要求其同步自己最新的数据信息。
peer节点之间的相互复制并不能保证所有操作都能够成功,因此Eureka还通过应用实例与Server之间的heartbeat也就是renewLease操作来进行数据的最终修复,即如果发现应用实例数据与某个Server的数据出现不一致,则Server返回404,应用实例重新进行register操作。

4.Zone及Region设计

由于Netflix的服务大部分在Amazon上,因此Eureka的设计有一部分也是基于Amazon的Zone及Region的基础设施之上。
在Amazon EC2托管在全球的各个地方,它用Region来代表一个独立的地理区域,比如Eureka Server默认设置了4个Region:us-east-1、us-west-1、us-west-2、eu-west-1。

5.SELF PRESERVATION设计

在分布式系统设计里头,通常需要对应用实例的存活进行健康检查,比较关键的问题就是要处理好网络偶尔抖动或短暂不可用时造成的误判。Eureka Server端与Client端之间如果出现网络分区问题,在极端情况下可能会使得Eureka Server清空部分服务的实例列表,这个将严重影响到Eureka Server的Availability属性。因此Eureka Server引入了SELF PRESERVATION机制。
Eureka Client端与Server端之间有个租约,Client要定时发送心跳来维持这个租约,表示自己还存活着。Eureka通过当前注册的实例数,去计算每分钟应该从应用实例接收到的心跳数,如果最近一分钟接收到的续约的次数小于等于指定阈值的话,则关闭租约失效剔除,禁止定时任务剔除失效的实例,从而保护注册信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Eureka的设计理念 的相关文章

随机推荐

  • Android JNI配置CMakeLists.txt修改.cpp在logcat打印日志

    Android JNI配置CMakeLists txt修改 cpp在logcat打印日志 C C 43 43 代码里面常用的printf没法在Android 的logcat输出显示 需要特别配置C 43 43 才能显示在logcat里面 x
  • Android JNI/NDK C++代码读写手机上存放的文件

    Android JNI NDK C 43 43 代码读写手机上存放的文件 xff08 1 xff09 首先确保当前app已经获得读文件系统的权限 xff1a lt uses permission android name 61 34 and
  • kotlin,null let expression

    kotlin null let expression class Num var data Int 61 1 fun main args Array lt String gt val n 61 Num n data 61 null var
  • Unable to make field private final java.lang.String java.io.File.path accessible: module java.base d

    Android Studio编译报错 xff1a Unable to make field private final java lang String java io File path accessible module java ba
  • Android 引入hunter-debug监测代码运行时函数耗时和参数及返回值,Java(1)

    Android 引入hunter debug监测代码运行时函数耗时和参数及返回值 xff0c Java xff08 1 xff09 xff08 1 xff09 在工程的根build gradle文件里面添加cn quinnchen hunt
  • 阅读笔记-软件工程的大泥球

    软件工程的大泥球 xff08 原文地址 xff1a http www laputan org mud xff09 大泥球的定义 xff1a A BIG BALL OF MUD is a casually even haphazardly s
  • Android 引入hunter-timing监测UI主线程函数运行时耗时,Java(2)

    Android 引入hunter timing监测UI主线程函数运行时耗时 xff0c Java xff08 2 xff09 xff08 1 xff09 在工程的根build gradle文件配置 xff1a buildscript rep
  • 无人驾驶项目——交通标志识别

    在无人驾驶项目中 xff0c 实现交通标志识别是一项重要工作 本文以德国交通标志数据集为训练对象 xff0c 采用深度神经网络LeNet架构处理图像 xff0c 实现交通标志识别 具体处理过程包括包括 xff1a 数据导入 探索和可视化数据
  • SO_RCVBUFFORCE

    mytcp sockets allocated是到目前为止 xff0c 整个tcp协议中创建的socket的个数 xff0c 由mytcp prot的成员 sockets allocated指向 可以在 proc net sockstat文
  • n个球放k个盒子问题归纳

    问题描述 xff1a 有n个球 xff0c 放进k个盒子 xff0c 有多少种不同的放法 xff1f xff08 球必须全部放在盒子中 xff0c 不能丢弃 xff09 球可能相同 xff0c 也可能不同 xff0c 盒子亦然 另外 xff
  • Python模拟登录CSDN

    关于CSDN的模拟登录 xff0c 网上已经有相当一部分博主发过类似的文章 xff0c 我这里不过稍稍模仿下 xff0c 使用前辈们的经验时 xff0c 还是非常感激的 具体过程如下 xff1a xff08 1 xff09 确定登录页面的表
  • 【UNIX环境高级编程】UNIX基础知识

    UNIX环境高级编程 UNIX基础知识 1 UNIX体系结构 从严格意义上 xff0c 可将操作系统定义为一种软件 xff0c 它控制计算机硬件资源 xff0c 提供程序运行环境 xff0c 我们称这种软件为内核 内核的接口称为系统调用 公
  • postman能正常打开但不显示窗口

    1 最近使用postman偶尔出现以下问题 postman在任务栏能正常打开 xff0c 如下图 xff0c 使用Alt 43 Tab也能看到 xff0c 但是窗口就是显示不了 2 解决方案 将鼠标放在任务栏上 xff0c 使用快捷键Alt
  • Linux文件相关常用命令(超全超详细)

    目录 command终端命令格式 xff1a command options parameter 1 ls命令 2 cd命令 3 touch 命令 4 mkdir命令 5 pwd命令 6 clear 命令 7 rm命令 8 cp命令 9 m
  • Linux远程管理常用命令(超全超详细)【持续更新】

    目录 1 shutdown命令 2 ifconfig命令 3 uname命令 4 uptime命令 5 free命令 6 who命令 7 last命令 8 history命令 9 ping命令 10 chmod 命令 11 chown 命令
  • 基于springcloud 的Eureka的服务注册与发现

    1 注册中心用来管理每个服务与服务之间的依赖关系 xff08 服务治理 xff09 xff0c 存放服务地址相关信息 xff08 接口地址 xff09 2 服务提供者 xff1a 提供服务接口 3 服务消费者 xff1a 调用服务接口 4
  • 计算机系统层次存储结构

    问 xff1a 当前计算机系统一般会采用层次结构存储数据 xff0c 请介绍下典型计算机存储系统一般分为哪几个层次 xff0c 为什么采用分层存储数据能有效提高程序的执行效率 xff1f 所谓存储系统的层次结构 xff0c 就是把各种不同存
  • Springboot的cache缓存机制

    我们知道一个程序的瓶颈在于数据库 xff0c 我们也知道内存的速度是大大快于硬盘的速度的 当我们需要重复地获取相同的数据的时候 xff0c 我们一次又一次的请求数据库或者远程服务 xff0c 导致大量的时间耗费在数据库查询或者远程方法调用上
  • Python-异常处理+文件

    目录 1 异常处理 1 简单的异常捕获 2 捕获错误类型 3 捕获未知错误 4 完整的异常语法 5 异常的传递 6 抛出异常 2 文件 1 读取文件 2 读取文件后文件指针会改变 3 写入文件 4 分行读取文件 5 复制文件 6 复制大文件
  • Eureka的设计理念

    目录 1 概述 1 1 服务实例如何注册到服务中心 1 2服务实例如何从服务中心剔除 1 3 服务实例信息的一致性问题 2 AP优于CP 3 Peer to Peer架构 3 1 主从复制 3 2 对等复制 4 Zone及Region设计