首页 文章

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

提问于
浏览
62

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

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

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

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

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

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

1. What is the purpose of the self preservation? The doc states that with self preservation on "clients can get the instances that do not exist anymore". So when is it advisable to have it on/off?

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

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

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

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

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

2. I have a single Eureka server and is configured with registerWithEureka: false to prevent it from registering on another server. Then, why does it show up in the threshold count?

3. For every client I start the threshold count increases by +2. I guess it is because they send 2 renew messages per min, am I right?

4. The Eureka server never sends a renew so the last min renews is always below the threshold. Is this normal?

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

Server 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

Client 1 cfg:

spring:
  application:
    name: random-image-microservice

server:
  port: 9999

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

2 回答

  • 42

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

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

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

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

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

    SELF PRESERVATION MODE :如果 Renews (last min) 小于 Renews threshold ,将激活自保护模式 .

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

    • 问题1:

    SELF PRESERVATION MODE旨在避免网络连接故障 . Eureka实例A和B之间的连接性很好,但是由于连接中断,B很难在短时间内将租约更新到Eureka服务器,此时Eureka服务器不能简单地启动实例B.如果是,则实例尽管B可用,但无法从Eureka服务器获得注册服务 . 所以这就是自我保护模式的目的,最好将它打开 .

    • 问题2:

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

    在 生产环境 环境中,一般我们部署两个Eureka服务器, registerWithEureka 将设置为true . 所以门槛将是2,而Eureka服务器将续租两次/分钟,所以 RENEWALS ARE LESSER THAN THRESHOLD 不会有问题 .

    • 问题3:

    是的,你是对的 . eureka.instance.leaseRenewalIntervalInSeconds 定义每分钟发送到服务器的续订次数,但它将乘以上面提到的因子 eureka.server.renewalPercentThreshold ,默认值为0.85 .

    • 问题4:

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

    我有两个建议:

    • 部署两台Eureka服务器并启用 registerWithEureka .

    • 如果您只想在demo / dev环境中部署,可以将 eureka.server.renewalPercentThreshold 设置为0.49,因此当您单独启动Eureka服务器时,阈值将为0 .

  • 22

    我创建了一篇博文,其中详细介绍了Eureka here,它填补了Spring doc或Netflix博客的一些缺失细节 . 这是几天调试和挖掘源代码的结果 . 我理解最好是复制粘贴而不是链接到外部URL,但内容对于SO答案来说太大了 .

相关问题