Eureka元数据中的启动时间戳

时间:2016-06-21 14:55:21

标签: spring-boot spring-cloud spring-cloud-netflix

我们在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中?

1 个答案:

答案 0 :(得分:0)

我们找到了一个并不完全令人满意的解决方案,因此我在某人发布此内容时发现它很有用。通过在环境变量或系统属性中传递时间戳,我们可以将其包含在Eureka中元数据的初始注册中。

命令行(假设Linux / bash):

BOOT_TIMESTAMP=$(date +%s%3N) java ...

bootstrap.properties:

eureka.instance.metadataMap.bootTimestamp=${boot.timestamp:0}