2016-03-27 20 views
7

UPDATEregistrare più istanze di un client Primavera avvio Eureka da un singolo host

Il README nella this repo è stato aggiornato per dimostrare la soluzione nella risposta accettata.


sto lavorando con un semplice esempio di un servizio di registrazione primavera Boot Eureka e la scoperta sulla base di this guide.

Se avvio una istanza client, si registra correttamente e può vedere se stessa tramite DiscoveryClient. Se avvio una seconda istanza con un nome diverso, funziona altrettanto bene.

Ma se avvio due istanze con lo stesso nome, la dashboard mostra solo 1 istanza in esecuzione e la DiscoveryClient mostra solo la seconda istanza.

Quando uccido la seconda istanza, la prima è nuovamente visibile attraverso la dashboard e il client di individuazione.

Qui ci sono alcuni più particolari circa i passi che sto prendendo e quello che sto vedendo:

Eureka Server

Avviare il server

cd eureka-server 
mvn spring-boot:run 

Visita il cruscotto Eureka a http://localhost:8761

Nota che non ci sono "istanze" ancora registrate

Eureka client

avviare un client

cd eureka-client 
mvn spring-boot:run 

Visita il cliente direttamente al http://localhost:8080/

Il /whoami endpoint mostrerà la conoscenza di sé del cliente del suo nome dell'applicazione e la porta

{ 
    "springApplicationName":"eureka-client", 
    "serverPort":"8080" 
} 

L'endpoint /instances impiegherà fino a un minuto per l'aggiornamento, ma alla fine dovrebbe mostrare tutte le istanze di eureka-client che sono state registrate con Eureka Discovery Client.

È inoltre possibile visitare nuovamente la dashboard di Eureka e visualizzarla nell'elenco.

Spin un altro cliente con un nome diverso

Si può vedere che un altro cliente sarà registrato nel modo seguente:

cd eureka-client 
mvn spring-boot:run -Dspring.application.name=foo -Dserver.port=8081 

Il /whoami endpoint mostrerà il nome foo e la porta 8081.

In un minuto o così, l'endpoint /instances mostrerà le informazioni su questa istanza foo.

Nella dashboard Eureka, verranno registrati due client.

Spin un altro cliente con il nome stessa

Ora provare a girare un altro esempio di eureka-client da solo su a cavallo il parametro port:

cd eureka-client 
mvn spring-boot:run -Dserver.port=8082 

Il /whoami endpoint per http://localhost:8082 spettacoli cosa ci aspettiamo

In un minuto o giù di lì, l'endpoint /instances ora mostra l'istanza in esecuzione sulla porta 8082 anche, ma per qualche ragione, non mostra l'istanza in esecuzione sulla porta 8080.

E se controlliamo il /instances endpoint su http://localhost:8080 anche noi ora vediamo solo l'istanza in esecuzione su 8082 (anche se chiaramente, quello sul 8080 è in esecuzione in quanto questo è quello che stiamo chiedendo.

il cruscotto Eureka mostra solo 1 istanza di eureka-client esecuzione.

Cosa sta succedendo h ere?

Proviamo ad eliminare l'istanza in esecuzione su 8082 e vedere cosa succede.

Quando interroghiamo /instances il 8080, ancora mostra solo l'istanza sul 8082.

Ma un minuto dopo, che se ne va e abbiamo appena vediamo l'istanza su 8080 di nuovo.

La domanda è: perché non vediamo entrambe le istanze di eureka-client quando sono entrambe in esecuzione?

risposta

7

Per le distribuzioni locali, cercare di configure {} namespace .instanceId proprietà a eureka-client.properties (o eureka.instance.metadataMap.instanceId per il corretto file YAML in caso di configurazione basata primavera Cloud). È profondamente radicata nel modo in cui il server Eureka calcola gli elenchi delle applicazioni e confronta InstanceInfo per PeerAwareInstanceRegistryImpl - quando non ci sono più dati concreti (es: metadati dell'istanza sono disponibili) provano a ottenere l'id dal nome dell'host ..

Non vorrei lo raccomando per la distribuzione di AWS, perché fare confusione con instanceId ti porterà dei problemi a capire quale macchina ospita un particolare servizio - d'altra parte dubito che tu possa ospitare due servizi identici su una macchina, giusto?

+0

Grazie, non ho visto prima, ma sembra che questo è in realtà un duplicato di http: //stackoverflow.com/questions/29653420/netflix-eureka-and-2-stances-of-application-on-local-environment (Piccolo errore di battitura nella proprietà che avevo bisogno di impostare, dovrebbe essere 'eureka.instance. metadataMap.instanceId') Ho avviato la seconda istanza con 'mvn spring-boot: run -Dserver.port8082 -Deureka.instance.metadataMap.instanceId = instance2' e viene visualizzato nella dashboard e t la risposta dal 'DiscoveryClient' ora. – mcwumbly

+0

Sì, hai ragione - dovrebbe essere 'metadataMap' –

+0

Ho trovato '{namespace} .instanceId' per funzionare e non' eureka.instance.metadataMap.instanceId' con il master master di eureka a partire da oggi. – Divs

3

Per visualizzare tutte le istanze nel portale di amministrazione, impostare euraka.instance.hostname nel file di configurazione Eureka.

Il nome host viene utilizzato come chiave per la memorizzazione di InstanceInfo in com.netflix.discovery.shared.Application (poiché non è impostato UniqueIdentifier). Quindi devi usare nomi di host unici. Quando provi il nastro in questo scenario vedresti che il carico non sarà bilanciato.

Dopo l'applicazione.yml è l'esempio:

server: 
    port: ${PORT:0} 

info: 
    component: example.server 

logging: 
    level: 
    com.netflix.discovery: 'OFF' 
    org.springframework.cloud: 'DEBUG' 

eureka: 
    instance: 
    leaseRenewalIntervalInSeconds: 1 
    leaseExpirationDurationInSeconds: 1 
    metadataMap: 
     instanceId: ${spring.application.name}:${spring.application.instance_id:${random.value}} 
    instanceId: ${spring.application.name}:${spring.application.instance_id:${random.value}} 

Si tratta di un bug prima a Eureka, è possibile controllare ulteriori informazioni in https://github.com/codecentric/spring-boot-admin/issues/134