理解Spring Cloud Eureka Server 自我保护和更新阈值

Understanding Spring Cloud Eureka Server self preservation and renew threshold

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

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

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

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

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

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

1.自保的目的是什么? doc 声明在 "clients can get the instances that do not exist anymore" 上自我保护。那么什么时候合适呢on/off?

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

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.

现在,继续 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

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

每个实例需要以每 30 秒一次的频率更新其对 Eureka Server 的租约,可以在 eureka.instance.leaseRenewalIntervalInSeconds 中定义。

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

Renews threshold:Eureka服务器期望每分钟从Eureka实例收到的更新。

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

自我保护模式:如果续订(最后一分钟)小于续订阈值 , 将启动自我保护模式。

所以在上面的例子中,SELF PRESERVATION MODE 被激活,因为阈值是 5,但是 Eureka 服务器只能接收 4 renews/min。

  1. 问题 1:

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

  1. 问题 2:

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

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

  1. 问题 3:

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

  1. 问题 4:

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

对此我有两个建议:

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

我创建了一个包含 Eureka here 详细信息的博客 post,它填补了 Spring 文档或 Netflix 博客中缺少的一些细节。它是几天调试和挖掘源代码的结果。我知道它比 copy-paste 更可取,而不是链接到外部 URL,但内容对于 SO 答案来说太大了。

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

eureka.server.renewalPercentThreshold=0.33