2015-11-14 8 views
5

Wir verwenden Eureka seit einigen Monaten mit unseren Spring Boot-Anwendungen. Wir haben Service-Lookup zwischen Anwendungen mit @DiscoveryClient Annotationen aktiviert. Die Anmeldungen, Mietverlängerungen und Deregistrierungen funktionieren wie erwartet.Verwenden von Eureka als Registry mithilfe von REST-APIs

Vor kurzem haben wir ein Szenario entdeckt, in dem wir nicht-Java-Anwendungskomponenten (geschrieben in C++) haben, die 3 REST-Dienstendpunkte verfügbar machen, die viele unserer Spring Boot-Java-Anwendungen verwenden würden. Wir versuchen herauszufinden, ob die C++ - Komponente die REST-APIs des Eureka-Servers nutzen kann, um sich selbst zu registrieren, damit die Spring-Boot-Java-Anwendungen die übliche Suche über Eureka durchführen können, um mit der C++ - Komponente in Kontakt zu treten.

Da ich den Eureka Client nicht in den C++ - Komponenten verwenden kann (offensichtlich), begann ich direkte REST-APIs (wie beschrieben here) mit Postman zu testen. Die Registrierung funktionierte problemlos, indem eine JSON-Payload mit der POST-Methode an http://eurekaserver:8761/eureka/apps/FOO-APP gesendet wurde (mit instanceId = 1111 und hostName = foo-app). Ich kann http://eurekaserver:8761/eureka/apps abfragen und kann FOO-APP wie erwartet dort aufgeführt sehen.

Wenn ich jedoch versuchen, den Vorgang mit DELETE-Methode zu http://eurekaserver:8761/eureka/apps/FOO-APP/1111 oder http://eurekaserver:8761/eureka/apps/FOO-APP/foo-app abzubrechen, erhalte ich einen 404-Fehler.

Mit instanceId:

{ 
    "timestamp": 1447479397996, 
    "status": 404, 
    "error": "Not Found", 
    "message": "Not Found", 
    "path": "/eureka/apps/FOO-APP/1111" 
} 

OR (gleiches Ergebnis für hostname):

{ 
    "timestamp": 1447479397996, 
    "status": 404, 
    "error": "Not Found", 
    "message": "Not Found", 
    "path": "/eureka/apps/FOO-APP/foo-app" 
} 

Ich habe versucht, verschiedene Kombinationen, aber ich bin nicht in der Lage, diese Arbeit zu machen. Ich habe das Gefühl, dass mir etwas offensichtlich fehlt - vielleicht etwas Kleines. Jede Hilfe dazu wäre willkommen.

PS: Eureka REST-Endpunkt-Dokumentation erwähnt "v2" in der URL. In meinem Fall funktioniert das jedoch nicht. Registrierung (die für mich funktioniert) verwendet nicht "v2" wie oben beschrieben. Wenn jemand dies bestätigen könnte, wäre das auch hilfreich. Es scheint einfach nicht genug Material dazu zu geben.

+1

Haben Sie in Betracht gezogen, stattdessen einen Beiwagen zu verwenden? Es behandelt die Registrierung und fungiert auch als Reverse-Proxy, wenn Ihre C++ - Anwendung eine Verbindung zu anderen bereitgestellten Diensten herstellen möchte. Ihre Anwendung muss nur ihren Status im vordefinierten Format offenlegen. –

+0

Das ist eine Option. Aber ich versuche das zu erreichen, indem ich gerade REST-Endpunkte anrufe. cURL-Aufrufe sollten meiner Meinung nach funktionieren. Aber das passiert nicht. – Bloodysock

+0

Feder-Cloud enthielt nicht die v2. Sie verwenden wahrscheinlich die falsche instanceId. Welche Version der Federwolke verwendest du? Setzen Sie 'instanceId 'irgendwo in den Apps? – spencergibb

Antwort

5

Schließlich habe ich herausgefunden, wie die cancel-Operation mit REST-URLs eines Eureka-Servers aufgerufen werden kann. Dies funktioniert für den Spring Cloud Eureka Server, sollte aber auch für den Netflix Eureka Server funktionieren.

Das URL-Muster für die cancel Operation ist wie folgt:

DELETE http://eureka_host:eureka_port/eureka/apps/<appName>/<instanceId> 

Dies ist, wie es auf der Eureka REST operations Seite dokumentiert ist, aber es gibt sehr wenig Klarheit darüber, was <instanceId> eigentlich sein sollte. Gemäß der Dokumentation ist <instanceId> der Hostname des Hosts, der den Eureka-Client ausführt. Das hat nicht funktioniert (IP-Adresse oder Host-Name). Ich habe versucht, den gleichen Wert, der die GET URL gab mir (z. B. 192.168.55.55) oder localhost übergeben. Das hat auch nicht funktioniert. Ich versuchte auch, den Wert instanceId von der GET Ausgabe (die dem Wert der Eigenschaft eureka.instance.metadataMap.instanceId entsprechen würde) zu übergeben. Das hat auch nicht funktioniert. Ich musste buchstäblich verschiedene Kombinationen ausprobieren, um das herauszufinden. Die <instanceId> ist die Verkettung des Hostnamens und der Instanz-ID, getrennt durch :. Zum Beispiel 192.168.55.55:foo-app-some-random-str.

Hier ist ein Beispiel für die Ausgabe des GET Betrieb die aktive Instanz mit Eureka registriert Auflistung:

$ curl -X "DELETE" http://eureka_host:eureka_port/eureka/apps/FOO-APP/192.168.55.55:foo-app-f4ea7b06fc03a05a06900713f7526a5d 

Das wäre de:

<instance> 
    <hostName>192.168.55.55</hostName> 
    <app>FOO-APP</app> 
    ... 
    <metadata> 
    <instanceId>foo-app-f4ea7b06fc03a05a06900713f7526a5d</instanceId> 
    </metadata> 
    ... 
</instance> 

In diesem Fall wird die cancel cURL Befehl würde wie folgt aussehen -Registrieren Sie die Instanz wie erwartet.

Das sagte, Ich muss gestehen, dass ich nicht viel Aufmerksamkeit auf die Eureka Server Logs geschenkt habe. Wenn Sie den Eureka-Client registrieren, hat das Protokoll den vollständig qualifizierten Namen der Instanz ausgedruckt (FOO-APP/192.168.55.55:foo-app-f4ea7b06fc03a05a06900713f7526a5d), was ich als Vermutung hätte verwenden können.

Ich hoffe, jemand behebt dies in der Eureka documentation.

Verwandte Themen