了解Spring Cloud Eureka Server自我保存和更新阈值

2024-03-09

我对开发微服务还很陌生,尽管我已经研究它有一段时间了,阅读了 Spring 的文档和 Netflix 的文档。

我开始了一个简单的项目可以在 Github 上找到 https://github.com/codependent/storyteller-microservices。它基本上是一个 Eureka 服务器(阿基米德)和三个 Eureka 客户端微服务(一个公共 API 和两个私有 API)。查看 github 的 readme 以获取详细说明。

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

I 在 Stackoverflow 上发现了这个问题 https://stackoverflow.com/questions/32616329/eureka-never-unregisters-a-service,并且解决方案通过使用enableSelfPreservation:false在尤里卡服务器配置中。一段时间后执行此操作,被杀死的服务就会按预期消失。

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

自我保护模式已关闭。这可能无法保护实例 如果出现网络/其他问题,则过期。

1、自我保护的目的是什么?这doc https://github.com/Netflix/eureka/wiki/Understanding-Eureka-Peer-to-Peer-Communication指出自我保护“客户端可以获得不再存在的实例”。那么什么时候建议打开/关闭它呢?

此外,当自我保存开启时,您可能会在 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

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

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

续订(最后一分钟): 代表上一分钟从Eureka实例收到的更新数量

续订门槛:Eureka 服务器期望每分钟从 Eureka 实例收到的更新。

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

自我保护模式: if 续订(最后一分钟)小于续订门槛,自我保护模式将被激活。

所以在上面的例子中,自我保护模式被激活,因为阈值是5,但是Eureka服务器每分钟只能接收4个更新。

  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,更新始终低于阈值。

对此我有两个建议:

  1. 部署两台Eureka服务器并启用registerWithEureka.
  2. 如果你只想部署在demo/dev环境中,你可以设置eureka.server.renewalPercentThreshold到0.49,所以当你单独启动Eureka服务器时,阈值将为0。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解Spring Cloud Eureka Server自我保存和更新阈值 的相关文章

随机推荐