我是开发微服务的新手,尽管我已经研究了一段时间,阅读了 Spring 的文档和 Netflix 的文档。
我 在 Github 上 启动了一个简单的项目。它基本上是一个 Eureka 服务器(Archimedes)和三个 Eureka 客户端微服务(一个公共 API 和两个私有 API)。查看 github 的自述文件以获取详细说明。
关键是,当一切都在运行时,我希望如果其中一个私有微服务被终止,Eureka 服务器会意识到并将其从注册表中删除。
我 在 Stackoverflow 上发现了这个问题,解决方案通过在 Eureka 服务器配置中使用 enableSelfPreservation:false
传递。一段时间后执行此操作,被终止的服务将按预期消失。
但是我可以看到以下消息:
自我保护模式已关闭。如果出现网络/其他问题,这可能无法保护实例过期。
1、自保的目的是什么?该 文档 指出,通过自我保护 “客户可以获得不再存在的实例” 。那么什么时候打开/关闭它是明智的?
此外,当自我保护开启时,您可能会在 Eureka Server 控制台警告中收到一条未完成的消息:
紧急情况!尤里卡可能错误地声称实例已启动,而实际上它们并未启动。续订少于阈值,因此为了安全起见,实例不会过期。
现在,继续使用 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 发布,翻译遵循 CC BY-SA 4.0 许可协议
我遇到了和@codependent 遇到的同样的问题,我搜索了很多并做了一些实验,在这里我来贡献一些关于 Eureka 服务器和实例如何工作的知识。
每个实例需要以每 30 秒一次的频率更新其对 Eureka Server 的租约,可以在
eureka.instance.leaseRenewalIntervalInSeconds
中定义。Renews (last min) : 表示最后一分钟从 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 次更新/分钟。
SELF PRESERVATION MODE 旨在避免不良的网络连接失败。 Eureka 实例 A 和 B 之间的连接良好,但是 B 由于连接中断而无法在短时间内续租到 Eureka 服务器,此时 Eureka 服务器不能简单地踢出实例 B。如果是,实例尽管 B 可用,A 也不会从 Eureka 服务器获得可用的注册服务。所以这就是SELF PRESERVATION MODE的目的,打开它比较好。
最小阈值 1 写在代码中。
registerWithEureka
设置为 false 所以不会有 Eureka 实例寄存器,阈值为 1。在生产环境中,一般我们部署两台Eureka服务器,并将
registerWithEureka
设置为true。所以阈值为 2,Eureka 服务器将每分钟更新两次租约给自己,所以RENEWALS ARE LESSER THAN THRESHOLD
不会有问题。是的你是对的。
eureka.instance.leaseRenewalIntervalInSeconds
定义每分钟向服务器发送多少次更新,但它会乘以一个因子eureka.server.renewalPercentThreshold
上面提到的,默认值是0.85。是的,这很正常,因为阈值初始值设置为1。所以如果
registerWithEureka
设置为false,renews总是低于阈值。对此我有两个建议:
registerWithEureka
。eureka.server.renewalPercentThreshold
为0.49,这样单独启动一个Eureka服务器时,threshold将为0。