0

我们将 Spring Cloud Angel.SR6 与 Netflix Eureka 和 Spring Config Server 一起使用。我们的一个微服务是一个分布式系统,它使用 Eureka 作为发现机制来寻找对等点。为了在多个实例并行启动时以正确的方式启动系统,我们想知道哪个节点先启动。Eureka 中的应用程序信息包含几个不同的时间戳,但是当 Eureka 客户端更新状态时它们会发生变化,因此我们似乎无法依赖它们。

我们现在的想法是让应用程序在 Eureka 中注册自己的启动时间戳metadataMap,我们已经能够使用EurekaInstanceConfigBean. 然而,使用这种方法,时间戳在过程中添加得太晚了。这些实例最初出现在 Eureka 中没有时间戳,这对我们来说还不够好(即使是这样,也需要很长时间才能成为一个好的解决方案)。

我们正在尝试做的是获取包含在初始 Eureka 注册中的时间戳。声明的属性bootstrap.properties包括在内,所以如果我们能以某种方式在此处获取时间戳,一切都会正常工作:

eureka.instance.metadataMap.bootTimestamp=<here we want the timestamp>

我们尝试使用Spring Cloud 文档PropertySourceLocator中提到的方法添加自定义,但仍然没有运气。初始 Eureka 注册发生在 PropertySourceLocator 初始化之前,这再次为时已晚。

我们如何才能在初始 Eureka 注册之前将启动时间戳放入环境中,这样应用程序就不会在没有时间戳的情况下出现在 Eureka 中?

4

1 回答 1

0

我们发现了一个不完全令人满意的解决方法,所以我将其发布在有人认为它有用的地方。通过在环境变量或系统属性中传递时间戳,我们可以将其包含在 Eureka 中元数据的初始注册中。

命令行(假设 Linux/bash):

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

引导程序属性:

eureka.instance.metadataMap.bootTimestamp=${boot.timestamp:0}
于 2016-06-22T09:00:33.407 回答