2015-08-03 8 views
9

Oceniam mikroserwisy budynków za pomocą Spring Boot i Spring Cloud (Zuul i Eureka) działającymi w oddzielnych kontenerach dokowania, wdrożonych w oddzielnych instancjach Amazon EC2 .Jak skonfigurować Spring Cloud z Netflix Zuul i Eureka w Dockerze zawartym w instancji EC2

Mam prostą usługę REST, która rejestruje się w Eureka i skonfigurowałem Zuul do kierowania żądań do tej usługi, sprawdzając ją w Eureka. enter image description here

mogę uzyskać to do pracy działa lokalnie (czyli nie w Amazon/EC2) na moim Mac przy użyciu boot2docker, ale kiedy wdrożony na EC2, Zuul nie może znaleźć usługę, a donosi o „błędzie Forwarding” (stan 500).

W EC2 wszystko jest skonfigurowane do działania na porcie 80 (tylko podczas oceniania, więc mogę łatwo uzyskać dostęp przez naszą zaporę). Widzę zarówno Zuul, jak i moją usługę na stronie statusu systemu Eureka (chociaż żaden z linków nie działa!).

Klienci są skonfigurowani tak, aby znaleźć Eureka z pełną nazwą domeny AWS, więc widzę, jak Eureka jest w porządku. np.

client: 
    serviceUrl: 
     defaultZone: http://ec2-XX-XX-XX-XX.ap-southeast-2.compute.amazonaws.com:80/eureka/,http://ec2-YY-YY-YY-YY.ap-southeast-2.compute.amazonaws.com:80/eureka/ 

Jednak wydaje się, że klienci rejestrują się za pomocą wewnętrznego adresu IP dookola (na podstawie linków statusu systemu Eureka).

enter image description here

Punkty Link EdgeServer do http://172.17.0.2/info przez dowiązanie trialservice do http://172.17.0.3/info

Zgaduję to jest błędne i że inne przypadki EC2 nie wiem, aby dostać się do tego adresu.

Przeczytałem tę stronę , która sugeruje użycie elastycznych adresów IP AWS EC2, ale Miałem nadzieję, że nie będę musiał tego robić.

Ja również postrzegane jest obecna dyskusja wokół tego tematu tutaj, https://github.com/spring-cloud/spring-cloud-netflix/issues/432

Czy ktoś udało się uzyskać tego typu pracy instalacji, a jeśli tak, to jak oni skonfigurować właściwości Eureka?

+0

Pracuję teraz nad tym samym problemem. Nie jesteś pewien odpowiedzi lub obejścia w tej chwili. Jeśli znajdziesz coś, proszę zaktualizuj tutaj. Zrobię to samo. – code

Odpowiedz

12

OK, aby odpowiedzieć na własne pytanie, znalazłem rozwiązanie. Zasadniczo polega to na skonfigurowaniu eureka do używania nazwy hosta i okna dokowanego do korzystania z opcji net = host.

Oto moja konfiguracja (tylko pokazano konfigurację dla jednej strefy dostępności):

application.yml:

Zuul: 
    spring: 
     profiles: aws   
    server: 
     port: 80   
    eureka: 
     datacenter: cloud 
     instance: 
     preferIpAddress: false 
     client: 
     serviceUrl: 
      defaultZone: http://ec2-XX-XX-XX-XX.ap-southeast-2.compute.amazonaws.com:80/eureka/ 

Eureka: 
    spring: 
     profiles: aws-discoA   
    server: 
     port: 80   
    eureka: 
     instance: 
     preferIpAddress: false 
     datacenter: cloud 
     enableSelfPreservation: false 
     client: 
     name: eureka 
     preferSameZone: false 
     shouldOnDemandUpdateStatusChange: false 
     region: default 
     serviceUrl: 
      defaultZone: http://ec2-YY-YY-YY-YY.ap-southeast-2.compute.amazonaws.com:80/eureka/ 

Service: 
    spring: 
     profiles: aws 
    server: 
     port: 0 # or 80 if there is only 1 service/docker in this EC2 
    eureka: 
     datacenter: cloud 
     instance: 
     preferIpAddress: false 
     client: 
     serviceUrl: 
      defaultZone: http://ec2-XX-XX-XX-XX.ap-southeast-2.compute.amazonaws.com:80/eureka/ 

Nie jestem pewien, czy: potrzebna jest "centrum danych chmura"?

Następnie uruchomić każdy:

Zuul 

    sudo docker run -d --name edge -e JAVA_TOOL_OPTIONS="-Dspring.profiles.active=aws -Deureka.instance.hostname=$HOSTNAME" --net="host" edge 

Eureka 

    sudo docker run -d --name discovery -e JAVA_TOOL_OPTIONS="-Dspring.profiles.active=aws-discoA -Deureka.instance.hostname=$HOSTNAME" --net="host" discovery 

Service 

    sudo docker run -d --name service -e JAVA_TOOL_OPTIONS="-Dspring.profiles.active=aws -Deureka.instance.hostname=$HOSTNAME" --net="host" service 

Wystarczy, aby upewnić się, to działa w bardziej skomplikowanej konfiguracji, skonfigurowałem więcej serwerów, niektóre z wielu dokerów na EC2 i teraz mają następującą konfigurację.

enter image description here

Taka konfiguracja jest powielany w dwóch strefach dostępność równoważenia obciążenia w przedniej części Zuul serwerach. Każda usługa ma punkt końcowy, który po prostu zwraca nazwę, nazwę hosta, port i liczbę razy, gdy został wywołany.

Mogę następnie uderzyć w system równoważenia obciążenia i sprawdzić, czy każda usługa jest wywoływana jako system równoważenia obciążenia AWS, a moduły równoważenia obciążenia Ribbon przechodzą przez te usługi.

+0

Witam, szukam Zuul do uwierzytelniania i autoryzacji Microservice. Jak, jeśli w ogóle, zabezpieczyłeś swoje usługi? –

+0

To prawdopodobnie powinno być osobne pytanie, ale ten link to świetny samouczek na ten temat: https://spring.io/guides/tutorials/spring-security-and-angular-js/ – odedia

+0

Cześć Rob, próbowałem tego podejście i działa dokładnie tak, jak to opisałeś. Ale kiedy próbuję go zaimplementować w roju Docker, mam do czynienia z problemem. Używam zuul i kontener usługi jako usługa dokowania. Moja usługa zuul podaje błąd nieznanego hosta wyjątku. Jakieś sugestie? – sanjaykumar81