Eureka服务注册中心搭建好后页面有个错误信息怎么办?

  • 1.1 问题背景
  • 1.2 问题分析整理
  • 1.3 解决方案
  • 1.4参考资料

这篇博文总结下当使用Eureka 服务注册中心时页面可能出现的两个错误提示信息。

1.1 问题背景

当使用Eureka 搭建好服务注册中心的时候,页面百分之九十九可能会看到这个错误提示:

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

翻译成中文就是:

紧急! 如果不是,EUREKA可能会不正确地提出索赔要求。 续订比阈值要少,因此仅出于安全性考虑,实例不会过期。

有人说,在Eureka Server 服务注册中心的配置文件中将这个属性设置成false 就行了。

# 默认值是true
eureka.server.enable-self-preservation=false

但是当你修改成false 后会发现那个错误信息是消失了,但是却变成了这个新的错误信息

THE SELF PRESERVATION MODE IS TURNED OFF. THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.

翻译成中文就是:

自我保护模式已关闭。 在网络/其他问题的情况下,这可能无法保护实例到期。

这到底是什么意思呢?

1.2 问题分析整理

eureka.server.enable-self-preservation

解决上面问题的关键在于理解这个自我保护机制是什么意思?

  • 确保您已访问此页面以了解有关Eureka群集配置的信息。
  • Eureka客户端尝试与同一区域中的Eureka Server通信。如果在与服务器通信时遇到问题,或者该服务器不存在于同一区域中,则客户端将故障转移到其他区域中的服务器。
  • 服务器开始接收流量后,在服务器上执行的所有操作都将复制到服务器知道的所有对等节点。如果某个操作由于某种原因失败,那么该信息将在下一个检测信号上进行协调,该检测信号也会在服务器之间复制。
  • 当Eureka服务器启动时,它将尝试从相邻节点获取所有实例注册表信息。如果从节点获取信息有问题,则服务器会在放弃之前尝试所有对等节点。如果服务器能够成功获取所有实例,则它将基于该信息设置应接收的续订阈值。如果有任何时间,续订降到为此值配置的百分比以下(15分钟内低于85%),服务器将停止实例过期以保护当前实例注册表信息。
  • 在Netflix中,以上保护措施称为自我保护模式,主要用于在一组客户端和Eureka Server之间存在网络分区的情况下的保护措施。在这些情况下,服务器尝试保护它已经拥有的信息。在大规模中断的情况下,可能存在一些场景,这可能会导致客户端获取不再存在的实例。客户端必须确保它们对eureka服务器具有弹性,可以返回不存在或无响应的实例。在这些情况下,最好的保护是快速超时并尝试其他服务器。
  • 在这种情况下,如果服务器无法从相邻节点获取注册表信息,它将等待几分钟(5分钟),以便客户端可以注册其信息。服务器通过将流量仅偏向一组实例并导致容量问题,努力不向客户端提供部分信息。
  • Eureka服务器使用此处所述的Eureka客户端与服务器之间使用的相同机制相互通信。
  • 另外值得注意的是,可以在服务器上调整多种配置,包括在需要时进行服务器之间的通信。
    对等之间的网络中断期间会发生什么?
  • 如果对等点之间发生网络中断,则可能发生以下情况
    • 对等方之间的心跳复制可能会失败,并且服务器会检测到这种情况,并进入保护当前状态的自保留模式。
    • 注册可能发生在孤立的服务器上,某些客户端可能会反映新的注册,而其他客户端则可能没有。
    • 网络连接恢复到稳定状态后,情况会自动更正。当对等方能够正常通信时,注册信息会自动传输到不具有它们的服务器。
  • 最重要的是,在网络中断期间,服务器会尝试尽可能地具有弹性,但是在此期间,客户端可能会对服务器有不同的看法。
    我们知道Eureka 是一个服务治理框架,支持服务注册和服务发现。

也就是说,每个微服务实例都需要以每30秒一次的频率将自己注册的有效期限续签到Eureka Server.

这个时间间隔可以通过如下参数进行调整

#default second is 30
eureka.instance.leaseRenewalIntervalInSeconds=30
  • Renews (last min):表示最近一分钟从Eureka 实例收到的续订次数
  • Renews threshold:续订阀值,Eureka服务器期望每分钟从Eureka实例收到的续订阀值,初始化值最低为1 (次)

服务注册中心不注册自己: 2*(n+1)*0.85 只取整数部分

服务注册中心注册自己: 2*n*0.85 只取整数部分
如下图所示:

  • 如果registerWithEureka 设置成false,eureka.instance.leaseRenewalIntervalInSeconds 设置成30
  • 然后运行两个微服务实例,两个微服务实例将会每分钟发送4个续订,即Renews (last min):4
  • Eureka Server 最小的阀值是1, 所以阀值是5(此数字将乘以一个因子eureka.server.renewalPercentThreshold,将在后面讨论)

根据公式计算阀值:2*(2+1)*0.85= 5.1 只取整数部分5

SELF PRESERVATION MODE: if Renews (last min) 小于等于 Renews threshold, SELF PRESERVATION MODE(自我保护模式)将会被激活

因此在上例中,由于阈值为5,所以激活了SELF PRESERVATION MODE(自我保护模式),但是Eureka服务器每分钟只能接收4次更新。

  • 问题一:自我保护机制的目的是什么?文档中说客户端可以获取不存在的实例?建议打开还是关闭
  • SELF PRESERVATION MODE(自我保护模式)”旨在避免不良的网络连接失败。
  • Eureka实例A和B之间的连通性很好,但是B由于连接中断而未能在短时间内将其租约续签到Eureka服务器,此时Eureka服务器不能简单地将实例B踢出去。 尽管B可用,但A不会从Eureka服务器获得可用的注册服务。 因此,这是“自我保存模式”的目的
  • 最好将其打开
  • 问题二:我有一个单一的Eureka 服务器然后配置了 registerWithEureka: false 防止它注册到其他服务器上,为什么它会显示在阈值计数中?
  • 最小阈值1 是代码中写死的, registerWithEureka设置为false,因此将没有Eureka实例寄存器,阈值为1。
  • 在生产环境中,通常我们部署两个Eureka服务器,并将registerWithEureka设置为true。
  • 因此,阈值将为2,Eureka服务器将向其自身续租两次(每分钟两次),因此续订不超过阈值将不会有问题。
  • 问题三:对于我启动的每个客户,阈值计数都增加+2。 我猜是因为他们每分钟发送2条更新消息,对吗?
# 定义每分钟发送到服务器的更新数 default is 30 也就是每30秒续订一次
eureka.instance.leaseRenewalIntervalInSeconds=30
# default is 0.85
eureka.server.renewalPercentThreshold=0.85
  • 问题四:Eureka服务器从不发送续订,而最后一分钟续订始终低于阈值。 这正常吗?
renew threshold 5
rewnews last min: (client1) 2 + (client2) 2 -> 4

根据公式计算阀值:2*(2+1)*0.85= 5.1 只取整数部分5

是的,这很正常,因为阈值初始值设置为1。因此,如果registerWithEureka设置为false,则续订始终低于阈值。

1.3 解决方案

  • Renews (last min):表示最近一分钟从Eureka 实例收到的续订次数
  • Renews threshold:续订阀值,Eureka服务器期望每分钟从Eureka实例收到的续订阀值,初始化值最低为1

if Renews (last min) 小于等于Renews threshold, SELF PRESERVATION MODE(自我保护模式)将会被激活

自我保护模式的意义何在?

试想一种场景,当一个客户端,通过API Gateway 调用微服务A,如果微服务A宕机不可用,那么如果API Gateway如果仍旧不断向A发出请求,那么很快API Gateway 资源(比如线程)就会耗尽。当然我们可以使用服务熔断技术,这样可以解决这个问题,但是仍旧有一个问题就是如何判断这个微服务已经宕机了?是强检测还是包容检测?

我们知道Eureka 是一个服务注册中心,它的自我保护开启和关闭的区别其实在于:

  • 如果自我保护开始,也就是说当 eureka.server.enable-self-preservation=true 时候,Eureka 将会相对来说比较包容微服务和服务注册中心之间的弱网络情况(网络不稳有波动),比如等待90秒后,如果还未注册上,就将其从服务注册中心剔除。
  • 如果自我保护关闭,也就是说当eureka.server.enable-self-preservation=false时候,Eureka 将会一旦有微服务在规定时间内没续期成功就直接将其从列表移除,这样其实有些过于暴力,除非微服务和服务注册中心能确保长期处于带宽网络良好情况,否则网络一旦有波动就将微服务实例从列表剔除

对于出现的错误提示信息,可以修改Eureka 服务注册中心的配置文件如下所示进行修复:

# 默认值是true
eureka.server.enable-self-preservation=true
# default is 30
eureka.instance.leaseRenewalIntervalInSeconds=30
# default is 0.85 we can set the value to 0.49
eureka.server.renewalPercentThreshold=0.49

参数修改后重启,需要等待至少一分钟后方可看到效果。

n 表示注册到服务注册中心到微服务个数

  • 如果服务注册中心不注册自身,

    • 阀值计算公式:2*(n+1)*0.85 结果只取整数部分
  • 如果服务注册中心注册自身
    • 阀值计算公式:2*n*0.85 结果只取整数部分

如果n 等于3 ,不注册自身,按照默认值计算阀值

  • 2*(3+1)*0.85= 6.8 -> 6 == 实际每分钟续订次数 6 = 2*3

  • 2*(3+1)*0.49= 3.92 -> 3 < 实际每分钟续订次数 6 = 2*3

这也是为什么修改那个参数为0.49 就可以解决这个问题的原因。

解决上述问题的更好的建议是:

  • 如果生产环境最好部署至少两台服务注册中心,然后开启自注册,当一个服务注册中心不稳时候快速切换其他服务注册中心,实现高可用的目的。
  • 续订降到为此值配置的百分比以下(15分钟内低于85%),服务器将停止实例过期以保护当前实例注册表信息,如果觉得有必要也可以调整阀值检测比例为0.49.

1.4参考资料

  • Eureka never unregisters a service
  • EurekaServer: wrongly claims self preservation is turned off when renewal threshold is low
  • Understanding Spring Cloud Eureka Server self preservation and renew threshold
  • Understanding Eureka Peer to Peer Communication
  • Spring Cloud Netflix Eureka - The Hidden Manual

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT相关推荐

  1. EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY‘RE NOT. RENEWALS ARE LESSER

    启动两个client,过了一会,停了其中一个,访问注册中心时,界面上显示了红色粗体警告信息: EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANC ...

  2. Spring Cloud Eureka 自我保护机制(EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY)

    在本地启动一个Euraka-Server服务(服务注册中心)和一个Euraka-Client服务(服务注册者-应用服务)两个服务.过了一会儿后,在Euraka-Server界面显示:EMERGENCY ...

  3. Spring Cloud(三):Eureka控制台参数说明

    1.HOME 进入Eureka控制台首页,首先看HOME页的头部 System Status Environment: 环境,默认为test,该参数在实际使用过程中,可以不用更改 Data cente ...

  4. SpringCloud(一):深入理解Eureka

    实例和客户端的元数据 Eureka Metadata for Instances and Clients 0.Eureka的元数据字面理解 原文: It is worth spending a bit ...

  5. Spring Cloud Eureka 自我保护机制

    Spring Cloud Eureka 自我保护机制 Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这 ...

  6. Spring Cloud中,Eureka常见问题总结

    Spring Cloud中,Eureka常见问题总结. 1 eureka.environment: 指定环境 参考文档: 1 eureka.datacenter: 指定数据中心 参考文档: 使用配置项 ...

  7. 【学习笔记】Eureka服务治理代码实例、相关配置和原理机制详解

    文章目录 代码示例 启动一个服务注册中心 注册服务提供者 高可用注册中心 服务的发现与消费 Eureka的一些配置 服务注册类配置 服务实例类配置 实例名配置 端点配置 Eureka服务治理基础架构原 ...

  8. 【Java进阶】Eureka讲解与应用

    Eureka[juˈriːkə] 简介 Eureka是Netflix服务发现的服务端与客户端,Eureka提供服务注册以及服务发现的能力,当是Eureka Server时(注册中心),所有的客户端会向 ...

  9. Eureka的服务自我保护

    一个名字叫SPRINGCLOUD-EUREKA-CONSUMER,一个名字叫SPRINGCLOUD-EUREKA-PROVIDER,然后后面显示的是服务的详细信息,他的IP,服务名称,以及端口,然后U ...

  10. Eureka服务注册中心---SpringCloud

    Eureka服务注册中心 5.1 什么是Eureka Netflix在涉及Eureka时,遵循的就是API原则. Eureka是Netflix的有个子模块,也是核心模块之一.Eureka是基于REST ...

最新文章

  1. Windows7 libsvm库中grid.py的使用步骤
  2. arm gcc栈帧结构(1)
  3. nginx之location匹配规则
  4. cmw500综合测试仪使用_综合布线中手持式测试仪
  5. ORA-00018: maximum number of sessions exceeded 超出最大会话数
  6. leetcode89. 格雷编码
  7. Centos7.7之离线安装kubectl
  8. 孙鑫VC学习笔记:第十七讲 (二) 用匿名管道实现进程间的通信
  9. Mac 脚本编辑器(AppleScript)如何使用录制功能
  10. 【Word】如何实现特殊数字 带圈数字
  11. 【5】分享两个小而实用的IP扫描仪
  12. 喜欢是可以培养的,学习也是
  13. 410c 上安装中文版本的答题器游戏demo
  14. RTL8367学习笔记1——基础知识
  15. Layabox联手金山云,推出8折优惠大礼包!
  16. UDP协议全面实验分析详解
  17. ajax执行先后顺序
  18. 初学者-CSS思维导图(上)
  19. php计算两个坐标(经度,纬度)之间的方位角
  20. 【开餐馆】 动态规划

热门文章

  1. 无人机航测技术在地形测绘中的应用
  2. 站在巨人的肩膀上—英语
  3. AVAudioPlayer实现音乐播放+歌词与播放进度同步
  4. Opencvchina网站:把证件照蓝色背景转为白色
  5. Unity Editor 基础篇(三):自定义窗口
  6. 怎么取消工作组计算机,windows10系统如何退出workgroup工作组 windows10系统退出workgroup工作组的操作方法...
  7. Delphi7学习记录-demo实例
  8. 苹果,忘了发家的根本…
  9. 金华市电子计算机学校,金华市第十四届中小学生计算机竞赛结果
  10. 安装ubunut双系统,如何删除其中一个