一、Eureka 正常工作流程

  • Service 服务作为 Eureka Client 客户端需要在启动的时候就要向 Eureka Server 注册中心进行注册,并获取最新的服务列表数据。
  • Eureka Server 之间通过 Peer To Peer 模式复制最新数据。
  • Eureka Client 通过心跳机制定时向 Eureka Server 续约,上报自己的状态,并获取最新的服务列表数据。
  • Eureka Client 在本地有一个localRegionApps变量,用来保存从 Eureka Server 拉取回来的服务列表数据。

二、主要看一下Eureka 异常场景下如何做到高可用

Eureka Client  在启动的时候发现 Eureka Server 都用不了,可能在Eureka Server启动失败,或者还没有启动,这样就会导致:

  • 客户端无法注册自己
  • 客户端无法获取服务列表

这样就无法和其他服务交互了,但是Eureka 可以通过他的备用机制解决这个问题。

Eureka Client 有一个属性:

1
eureka.client.backup-registry-impl

这是 Eureka 为 Client 提供的一个 fallback,在启动的时候如果访问不到 Eureka Server,就会使用备用的 registry,把 backup-reg

istry 返回的服务列表保存到本地 localRegionApps,这就可以正常和其他Service交互了。

2. 在服务正常运行期间 Eureka Server 出现部分不可用的场景

Client 在访问 Server 时,不会一直按照配置文件中的顺序,会随机调换顺序,这样可以防止某个Server成为访问热点。

Eureka Client 维护了一个不可用 Server 列表,如果发现某个 Server 不可用,会将其放入这个不可用列表。

Client 在访问 Server 时,会排除掉不可用列表中的Server。

比如 Eureka Client 配置了3个 Server,server1、server2、server3,假设 server3 故障了,Client 就把 server3 放入不可用列表,以后再访问 Server 时就排除掉 server3。

3. 正常运行期间 Eureka Server 全部不可用

Client 曾从 Server 正常获取过服务列表数据,本地localRegionApps 存有服务列表。

如果 Server 都挂了,那么 Client 的定时程序访问 Server 时会抛出异常,便不会更新localRegionApps变量,所以 Client 可以继续使用localRegionApps中的服务列表,与其他Service正常交互。

4. Eureka Client 未及时续约场景

Eureka Server 对于未续约的 Client 会认为它已经不可用了,就会从服务列表中删除。

但Client 未续约有时不是 Client 的问题,可能是因为网络因素,例如网络的抖动,所以,如果使用一刀切的判断方式,可能出现误判,Eureka 为了避免出现误判,设计了一种自我保护机制 Self Preservation

如果大面积出现了 Client 未续约的情况,不大可能这么多 Client 同时挂掉,为防止误判,就会开启自我保护,不会剔除 Client 实例,从而保护注册信息。

具体什么情况开启自我保护呢,可以配置一个阈值(默认值为 15%),只有在最近一分钟接收到的续约次数小于阈值的时候开启。

三、总结

Eureka 通过如下机制来达到高可用:

  • backup-registry

即使 client 启动的时候 Eureka Server 都不可用也没关系,通过备用 registry 可以拿到服务列表。

  • 不可用 Eureka Server 列表

client 会维护一个不可用server列表,避免访问失效的server。

  • 服务列表本地缓存

在 Eureka Server 都失效时,本地的服务列表不会更新,使其依然可用,也就可以继续使用其中的service信息。

  • Self Preservation

自我保护机制防止误删除client。

来源:内蒙古SEO

Spring Cloud Eureka 注册中心高可用机制的更多相关文章

  1. Spring Cloud(Dalston.SR5)--Eureka 注册中心高可用-服务提供和消费

    由于 Eureka 注册中心只是在内存中保存服务注册实例,并且没有将服务注册实例进行同步,因此我们需要对服务提供和消费进行调整,需要指定服务提供和消费的注册.服务发现的具体Eureka 注册中心配置, ...

  2. 跟我学SpringCloud | 第七篇:Spring Cloud Config 配置中心高可用和refresh

    SpringCloud系列教程 | 第七篇:Spring Cloud Config 配置中心高可用和refresh Springboot: 2.1.6.RELEASE SpringCloud: Gre ...

  3. IDEA 创建Spring cloud Eureka 注册中心

    IDEA 创建Spring cloud Eureka 注册中心 一. 首先创建一个maven project Next之后填好groupId与artifactId,Next之后填好项目名与路径,点击F ...

  4. Spring Cloud Eureka 注册中心集群搭建,Greenwich 最新版!

    Spring Cloud 的注册中心可以由 Eureka.Consul.Zookeeper.ETCD 等来实现,这里推荐使用 Spring Cloud Eureka 来实现注册中心,它基于 Netfl ...

  5. Spring Cloud(Dalston.SR5)--Eureka 注册中心高可用搭建

    高可用集群 在微服务架构这样的分布式环境中,我们需要充分考虑发生故障的情况,所以在生产环境中必须对各个组件进行高可用部署,对与微服务和服务注册中心都需要高可用部署,Eureka 高可用实际上就是将自己 ...

  6. Spring Cloud Eureka注册中心(快速搭建)

    Spring Cloud 详解Eureka注册中心@(微服务)[java|spring-cloud|eureka] Eureka 注册中心是入门Spring Cloud微服务架构的必学组件,是学习所有 ...

  7. Spring Cloud Config 配置中心高可用

    详细参见 <Spring Cloud 与 Docker微服务架构实战> p163-9.10 Spring Cloud Config 与 Eureka 配合使用 p163-9.12 Conf ...

  8. Eureka注册中心高可用及常用配置项

    一.前言 前面已经简单的介绍了 Eureka 注册中心的使用以及查看.下面将继续进行 Eureka 的说明以及应用. 二.Eureka 的高可用搭建 在实际生产项目中,为了保证服务的可用性,连续性,一 ...

  9. Eureka注册中心高可用集群配置

    Eureka高可用集群配置 当注册中心扛不住高并发的时候,这时候 要用集群来扛: 我们再新建两个module  microservice-eureka-server-2002  microservic ...

随机推荐

  1. python selenium学习

    selenium是一个python模块,具有自动化模拟浏览器的功能 selenium的中文文档地址:http://selenium-python-zh.readthedocs.io/en/latest ...

  2. poj3660(floyd最短路)

    题目链接:https://vjudge.net/problem/POJ-3660 题意:给出一个有向图,n个结点,每个结点的权值为[1,n]中的一个独特数字,m条边,如果存在边a->b,说明a的 ...

  3. LeetCode 581. 最短无序连续子数组(Shortest Unsorted Continuous Subarray)

    581. 最短无序连续子数组 581. Shortest Unsorted Continuous Subarray 题目描述 给定一个整型数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序 ...

  4. [HTTPS] - 请求API失败(Could not create SSL/TLS secure channel)之解决

    背景 在单元测试中请求 HTTPS API 失败. 异常 Result StackTrace:  at System.Web.Services.Protocols.WebClientProtocol. ...

  5. JDK1.8 的 HashMap 源码之注意事项

    文章目录 链表变树 树形结构与Comparable,性能极致与降低 链表与树之间转换的阈值 英语渣靠着翻译插件,大概翻译的,难免有错误之处,注意甄别: 链表变树 This map usually ac ...

  6. 04 Python的继承、方法重写、super()类、父类私密属性的调用

    继承 A类继承B类,A即可获得B类的全部公共属性和方法(包括内置属性和方法).格式如:class A(B): class Animal: def sleep(self): print("zZ ...

  7. PAT(B) 1062 最简分数(Java)

    题目链接:1062 最简分数 (20 point(s)) 题目描述 一个分数一般写成两个整数相除的形式:N/M,其中 M 不为0.最简分数是指分子和分母没有公约数的分数表示形式. 现给定两个不相等的正 ...

  8. Python虚拟环境virtualenv的安装与使用详解(转)

    virtualenv参考:https://www.jb51.net/article/114933.htm virtualenvwrapper参考:https://www.jianshu.com/p/7 ...

  9. 写一个RD一般需要多久?在迭代中新增的需求如何处理?如何做好项目管理?

    最近总是有些初入行的小伙们,经常会问我一些他们在工作工作的中疑问,我今天挑选出几个比较典型的问题和大家一起来讨论下. 问题如下: 写一个PRD一般需要多久? 在迭代中新增的需求如何处理? 如何做好项目 ...

  10. shell 学习笔记2-shell-test

    一.字符串测试表达式 前面一篇介绍:什么是shell,shell变量请参考: shell 学习笔记1-什么是shell,shell变量 1.字符串测试表达式参数 字符串需要用""引 ...