2016-06-21 12 views
0

Wir verwenden Spring Cloud Angel.SR6 mit Netflix Eureka und Spring Config Server. Einer unserer Microservices ist ein verteiltes System, das Eureka als einen Erkennungsmechanismus verwendet, um Peers zu finden. Um das System korrekt zu starten, wenn mehrere Instanzen parallel gestartet werden, möchten wir wissen, welcher Knoten zuerst gestartet wurde. Die Anwendungsinformationen in Eureka enthalten einige verschiedene Zeitstempel, die sich jedoch ändern, wenn der Eureka-Client den Status aktualisiert, so dass wir uns nicht mehr darauf verlassen können.Startup-Zeitstempel in Eureka-Metadaten

Unsere Idee ist jetzt, die Anwendung einen eigenen Boot-Zeitstempel in der Eureka metadataMap registrieren lassen, die wir mit der EurekaInstanceConfigBean erreichen konnten. Bei diesem Ansatz wird der Zeitstempel jedoch zu spät in den Prozess eingefügt. Die Instanzen erscheinen zunächst in Eureka ohne den Zeitstempel, was für uns nicht gut genug ist (und selbst wenn es so wäre, dauert es zu lange, um eine nette Lösung zu sein).

Wir versuchen stattdessen, den Zeitstempel in die ursprüngliche Eureka-Registrierung aufzunehmen. Immobilien in bootstrap.properties deklariert sind bereits enthalten, so dass, wenn wir irgendwie den Zeitstempel in hier könnte alles funktionieren würde:

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

Wir haben versucht eine benutzerdefinierte PropertySourceLocator mit dem Ansatz in der Spring Cloud Documentation erwähnt hinzuzufügen, aber noch kein Glück . Die anfängliche Eureka-Registrierung findet statt, bevor der PropertySourceLocator initialisiert wird, was wiederum zu spät ist.

Wie können wir den Boot-Zeitstempel vor der ersten Eureka-Registrierung in die Umgebung bringen, sodass die Anwendung in Eureka ohne Zeitstempel nicht erscheint?

Antwort

0

Wir fanden eine nicht ganz zufriedenstellende Problemumgehung, also poste ich dies in jemand findet es nützlich. Indem wir einen Zeitstempel in einer Umgebungsvariablen oder einer Systemeigenschaft übergeben, können wir ihn in die anfängliche Registrierung von Metadaten in Eureka einbeziehen.

Befehlszeile (unter der Annahme, Linux/bash):

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

bootstrap.properties:

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