2015-08-03 2 views
9

Ich evaluiere Gebäude-Microservices mit Spring Boot und Spring Cloud (Zuul und Eureka) in separaten Docker-Containern, bereitgestellt in separaten Amazon EC2-Instanzen .Wie konfiguriere ich Spring Cloud mit Netflix Zuul und Eureka in einem Docker in einer EC2-Instanz?

Ich habe einen einfachen REST-Dienst, der sich bei Eureka registriert und Zuul so konfiguriert hat, dass er Anfragen an diesen Dienst weiterleitet, indem er in Eureka nachschlägt. enter image description here

ich bekommen kann dies lokal ausgeführt arbeiten (dh nicht in Amazon/EC2) auf meinem Mac mit boot2docker, aber wenn sie auf EC2 eingesetzt, kann Zuul den Dienst nicht finden, und meldet einen ‚Forwarding Fehler‘ (Status 500).

In EC2 ist alles konfiguriert, um auf Port 80 zu laufen (nur während der Auswertung, so kann ich einfach über unsere Firewall zugreifen). Ich kann sowohl Zuul als auch meinen Dienst auf der Eureka-Systemstatusseite sehen (obwohl keiner der Links funktioniert!).

Die Clients sind so konfiguriert, Eureka mit einem vollständigen AWS-Domänennamen zu finden, damit ich sehe, wie sie Eureka OK finden. z.B.

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/ 

aber scheinen die Kunden mit ihren internen Docker IP-Adresse (basierend auf dem Systemstatus Links Eureka) Registrierung selbst werden.

enter image description here

Die Edge-Server Link auf http://172.17.0.2/info Die trialservice Link verweist auf http://172.17.0.3/info

Ich vermute, dies ist falsch, und dass andere EC2-Instanzen nicht wissen, an diese Adresse zu erhalten.

Ich habe diese Seite https://github.com/Netflix/eureka/wiki/Configuring-Eureka-in-AWS-Cloud gelesen, die die Verwendung von AWS EC2 Elastic IP-Adressen vorschlägt, aber Ich hatte gehofft, ich würde das nicht tun müssen.

ich auch gesehen habe es eine aktuelle Diskussion ist Eigenschaften, um dieses Thema hier, https://github.com/spring-cloud/spring-cloud-netflix/issues/432

Hat jemand es geschafft, diese Art von Setup-Arbeiten zu bekommen, und wenn ja, wie haben sie konfigurieren, um die Eureka?

+0

Ich arbeite jetzt genau an dem gleichen Problem. Ich bin mir der Antwort oder der Problemumgehung im Moment nicht sicher. Wenn Sie etwas finden, bitte aktualisieren Sie hier. Ich werde dasselbe tun. – code

Antwort

12

OK, um meine eigene Frage zu beantworten, habe ich eine Lösung gefunden. Es beinhaltet im Wesentlichen die Konfiguration von Eureka, um den Hostnamen und das Andockfenster für die Verwendung der Option net = host zu verwenden.

Hier ist mein Setup (nur für eine Verfügbarkeit Zone zeigt Setup):

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/ 

Ich bin nicht sicher, ob "Rechenzentrum: Wolke" benötigt wird?

Dann wird jeder zu starten:

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 

Genau dies in einer komplexeren Einrichtung arbeitet, um sicherzustellen, konfiguriert ich mehrere Server, einige mit mehreren dockers pro EC2 und jetzt das folgende Setup.

enter image description here

Diese Einrichtung ist in zwei Verfügbarkeitszonen mit einem Load Balancer vor dem Zuul Servern dupliziert. Jeder Dienst hat einen Endpunkt, der nur seinen Namen, Hostnamen, Port und die Anzahl der Aufrufe zurückgibt.

Ich kann dann den Load Balancer treffen und sehen, dass jeder Service aufgerufen wird, da der AWS Load Balancer und die Ribbon Load Balancer die Services durchlaufen.

+0

Hallo, Ich bin in Zuul für Microservice Authentifizierung und Autorisierung suchen. Wie haben Sie, wenn überhaupt, Ihre Dienstleistungen abgesichert? –

+0

Dies sollte wahrscheinlich eine separate Frage sein, aber dieser Link ist ein großes Tutorial zu diesem Thema: https://spring.io/guides/tutorials/spring-security-and-angular-js/ – odedia

+0

Hallo Rob, habe ich das versucht Ansatz und es funktioniert gut, wie Sie es beschrieben haben. Aber wenn ich versuche, es in Docker Schwarm zu implementieren, sehe ich mich damit konfrontiert. Ich führe zuul und Service Container als Docker Service. Mein zuul-Dienst gibt einen Fehler mit unbekannter Host-Ausnahme aus. Irgendwelche Vorschläge? – sanjaykumar81

Verwandte Themen