【问题标题】:Understanding Spring Cloud Eureka Server self preservation and renew threshold了解Spring Cloud Eureka Server自我保存和续订门槛
【发布时间】:2016-02-28 12:59:09
【问题描述】:

我是开发微服务的新手,虽然我已经研究了一段时间,阅读了 Spring 的文档和 Netflix 的文档。

我已经开始了一个简单的项目available on Github。它基本上是一个 Eureka 服务器(Archimedes)和三个 Eureka 客户端微服务(一个公共 API 和两个私有 API)。详细说明请查看 github 的自述文件。

关键是,当一切都在运行时,我希望如果其中一个私有微服务被杀死,Eureka 服务器会意识到并将其从注册表中删除。

found this question on Stackoverflow,解决方案通过在 Eureka 服务器配置中使用 enableSelfPreservation:false。一段时间后执行此操作,被终止的服务会按预期消失。

但是我可以看到以下消息:

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

1.自我保护的目的是什么? doc 声明在 上进行自我保存“客户端可以获得不再存在的实例”。那么什么时候开启/关闭它比较好呢?

此外,当自我保护开启时,您可能会在 Eureka Server 控制台警告中收到一条未完成的消息:

紧急情况! EUREKA 可能不正确地声称实例已启动 他们不是。续订小于阈值,因此 为了安全起见,实例不会过期。

现在,继续使用 Spring Eureka 控制台。

Lease expiration enabled    true/false
Renews threshold    5
Renews (last min)   4

我遇到了一个奇怪的阈值计数行为:当我单独启动 Eureka Server 时,阈值是 1。

2。我有一个 Eureka 服务器并配置了registerWithEureka: false 以防止它在另一台服务器上注册。那么,为什么它会出现在阈值计数中?

3.对于每个客户,我开始阈值计数增加 +2。我猜这是因为他们每分钟发送 2 条更新消息,对吗?

4. Eureka 服务器从不发送更新,因此最后一分钟更新始终低于阈值。这正常吗?

renew threshold 5
rewnews last min: (client1) +2 + (client2) +2 -> 4

服务器配置:

server:
  port: ${PORT:8761}

eureka:
  instance:
    hostname: localhost
  client:
    registerWithEureka: false
    fetchRegistry: false
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  server:
    enableSelfPreservation: false
#   waitTimeInMsWhenSyncEmpty: 0

客户端 1 配置:

spring:
  application:
    name: random-image-microservice

server:
  port: 9999

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
    healthcheck:
      enabled: true

【问题讨论】:

  • 我想花时间回答这个问题。情况很复杂。一些答案在 Netflix 代码中,而其他答案是配置。我希望我的答案最终成为 Spring Cloud 文档的一部分,但它可能会在感恩节之后,除非我的同事在此之前回答。
  • 这是来自 Netflix 的一点背景:github.com/Netflix/eureka/wiki/…
  • @spencergibb 这快 9 个月了,没有答案.. 有什么意见吗?
  • @spencergibb 现在已经一年多了。是否还有机会随时得到明确的答复?某种圣诞礼物:)

标签: spring spring-cloud netflix-eureka


【解决方案1】:

我遇到了和@codependent 一样的问题,我google了很多并做了一些实验,在这里我来贡献一些关于 Eureka 服务器和实例如何工作的知识。

每个实例都需要以每 30 秒一次的频率向 Eureka Server 续租,可以在eureka.instance.leaseRenewalIntervalInSeconds 中定义。

Renews (last min):表示在最后一分钟从 Eureka 实例收到了多少更新

更新阈值:Eureka 服务器期望每分钟从 Eureka 实例接收到的更新。

例如,如果registerWithEureka设置为falseeureka.instance.leaseRenewalIntervalInSeconds设置为30并运行2个Eureka实例。两个 Eureka 实例每分钟会向 Eureka 服务器发送 4 次更新,Eureka 服务器最小阈值为 1(代码编写),因此阈值为 5(这个数字将乘以系数eureka.server.renewalPercentThreshold,稍后将讨论)。

自我保护模式:如果Renews (last min)小于Renews threshold,将激活自我保护模式。

所以在上例中,SELF PRESERVATION MODE 被激活,因为阈值为 5,但 Eureka 服务器每分钟只能接收 4 次更新。

  1. 问题 1:

自我保护模式旨在避免网络连接不良故障。 Eureka 实例 A 和 B 之间的连接良好,但是 B 由于连接中断而未能在短时间内续订到 Eureka 服务器的租约,此时 Eureka 服务器不能简单地踢掉实例 B。如果是,实例尽管 B 可用,但 A 不会从 Eureka 服务器获得可用的注册服务。所以这就是自我保存模式的目的,最好开启它。

  1. 问题 2:

最小阈值 1 写在代码中。 registerWithEureka 设置为 false,因此不会有 Eureka 实例寄存器,阈值为 1。

在生产环境中,一般我们部署两台Eureka服务器,registerWithEureka会设置为true。所以阈值为2,Eureka服务器每分钟会为自己续租两次,所以RENEWALS ARE LESSER THAN THRESHOLD不会有问题。

  1. 问题 3:

是的,你是对的。 eureka.instance.leaseRenewalIntervalInSeconds 定义了每分钟向服务器发送多少更新,但它会乘以上面提到的eureka.server.renewalPercentThreshold 的因子,默认值为 0.85。

  1. 问题 4:

是的,这很正常,因为阈值初始值设置为1。所以如果registerWithEureka设置为false,renews总是低于阈值。

对此我有两个建议:

  1. 部署两台Eureka服务器并启用registerWithEureka
  2. 如果你只是想在demo/dev环境中部署,可以将eureka.server.renewalPercentThreshold设置为0.49,这样当你单独启动一个Eureka服务器时,阈值为0。

【讨论】:

  • 你好聂星,你知道Label是什么意思吗:"Lease expiration enabled:"
  • 嗨@jabrena,我认为这意味着如果实例不更新其对尤里卡服务器的租约,租约将到期。它可能与 eureka.instance.leaseExpirationDurationInSeconds 相关,默认值为 90 秒。如果将此值设置为 0 或负数,则标签可能会变为“已启用租约到期:False”。你可以试试看。
  • 不起作用。 Threshold=0,Renews=0 仍会触发警告。
  • 我禁用了 selfPreservationMode,但我仍然在 Eureka 上收到此消息 - EUREKA 可能错误地声称实例已启动,但实际上它们未启动。续订少于阈值,因此为了安全起见,实例不会过期。它不应该发生吧?
【解决方案2】:

我创建了一篇博客文章,其中包含 Eureka here 的详细信息,填补了 Spring doc 或 Netflix 博客中缺失的一些细节。这是几天调试和挖掘源代码的结果。我知道最好复制粘贴而不是链接到外部 URL,但内容太大,无法回答。

【讨论】:

  • 感谢您链接这样一个澄清的帖子。推荐阅读!
  • 嗨@Abhijit Sarkar,这篇文章很棒。解决了很多配置疑惑。
【解决方案3】:

您可以尝试在您的 eureka 服务器属性中设置续订阈值限制。如果你有大约 3 到 4 个微服务要在 eureka 上注册,那么你可以将其设置为:

eureka.server.renewalPercentThreshold=0.33

【讨论】:

    猜你喜欢
    • 2019-02-17
    • 2019-01-29
    • 2015-05-12
    • 2015-09-20
    • 2020-11-04
    • 2020-04-30
    • 2015-05-29
    • 2017-02-06
    相关资源
    最近更新 更多