2016-03-27 26 views
7

UPDATEzarejestrować wiele wystąpień Klienta Wiosna Boot Eureka z jednego hosta

README w this repo został zaktualizowany do wykazania rozwiązanie w akceptowanych odpowiedź.


pracuję z prostym przykładzie rejestracji usługi Wiosna Boot Eureka i odkrycia oparte na this guide.

Jeśli uruchamiam jedną instancję klienta, rejestruje się ona prawidłowo i może przejrzeć się przez DiscoveryClient. Jeśli uruchomię drugą instancję o innej nazwie, działa ona również.

Ale jeśli uruchomię dwie instancje o tej samej nazwie, pulpit nawigacyjny pokazuje tylko 1 wystąpienie uruchomione, a DiscoveryClient pokazuje tylko drugą instancję.

Po zabiciu drugiej instancji pierwsza z nich jest ponownie widoczna za pośrednictwem pulpitu nawigacyjnego i klienta wykrywania.

Oto kilka szczegółów na temat etapów ja przyjmujących i co widzę:

Eureka Server

uruchomić serwer

cd eureka-server 
mvn spring-boot:run 

Otwórz panel w Eureka http://localhost:8761

Pamiętaj, że nie ma jeszcze "Instancji" jeszcze zarejestrowanych

Eureka Client

Uruchom klienta

cd eureka-client 
mvn spring-boot:run 

odwiedzić klient bezpośrednio na http://localhost:8080/

Punkt końcowy /whoami pokaże klienta samowiedzę swojej nazwy aplikacji i portu

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

Punkt końcowy /instances potrwa do minuty, aby zaktualizować, ale powinien ostatecznie pokazać wszystkie wystąpienia eureka-client, które zostały zarejestrowane przez klienta Eureka Discovery.

[ 
    { 
     "host":"hostname", 
     "port":8080, 
     "serviceId":"EUREKA-CLIENT", 
     "uri":"http://hostname:8080", 
     "secure":false 
    } 
] 

Możesz również odwiedzić dashoboard Eureka ponownie i zobaczyć go tam.

rozpędzają kolejny klient z inną nazwą

Widać, że inny klient będzie zarejestrowana w następujący sposób:

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

Punkt końcowy /whoami pokaże nazwę foo i port 8081.

Za minutę punkt końcowy /instances wyświetli również informacje o tej instancji .

Na pulpicie nawigacyjnym Eureka dwóch klientów zostanie zarejestrowanych.

rozpędzają innego klienta z nazwą samo

Teraz spróbuj kręci kolejną instancję eureka-client tylko przez nadrzędny parametr port:

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

/whoami końcowy dla http://localhost:8082 pokazach czego oczekujemy.

W minutę lub tak, punkt końcowy /instances pokazuje teraz wystąpienie działa na porcie 8082 także, ale z jakiegoś powodu, to nie pokazuje instancji działa na porcie 8080.

A jeśli sprawdzamy /instances punkt końcowy na http://localhost:8080 my też teraz zobaczyć tylko instancja działa na 8082 (choć wyraźnie, jeden na 8080 jest uruchomiony, ponieważ to, co mamy z prośbą o.

Eureka desce rozdzielczej pokazuje tylko 1 przypadek eureka-client uruchomiony.

Co słychać w h ere?

Spróbujmy zabić instancję działającą na 8082 i zobaczmy, co się stanie.

Kiedy zapytania /instances na 8080, to nadal pokazuje tylko wystąpienie na 8082.

Ale minutę później, że odchodzi, a my po prostu zobaczyć instancji w 8080 ponownie.

Pytanie brzmi, dlaczego nie widzimy obu wystąpień eureka-client, gdy obie są uruchomione?

Odpowiedz

7

Dla lokalnych wdrożeń, spróbuj configure {namespace} .instanceId nieruchomość w eureka-client.properties (lub eureka.instance.metadataMap.instanceId do właściwego pliku YAML w przypadku instalacji opartej Wiosna chmura). To jest głęboko zakorzenione w sposobie, w jaki serwer Eureka oblicza listy aplikacji i porównuje InstanceInfo dla PeerAwareInstanceRegistryImpl - kiedy nie ma już konkretnych danych (np.: Metadane instancji są dostępne), próbują uzyskać identyfikator z nazwy hosta.

Nie chciałbym polecam go jednak do wdrożenia AWS, ponieważ zakłócenie z instancją instanceId przyniesie ci kłopot z ustaleniem, który komputer obsługuje daną usługę - z drugiej strony wątpię, że będziesz obsługiwał dwie identyczne usługi na jednej maszynie, prawda?

+0

Dzięki, ja nie widziałem wcześniej, ale wygląda to faktycznie duplikatem http: //stackoverflow.com/questions/29653420/netflix-eureka- i -2-właściwości-aplikacji-na-środowisku lokalnym (Mała literówka w obiekcie, którą potrzebowałem ustawić, powinna być "eureka.instance". metadataMap.instanceId') Rozpocząłem drugą instancję z 'mvn spring-boot: run -Dserver.port8082 -Deureka.instance.metadataMap.instanceId = instance2', która pojawia się na desce rozdzielczej i t teraz odpowiedź od 'DiscoveryClient'. – mcwumbly

+0

Tak, masz rację - powinno to być "metadataMap" –

+0

Znalazłem '{namespace} .instanceId', które działa, a nie' eureka.instance.metadataMap.instanceId' z oddziałem eureka master od dzisiaj. – Divs

3

Aby wyświetlić wszystkie wystąpienia w portalu administratora, ustawiając unikatową nazwę pliku euraka.instance.hostname w pliku konfiguracyjnym Eureka.

Nazwa hosta jest używana jako klucz do przechowywania InstanceInfo w com.netflix.discovery.shared.Application (ponieważ nie ustawiono UniqueIdentifier). Musisz więc używać unikalnych nazw hostów. Podczas testowania wstążki w tym scenariuszu widać, że obciążenie nie będzie zrównoważone.

Następna aplikacja.yml jest przykładem:

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}} 

Jest to błąd, zanim w Eureka, można sprawdzić dalsze informacje w https://github.com/codecentric/spring-boot-admin/issues/134

Powiązane problemy