2015-05-17 12 views
5

Prototypuję zestaw aplikacji Spring Cloud + Netflix OSS i mam problem z Eureka. W naszym setupie mamy serwer konfiguracji Spring Cloud + serwer Eureka, a następnie 2 moduły, które wykorzystują ten składnik serwera do ładowania początkowego i odkrywania usług.Eureka peers niezsynchronizowane

Problem napotkasz jest, że jeśli rozpędzają 2 instancje serwera Eureka i starają się je powiązać (na podstawie Dwa Peer Aware Eureka Serwery w the docs) nie synchronizują się ze sobą. Zobacz poniżej konfigurację i/lub the code on GitHub.

Zasadniczo Peer1 uruchamia się i wygląda dobrze. Peer2 uruchomi się i będzie wyglądać dobrze, a obydwie strony będą się wzajemnie pokazywać w usługach. Jeśli jednak moduł "UserService" obróci się i zarejestruje się z Peer1, Peer2 nigdy go nie zobaczy. Jeśli następnie uruchomimy moduł "Web" wskazujący na Peer2, to nigdy nie rozwiąże to UserService. Zasadniczo działają w izolacji.

Próbowałem kilka kombinacji ustawień serviceUrl zarówno na serwerze i instancji serwerów Eureka, ale bez skutku. Czy po prostu konfiguruję coś źle?

Peer 1/default config:

server: 
    port: 8888 

eureka: 
    dashboard: 
    path: /dashboard 
    instance: 
    hostname: peer1 
    leaseRenewalIntervalInSeconds: 3 
    client: 
     serviceUrl: 
      defaultZone: ${eureka.server.serviceUrl:http://localhost:${server.port}/eureka/} 
    server: 
    serviceUrl: 
     defaultZone: http://localhost:${server.port}/eureka/ 
     peer2: http://peer2/eureka/ 
    waitTimeInMsWhenSyncEmpty: 0 


spring: 
    application: 
    name: demo-config-service 
    profiles: 
    active: native 
    # required for Spring Cloud Bus 
    rabbitmq: 
    host: ${DOCKER_IP:192.168.59.103} 
    port: 5672 
    username: guest 
    password: guest 
    virtualHost:/
    cloud: 
    config: 
     server: 
     prefix: /configs 
     native: 
      searchLocations: /Users/dave/workspace/oss/distributed-spring/modules/config-server/src/main/resources/testConfigs 
#  git : 
#   uri: https://github.com/joshlong/microservices-lab-configuration 

Peer 2 config:

server: 
    port: 8889 

eureka: 
    dashboard: 
    path: /dashboard 
    instance: 
    hostname: peer2 
    leaseRenewalIntervalInSeconds: 3 
    client: 
     serviceUrl: 
      defaultZone: ${eureka.server.serviceUrl:http://localhost:${server.port}/eureka/} 
    server: 
    serviceUrl: 
     defaultZone: http://localhost:8888/eureka/ 
     peer1: http://peer1/eureka/ 
    waitTimeInMsWhenSyncEmpty: 0 


spring: 
    application: 
    name: demo-config-service 
    profiles: 
    active: native 
    # required for Spring Cloud Bus 
    rabbitmq: 
    host: ${DOCKER_IP:192.168.59.103} 
    port: 5672 
    username: guest 
    password: guest 
    virtualHost:/
    cloud: 
    config: 
     server: 
     prefix: /configs 
     native: 
      searchLocations: /Users/dave/workspace/oss/distributed-spring/modules/config-server/src/main/resources/testConfigs 
#  git : 
#   uri: https://github.com/joshlong/microservices-lab-configuration 

Odpowiedz

7

Było kilka problemów. Numer defaultZone musi znajdować się w sekcji klienta, zgodnie z opisem w dokumentacji. Adres URL defaultZone wymaga portu.

/etc/gospodarze

127.0.0.1  peer1 
127.0.0.1  peer2 

Wzajemne 1 konfiguracji (częściowe)

eureka: 
    instance: 
    hostname: peer1 
    leaseRenewalIntervalInSeconds: 3 
    client: 
    serviceUrl: 
     defaultZone: http://peer2:8889/eureka/ 

Wzajemne 2 konfiguracji (częściowe)

eureka: 
    dashboard: 
    path: /dashboard 
    instance: 
    hostname: peer2 
    leaseRenewalIntervalInSeconds: 3 
    client: 
    serviceUrl: 
     defaultZone: http://peer1:8888/eureka/ 
    server: 
    waitTimeInMsWhenSyncEmpty: 0 

Konfiguracja usługi użytkownika (częściowa) Port konfiguracji był nieprawidłowy.

spring: 
    application: 
    name: user-service 
    cloud: 
    config: 
     uri: http://localhost:8888/configs 

Możesz zobaczyć replikację użytkownika-usługi zarówno dla peer1, jak i peer2. Jeśli chcesz, mogę opublikować PR w twoim kodzie.

Peer 1

Peer1

Peer 2

Peer2

+0

Awesome! Spróbuję tego za kilka. Zdaję sobie sprawę, gdzie popełniłem błąd: myślałem, że nazywanie usług eureka peer1/2 pozwoli im sprawdzać się nawzajem za pośrednictwem rejestru. Ale w tym miejscu przydatne są długowieczne (elastyczne adresy IP w moim przypadku). –

+0

Mam pytanie na ten temat. W przypadku konfiguracji usługi użytkownika, czy konfigurujesz konfigurację eureka na wartość defaultZone: http: // peer1: 8888/eureka /, http: // peer2: 8888/eureka/w celu uzyskania przełączenia awaryjnego w przypadku niepowodzenia peer 1? – EvilJinious1

+0

Tak Larry, to jest idea –

2

@ spencergibb nie wspominając dlaczego wymagana jest to Hack-owski obejście. Nie ma problemu z uruchomieniem więcej niż jednego serwera Eureka na tym samym hoście. Kod Netflix (com.netflix.eureka.cluster.PeerEurekaNodes.isThisMyUrl) filtruje adresy URL równorzędne na tym samym hoście.Mogło to być zrobione, aby zapobiec rejestracji serwera jako własnego peera (domyślam się tutaj), ale ponieważ nie sprawdzają portu, świadomość peer nie działa, chyba że nazwy hostów Eureka w eureka.client.serviceUrl.defaultZone są różne. Hacky obejście tego problemu polega na zdefiniowaniu unikalnych nazw hostów, a następnie zmapowaniu ich na 127.0.0.1 w pliku /etc/hosts (lub jego odpowiedniku w systemie Windows).

Utworzyłem wpis na blogu ze szczegółami Eureka here, która zawiera brakujący szczegół z Spring doc lub bloga Netflix. Jest to wynik kilku dni debugowania i przekopywania się przez kod źródłowy.

Powiązane problemy