了解Spring云尤里卡服务器自我保存和更新的门槛
虽然我一直在研究这个问题,但是我还是一个新手,想读一下Spring的文档和Netflix。
我已经开始在Github上提供一个简单的项目。 它基本上是一个尤里卡服务器(阿基米德)和三个尤里卡客户端微服务(一个公共API和两个私人)。 查看github的自述文件以获得详细的描述。
关键是,当一切正在运行,我想如果一个私人微服务被杀害,尤里卡服务器实现并从registry中删除它。
我在Stackoverflow上发现了这个问题 ,并且通过在Eureka服务器configuration中使用enableSelfPreservation:false
来传递解决scheme。 这样做一段时间后杀死的服务消失如预期。
不过,我可以看到以下消息:
自我保存模式已closures。如果出现networking问题或其他问题,可能无法保护实例过期。
1.自我保护的目的是什么? 该文件指出,在“客户可以得到不存在的实例”的自我保护。 那么build议何时开启/closures?
而且,当自我保护function开启时,您可能会在Eureka服务器控制台中收到一条出色的信息警告:
紧急! EUREKA可能会不正当地声称,如果没有。 延期时间比阈值小,因此,这些物品没有过期,只是为了安全起见。
现在,继续与spring尤里卡控制台。
Lease expiration enabled true/false Renews threshold 5 Renews (last min) 4
我遇到了一个奇怪的阈值计数行为:当我单独启动Eureka服务器时,阈值为1。
2.我有一台Eureka服务器,并configuration了registerWithEureka: false
以防止它在另一台服务器上注册。 那么,为什么会出现在门槛计数?
3.对于每个客户我开始的门槛计数增加+2。 我想这是因为他们每分钟发送2条更新消息,对吗?
4.尤里卡服务器从不发送更新,因此最后一次更新始终低于阈值。 这是正常的吗?
renew threshold 5 rewnews last min: (client1) +2 + (client2) +2 -> 4
服务器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
客户端1 cfg:
spring: application: name: random-image-microservice server: port: 9999 eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ healthcheck: enabled: true
我得到了与@codependent相同的问题,我GOOGLE了很多,做了一些实验,在这里我来贡献一些关于尤里卡服务器和实例如何工作的知识。
每个实例需要以每30秒一次的频率续租它到Eureka服务器,这可以在eureka.instance.leaseRenewalIntervalInSeconds
定义。
更新(最后一分钟) :表示最后一分钟从尤里卡实例收到的更新次数
更新阈值 :尤里卡服务器期望从Eureka实例每分钟收到的更新。
例如,如果registerWithEureka
设置为false ,则eureka.instance.leaseRenewalIntervalInSeconds
设置为30,并运行2个Eureka实例。 两个Eureka实例每分钟会向Eureka服务器发送4个更新,Eureka服务器的最小阈值为1 (写入代码),所以阈值为5 (这个数字将乘以因子eureka.server.renewalPercentThreshold
,这将在后面讨论)。
自我保存模式 :如果更新(最后一分钟)小于更新阈值 ,自我保存模式将被激活。
所以在上面的例子中,SELF保存模式被激活,因为阈值是5,但是尤里卡服务器只能接收4次更新/分钟。
- 问题1:
SELF保留模式是为了避免networking连接失败而devise的。 Eureka实例A和B之间的连通性好,但是由于连接问题,B在短时间内无法续租到Eureka服务器,此时Eureka服务器不能简单地将实例B踢出去。如果是这样,实例即使B可用,A也不会从Eureka服务器获得可用的注册服务。 所以这是SELF PRESERVATION MODE的目的,最好打开它。
- 问题2:
最小的阈值1写在代码中。 registerWithEureka
设置为false,所以不会有Eureka实例寄存器,阈值为1。
在生产环境中,我们一般会部署两台Eureka服务器,并将registerWithEureka
设置为true。 因此,门槛将是2,尤里卡服务器将续约自己两次/分钟,所以RENEWALS ARE LESSER THAN THRESHOLD
不会是一个问题。
- 问题3:
你是对的。 eureka.instance.leaseRenewalIntervalInSeconds
定义每分钟发送到服务器的更新次数,但是它会乘以上面提到的因子eureka.server.renewalPercentThreshold
,默认值是0.85。
- 问题4:
是的,这是正常的,因为阈值初始值设置为1.所以如果registerWithEureka
设置为false,更新总是低于阈值。
我有两个build议:
- 部署两台Eureka服务器并启用
registerWithEureka
。 - 如果您只想在demo / dev环境中进行部署,则可以将
eureka.server.renewalPercentThreshold
设置为0.49,因此,当您单独启动一个Eureka服务器时,阈值将为0。
我已经在这里创build了一个博客文章,详细介绍了Eureka的细节,这些文章填补了Spring doc或Netflix博客中的一些遗漏细节。 这是几天的debugging和挖掘源代码的结果。 我知道最好是复制粘贴而不是链接到外部URL,但内容太大而不能用于回答。