2015-11-14 20 views
5

Usiamo Eureka con le nostre applicazioni Spring Boot da alcuni mesi. Abbiamo abilitato la ricerca del servizio tra le applicazioni usando le annotazioni @DiscoveryClient. Le registrazioni, i rinnovi dei contratti di locazione e le operazioni di cancellazione funzionano come previsto.Utilizzo di Eureka come registro utilizzando le API REST

Recentemente, abbiamo riscontrato uno scenario in cui abbiamo un componente di applicazione non Java (scritto in C++), che espone 3 endpoint del servizio REST che molte delle nostre applicazioni Java di Spring Boot utilizzerebbero. Stiamo provando a vedere se il componente C++ può utilizzare le API REST del server Eureka per registrarsi al suo interno, in modo che le applicazioni Java di Spring Boot possano eseguire la normale ricerca tramite Eureka per entrare in contatto con il componente C++.

Poiché non è possibile utilizzare il client Eureka nei componenti C++ (ovviamente), ho iniziato a testare le API REST dirette (come descritto here) utilizzando Postman. La registrazione ha funzionato senza problemi inviando un payload JSON utilizzando il metodo POST a http://eurekaserver:8761/eureka/apps/FOO-APP (con instanceId = 1111 e hostName = foo-app). Posso interrogare http://eurekaserver:8761/eureka/apps e posso vedere FOO-APP elencato lì come previsto.

Tuttavia, quando provo l'operazione di annullamento utilizzando il metodo DELETE su http://eurekaserver:8761/eureka/apps/FOO-APP/1111 o http://eurekaserver:8761/eureka/apps/FOO-APP/foo-app, viene visualizzato un errore 404.

Con instanceId:

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

OR (stesso risultato per hostName):

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

Ho provato diverse combinazioni, ma non sono in grado di fare questo lavoro. Ho la sensazione che mi manchi qualcosa di ovvio - potrebbe essere qualcosa di piccolo. Qualsiasi aiuto su questo sarebbe apprezzato.

PS: Eureka La documentazione dell'endpoint REST cita "v2" nell'URL. Tuttavia, ciò non funziona nel mio caso. La registrazione (che funziona per me) non utilizza "v2" come descritto sopra. Se qualcuno potesse convalidarlo, sarebbe altrettanto utile. Non sembra esserci abbastanza materiale su questo.

+1

Hai mai pensato di utilizzare un sidecar? Si occupa della registrazione e funge anche da proxy inverso se l'applicazione C++ vuole connettersi ad altri servizi distribuiti. L'applicazione deve solo esporre il suo stato di salute nel formato predefinito. –

+0

Questa è un'opzione. Ma sto cercando di ottenere questo risultato chiamando gli endpoint REST. le invocazioni di cURL dovrebbero funzionare secondo me. Ma loro non stanno succedendo. – Bloodysock

+0

spring-cloud non include la v2. Probabilmente stai usando l'ID di istanza sbagliato. Quale versione di spring cloud stai usando? Imposta 'instanceId' da qualche parte nelle app? – spencergibb

risposta

5

Infine, ho capito come l'operazione cancel può essere richiamata utilizzando URL REST di un server Eureka. Funziona per il server Spring Cloud Eureka, ma dovrebbe funzionare anche per il server Netflix Eureka.

Il pattern URL per l'operazione cancel è come il seguente:

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

Ecco come è documentato nella pagina di Eureka REST operations, ma non c'è molto poca chiarezza su ciò che <instanceId> che doveva essere. Come da documentazione, <instanceId> è il nome host dell'host che esegue il client Eureka. Ciò ha funzionato non (indirizzo IP o nome host). Ho provato a trasmettere lo stesso valore fornito dall'URL GET (ad esempio 192.168.55.55) o localhost. Nemmeno quello ha funzionato. Ho anche provato a passare il valore instanceId dall'output GET (che sarebbe uguale al valore della proprietà eureka.instance.metadataMap.instanceId). Anche quello, non ha funzionato. Ho dovuto letteralmente provare diverse combinazioni per scoprirlo. Il <instanceId> è la concatenazione del nome host e dell'ID di istanza, separati da :. Ad esempio, 192.168.55.55:foo-app-some-random-str.

Ecco un esempio di output del funzionamento GET elenca l'istanza attiva registrato con Eureka:

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

In questo caso, il comando cancel cURL sarebbe simile a questa:

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

che sarebbe de -registrare l'istanza come previsto.

Detto questo, Devo confessare che non stavo prestando molta attenzione ai log del server Eureka. Quando si registra il client Eureka, il log ha stampato il nome completo dell'istanza (FOO-APP/192.168.55.55:foo-app-f4ea7b06fc03a05a06900713f7526a5d), che avrei potuto utilizzare come ipotesi.

Spero che qualcuno lo risolva nello Eureka documentation.