我们在Netflix Eureka和Spring Config Server上使用Spring Cloud Angel.SR6。我们的一个微服务是一个分布式系统,它使用Eureka作为查找对等点的发现机制。为了在多个实例并行启动时以正确的方式启动系统,我们想知道哪个节点首先启动。 Eureka中的应用程序信息包含一些不同的时间戳,但是当Eureka客户端更新状态时它们会发生变化,因此我们似乎无法依赖它们。
我们现在的想法是让应用程序在Eureka metadataMap
中注册自己的启动时间戳,这是我们使用EurekaInstanceConfigBean
完成的。但是,使用这种方法,时间戳在过程中添加得太晚。这些实例最初出现在没有时间戳的Eureka中,这对我们来说不够好(即使它会成为一个很好的解决方案,也需要很长时间)。
我们要做的是将时间戳包含在最初的Eureka注册中。包含在bootstrap.properties
中声明的属性,因此如果我们能够以某种方式获取时间戳,则一切都会起作用:
eureka.instance.metadataMap.bootTimestamp=<here we want the timestamp>
我们尝试使用Spring Cloud Documentation中提到的方法添加自定义PropertySourceLocator
,但仍然没有运气。最初的Eureka注册发生在PropertySourceLocator初始化之前,这也是为时已晚。
如何在初始Eureka注册之前将启动时间戳记录到环境中,以便应用程序永远不会出现在没有时间戳的Eureka中?
答案 0 :(得分:0)
我们找到了一个并不完全令人满意的解决方案,因此我在某人发布此内容时发现它很有用。通过在环境变量或系统属性中传递时间戳,我们可以将其包含在Eureka中元数据的初始注册中。
命令行(假设Linux / bash):
BOOT_TIMESTAMP=$(date +%s%3N) java ...
bootstrap.properties:
eureka.instance.metadataMap.bootTimestamp=${boot.timestamp:0}