Eureka 系列(02)Eureka 一致性协议

Eureka 是由 Netflix 基于 AP 模型的服务发现中间件,包括服务发现服务器和客户端的。相关文档推荐:一是 Spring Cloud Eureka 官网,二是 Eureka源码解析

本系列源码分析基于 spring-cloud-starter-netflix-eureka-2.1.1.RELEASE 和 Eureka-1.9.8。

0. Spring Cloud 系列目录 - Eureka 篇

1. 服务发现方案对比

1.1 技术选型

表1:Spring Cloud 服务发现方案对比

技术选型 CAP模型 适用规模(建议) 控制台管理 社区活跃度
Eureka AP <30k 支持
Zookeeper CP <20k 不支持
Consul AP <5k 支持
Nacos AP/CP 100k+ 支持 靠大家啦☺

注: 以上数据来源于 小马哥技术周报

1.2 数据模型

表2:Spring Cloud 服务发现数据模型

框架 集群(框架) 服务应用 服务集群 服务实例 租约管理
Spring-Cloud -- (serviceId) -- ServiceInstance --
Nacos Server Service Cluster Instance --
Eureka (serviceUrl) Application(appName) -- InstanceInfo(id) Lease

不同的框架对应的数据结构不太一致,在此做一些约定:

  1. 服务器集群 Server:指的是 Eureka Server 本身的集群。用 Server 代替,也可能是 ServerList 之类,总之与 Server 或 Peer 或 Node 相关的都代表框架自身的集群。
  2. 服务 Service:代表一个应用,可能包含多个服务实例。 Service(服务)serviceIdApplication(应用)appName
  3. 集群 Cluster:一个 Service 可能包含多个 Cluster,Cluster 包含多个具体的实例。这是 Nacos 中的概念。
  4. 服务实例 ServiceInstance:代表注册的一个具体实例。ServiceInstance(服务实例)InstanceInfo(实例id)Instance(实例)

2. Eureka 一致性协议

Eureka 和 Zookeeper 的最大区别: Eureka 是 AP 模型,Zookeeper 是 CP 模型。在出现脑裂等场景时,Eureka 可用性是每一位,也就是说出现脑裂时,每个分区仍可以独立提供服务,是去中心化的。更多 Eureka与ZooKeeper 的比较

那 Eureka 是如何实现最终一致性的呢?

2.1 消息广播

  1. Eureka Server 管理了全部的服务器列表(PeerEurekaNodes)

  2. 当 Eureka Server 收到客户端的注册、下线、心跳请求时,通过 PeerEurekaNode 向其余的服务器进行消息广播,如果广播失败则重试,直到任务过期后取消任务,此时这两台服务器之间数据会出现短暂的不一致。

    注意: 虽然消息广播失败,但只要收到客户端的心跳,仍会向所有的服务器(包括失联的服务器)广播心跳任务。

  3. 如果网络恢复正常,收到了其它服务器广播的心跳任务,此时可能有三种情况:

    1. 一是脑裂很快恢复,一切正常;
    2. 二是该实例已经自动过期,则重新进行注册;
    3. 三是数据冲突,出现不一致的情况,则需要发起同步请求,其实也就是重新注册一次,同时踢除老的实例。

    总之,通过集群之间的消息广播可以实现数据的最终一致性。

2.1.2 服务注册

  1. Spring Cloud Eureka 在应用启动时,会在 EurekaAutoServiceRegistration 这个类初始化的时候,主动去 Eureka Server 端注册。
  2. Eureka 在启动完成之后会启动一个 40 秒执行一次的定时任务,该任务会去监测自身的 IP 信息以及自身的配置信息是否发生改变,如果发生改变,则会重新发起注册。
  3. 续约返回 404 状态码时,会去重新注册

2.1.3 主动下线

Eureka 会在 spring 容器销毁的时候执行 shutDown 方法 ,该方法首先会将自身的状态改为 DOWN,接着发送cancle 命令至 Eureka Server 请求下掉自己的服务。

2.1.4 心跳续约与自动下线

健康检测,一般都是 TTL(Time To Live) 机制。eg: 客户端每 5s 发送心跳,服务端 15s 没收到心跳包,更新实例状态为不健康, 30s 未收到心跳包,从服务列表中删除。

Eureka Server 默认每 30s 发送心跳包,90s 未收心跳则删除。这个清理过期实例的线程,每 60s 执行一次。

2.2 崩溃恢复

2.2.1 重启

Spring Cloud Eureka 启动时,在初始化 EurekaServerBootstrap#initEurekaServerContext 时会调用 PeerAwareInstanceRegistryImpl#syncUp 从其它 Eureka 中同步数据。

2.2.2 脑裂

  • 发生脑裂后:和 Eureka Server 同区的服务可以正常访问,而不同区的服务则自动过期。
  • 脑裂恢复后:接收其它 Eureka Sever 发送过来的心跳请求,此时有三种情况:一是脑裂很快恢复,一切正常;二是该实例已经自动过期,则重新进行注册;三是数据冲突,出现不一致的情况,则需要发起同步请求。

3. 可靠性

3.1 高可用客户端(Client HA)

当有多个 Eureka Server 时,第一台宕机时会从下一台同步数据。注意:只有当第一台宕机时才会同步第二台,否则永远只会从第一台同步数据。

3.2 自我保护

如果每分钟的续约数小于阀值时 ,则开启自我保护机制,Eureka Server 将不会主动清除过期实例。


每天用心记录一点点。内容也许不重要,但习惯很重要!

Eureka 系列(02)Eureka 一致性协议的更多相关文章

  1. Eureka系列(一)Eureka功能介绍

    Eureka核心功能点 服务注册(register):   Client会发送一次Rest请求给Server端来实现注册,Server接受到请求会将服务信息存储起来,并将注册信息给同集群其他Serve ...

  2. Eureka系列(九)Eureka自我保护机制

      因为本篇简文并不是自己总结的,而是当了下搬运工,所以直接直接附上原作者博客链接. 参考链接:   1.SpringCloud Eureka自我保护机制   2.Spring Cloud Eurek ...

  3. Eureka 系列(01)最简使用姿态

    目录 Eureka 系列(01)最简使用姿态 0. Spring Cloud 系列目录 - Eureka 篇 1. 服务发现与发现 1.1 服务发现(Service Discovery) 1.2 服务 ...

  4. Eureka 系列(08)心跳续约与自动过期

    Eureka 系列(08)心跳续约与自动过期 [TOC] Spring Cloud 系列目录 - Eureka 篇 在上一篇 Eureka 系列(07)服务注册与主动下线 中对服务的注册与下线进行了分 ...

  5. Eureka 系列(05)消息广播(上):消息广播原理分析

    Eureka 系列(05)消息广播(上):消息广播原理分析 [TOC] 0. Spring Cloud 系列目录 - Eureka 篇 首先回顾一下客户端服务发现的流程,在上一篇 Eureka 系列( ...

  6. Eureka 系列(04)客户端源码分析

    Eureka 系列(04)客户端源码分析 [TOC] 0. Spring Cloud 系列目录 - Eureka 篇 在上一篇 Eureka 系列(01)最简使用姿态 中对 Eureka 的简单用法做 ...

  7. Spring Cloud 系列之 Eureka 实现服务注册与发现

    如果你对 Spring Cloud 体系还不是很了解,可以先读一下 Spring Cloud 都有哪些模块 Eureka 是 Netflix 开源的服务注册发现组件,服务发现可以说是微服务架构的核心功 ...

  8. Eureka 系列(07)服务注册与主动下线

    Eureka 系列(07)服务注册与主动下线 [TOC] Spring Cloud 系列目录 - Eureka 篇 在上一篇 Eureka 系列(05)消息广播 中对 Eureka 消息广播的源码进行 ...

  9. Eureka 系列(06)消息广播(下):TaskDispacher 之 Acceptor - Worker 模式

    Eureka 系列(06)消息广播(下):TaskDispacher 之 Acceptor - Worker 模式 [TOC] Spring Cloud 系列目录 - Eureka 篇 Eureka ...

随机推荐

  1. soket通信

    import socket #socket采用cs结构,client and Server B/S browser and server sock = socket.socket(socket.AF_ ...

  2. Https socket 连接

    介: 本文主要介绍了网络安全通讯协议 SSL/TLS 和 Java 中关于安全通讯的实现部分.并通过一个简单的样例程序实现,来展示如何在 Java 平台上正确建立安全通讯. 在人类建立了通信系统之后, ...

  3. iview 分割面板效果(一)基本原理

    方法一: 基本点就是:利用“子绝父相(子元素相对于父元素进行定位)”, 左侧的pane设置为left:0;right:a%, 则右侧的设置为right:0;left:(100-a)%. 如果左右之间有 ...

  4. 看不到但摸得到的捣蛋鬼---Zero Width Space

    看不到但摸得到的捣蛋鬼---Zero Width Space 1.情况如何? 昨天,"某某某"的代码出现了一个bug.大概是这个情况: 有一个提示信息,需要展示,大概这样: 这行文 ...

  5. Android中Parcelable的原理和使用方法

    Parcelable的简单介绍 介绍Parcelable不得不先提一下Serializable接口,Serializable是Java为我们提供的一个标准化的序列化接口,那什么是序列化呢? 进行And ...

  6. 第八组Postmortem事后分析

    第八组Postmortem事后分析 一.团队成员总结的改进和教训 隆晋威:Beta阶段完善架构设计,分工更加明确,文档更丰富,交流带来开销减少.Alpha技术选型不固定,分工混乱,没有方便的测试引擎, ...

  7. linux上传与下载文件命令

    //文件从Linux系统上传到其他系统. sz空格+文件名 //文件从其他系统下载到Linux系统. rz //之后会弹出路径选择框,选择文件,即可下载到当前路径.

  8. go语言从例子开始之Example21.协程

    Go 协程 在执行上来说是轻量级的线程. golang使用协程用go关键字.后边正常调用函数. Example: package main import "fmt" func ak ...

  9. Maven介绍及安装

      1.maven是一个管理第三方库的jar package 2.从该页面下载相应的Maven jar包(http://maven.apache.org/download.cgi),linux OS下 ...

  10. MySQL数据类型DECIMAL用法详解

    MySQL DECIMAL数据类型用于在数据库中存储精确的数值.我们经常将DECIMAL数据类型用于保留准确精确度的列,例如会计系统中的货币数据. 要定义数据类型为DECIMAL的列,请使用以下语法: ...