我对开发微服务还很陌生,尽管我已经研究它有一段时间了,阅读了 Spring 的文档和 Netflix 的文档。
我开始了一个简单的项目可以在 Github 上找到 https://github.com/codependent/storyteller-microservices。它基本上是一个 Eureka 服务器(阿基米德)和三个 Eureka 客户端微服务(一个公共 API 和两个私有 API)。查看 github 的 readme 以获取详细说明。
关键是,当一切都在运行时,我希望如果其中一个私有微服务被终止,Eureka 服务器会意识到并将其从注册表中删除。
I 在 Stackoverflow 上发现了这个问题 https://stackoverflow.com/questions/32616329/eureka-never-unregisters-a-service,并且解决方案通过使用enableSelfPreservation:false
在尤里卡服务器配置中。一段时间后执行此操作,被杀死的服务就会按预期消失。
但是我可以看到以下消息:
自我保护模式已关闭。这可能无法保护实例
如果出现网络/其他问题,则过期。
1、自我保护的目的是什么?这doc https://github.com/Netflix/eureka/wiki/Understanding-Eureka-Peer-to-Peer-Communication指出自我保护“客户端可以获得不再存在的实例”。那么什么时候建议打开/关闭它呢?
此外,当自我保存开启时,您可能会在 Eureka Server 控制台中收到一条未完成的消息警告:
紧急情况! Eureka 可能错误地声称实例已启动
他们不是。续订低于阈值,因此
实例过期并不是为了安全。
现在,继续使用 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