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

cod*_*ent 76 spring spring-cloud netflix-eureka

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

我已经在Github上开始了一个简单的项目.它基本上是Eureka服务器(阿基米德)和三个Eureka客户端微服务(一个公共API和两个私有).查看github的自述文件以获取详细说明.

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

在Stackoverflow上发现了这个问题,解决方案通过enableSelfPreservation:false在Eureka Server配置中使用.一段时间后执行此操作,被杀死的服务会按预期消失.

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

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

1.自我保护的目的是什么?该文件指出,对"客户端进行自我保护可以获得不再存在的实例".那么什么时候打开/关闭它是否明智?

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

紧急!当EUREKA不是时,EUREKA可能会不正当地提出申请.更新的数量超过了阈值,并且这些实际情况并未到期,只是为了安全起见.

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

Lease expiration enabled    true/false
Renews threshold    5
Renews (last min)   4
Run Code Online (Sandbox Code Playgroud)

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

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

3.对于每个客户端,我开始阈值计数增加+2.我想这是因为他们每分钟发送2条续订消息,对不对?

4. Eureka服务器永远不会发送续订,因此最后一次更新时间始终低于阈值.这是正常的吗?

renew threshold 5
rewnews last min: (client1) +2 + (client2) +2 -> 4
Run Code Online (Sandbox Code Playgroud)

服务器cfg:

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
Run Code Online (Sandbox Code Playgroud)

客户1 cfg:

spring:
  application:
    name: random-image-microservice

server:
  port: 9999

eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/
    healthcheck:
      enabled: true
Run Code Online (Sandbox Code Playgroud)

小智 56

我得到了与@codependent相同的问题,我搜索了很多并做了一些实验,在这里我来提供一些关于Eureka服务器和实例如何工作的知识.

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

续订(最后一分钟):表示在最后一分钟从Eureka实例收到的续订数量

续订阈值:Eureka服务器预期每分钟从Eureka实例收到的更新.

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

自我保存模式:如果续订(最后一分钟)小于续订阈值,将激活自我保护模式.

因此在上面的示例中,SELF PRESERVATION MODE被激活,因为阈值是5,但Eureka服务器只能接收4次更新/分钟.

  1. 问题1:

SELF PRESERVATION MODE旨在避免网络连接故障.Eureka实例A和B之间的连接性很好,但是由于连接中断,B很难在短时间内将租约更新到Eureka服务器,此时Eureka服务器不能简单地启动实例B.如果是,则实例尽管B可用,但无法从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.


Abh*_*kar 27

我创建了一个博客文章与尤里卡的细节在这里,在距离Spring文档或Netflix的博客缺少一些详细填写.这是几天调试和挖掘源代码的结果.我理解最好是复制粘贴而不是链接到外部URL,但内容对于SO答案来说太大了.

  • 感谢您链接这样一个澄清的帖子.推荐阅读!! (2认同)
  • 嗨@Abhijit Sarkar,文章太棒了.我解决了很多配置问题. (2认同)