了解Spring Cloud Eureka服务器自我保护和更新阈值
虽然我已经研究了一段时间,阅读了Spring和Netflix的文档,但我对开发微服务还是新手 我已经开始了一个简单的项目。它基本上是一个Eureka服务器(阿基米德)和三个Eureka客户端微服务(一个公共API和两个私有API)。查看github的自述文件以获取详细描述 关键是,当一切都在运行时,我希望如果某个私有微服务被终止,Eureka服务器会实现并将其从注册表中删除 I,解决方案通过在Eureka服务器配置中使用了解Spring Cloud Eureka服务器自我保护和更新阈值,spring,spring-cloud,netflix-eureka,Spring,Spring Cloud,Netflix Eureka,虽然我已经研究了一段时间,阅读了Spring和Netflix的文档,但我对开发微服务还是新手 我已经开始了一个简单的项目。它基本上是一个Eureka服务器(阿基米德)和三个Eureka客户端微服务(一个公共API和两个私有API)。查看github的自述文件以获取详细描述 关键是,当一切都在运行时,我希望如果某个私有微服务被终止,Eureka服务器会实现并将其从注册表中删除 I,解决方案通过在Eureka服务器配置中使用启用selfpreservation:false传递。执行此操作一段时间后,
启用selfpreservation:false
传递。执行此操作一段时间后,终止服务将按预期消失
但是,我可以看到以下信息:
自我保护模式已关闭。这可能无法保护实例
网络/其他问题时失效
1。自我保护的目的是什么?声明说,如果在“客户机可以获得不再存在的实例”上进行自我保护。那么什么时候开/关才是明智之举?
renew threshold 5
rewnews last min: (client1) +2 + (client2) +2 -> 4
此外,当“自我保护”处于启用状态时,您可能会在Eureka服务器控制台中收到一条未完成的消息警告:
紧急情况!EUREKA可能错误地声称,当
他们不是。续约低于阈值,因此
实例不会为了安全而过期
现在,继续使用Spring Eureka控制台
Lease expiration enabled true/false
Renews threshold 5
Renews (last min) 4
我遇到了一个奇怪的阈值计数行为:当我单独启动Eureka服务器时,阈值是1
2。我有一台Eureka服务器,并配置了registerWithEureka:false
,以防止它在另一台服务器上注册。那么,为什么它会出现在阈值计数中?
renew threshold 5
rewnews last min: (client1) +2 + (client2) +2 -> 4
3。对于我启动的每个客户端,阈值计数增加+2。我想这是因为他们每分钟发送2条续订消息,对吗?
renew threshold 5
rewnews last min: (client1) +2 + (client2) +2 -> 4
4。Eureka服务器从不发送续订,因此最后一分钟续订始终低于阈值。这正常吗?
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
spring:
application:
name: random-image-microservice
server:
port: 9999
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
healthcheck:
enabled: true
客户端1 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
spring:
application:
name: random-image-microservice
server:
port: 9999
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
healthcheck:
enabled: true
我得到了与@codependent met相同的问题,我在谷歌上搜索了很多,并做了一些实验,在这里我来贡献一些关于Eureka服务器和实例如何工作的知识 每个实例都需要以每30秒一次的频率向Eureka服务器续订租约,这可以在
Eureka.instance.leaseRenewalIntervalInSeconds
中定义
续订(最后一分钟):表示在最后一分钟从Eureka实例收到的续订数量
续订阈值:Eureka服务器期望每分钟从Eureka实例接收的续订
例如,如果registerWithEureka
设置为false,eureka.instance.leaseRenewalIntervalInSeconds
设置为30并运行2个eureka实例。两个Eureka实例将每分钟向Eureka服务器发送4续订,Eureka服务器最小阈值为1(用代码编写),因此阈值为5(该数字将乘以系数Eureka.server.renewalPercentThreshold
,稍后讨论)
自我保护模式:如果更新(最后一分钟)小于更新阈值,自我保护模式将被激活
因此,在上面的示例中,自我保护模式被激活,因为阈值为5,但Eureka服务器每分钟只能接收4次续订
registerWithEureka
设置为false,因此将不存在Eureka实例寄存器,阈值将为1
在生产环境中,通常我们部署两个Eureka服务器,registerWithEureka
将设置为true。因此,阈值将为2,Eureka服务器将每分钟向自身续订两次租约,因此续订小于阈值不会有问题
问题3:
是的,你说得对eureka.instance.leaseRenewalIntervalInSeconds
定义每分钟发送到服务器的续订次数,但它将乘以上文提到的因子eureka.server.renewalPercentThreshold
,默认值为0.85
registerWithEureka
设置为false,则续订始终低于阈值
对此,我有两个建议:
eureka.server.renewalPercentThreshold
设置为0.49,因此当您单独启动eureka服务器时,阈值将为0我写了一篇关于Eureka的详细信息的博文,这篇博文填补了SpringDoc或Netflix博客中缺失的一些细节。这是几天调试和挖掘源代码的结果。我知道复制粘贴比链接到外部URL更可取,但内容太大,无法回答SO问题。您可以尝试在您的eureka服务器属性中设置续订阈值限制。如果您要在eureka上注册大约3到4个微服务,则可以将其设置为:
eureka.server.renewalPercentThreshold=0.33
我想