2015-08-03 15 views
9

Sto valutando i microservizi di costruzione utilizzando Spring Boot e Spring Cloud (Zuul e Eureka) in contenitori docker separati, distribuiti in istanze Amazon EC2 separate .Come configurare Spring Cloud con Netflix Zuul ed Eureka in una finestra mobile contenuta in un'istanza EC2

Ho un semplice servizio REST che si registra con Eureka e ho configurato Zuul per instradare le richieste a questo servizio cercandole su Eureka. enter image description here

posso arrivare a questo lavoro in esecuzione a livello locale (cioè non in Amazzonia/EC2) sul mio Mac utilizzando boot2docker, ma quando distribuito su EC2, Zuul non riesce a trovare il servizio, e segnala un 'errore di inoltro' (stato 500).

In EC2, tutto è configurato per funzionare sulla porta 80 (solo durante la valutazione in modo da poter accedere facilmente attraverso il nostro firewall). Posso vedere sia Zuul che il mio servizio nella pagina di stato del sistema Eureka (anche se nessuno dei collegamenti funziona!).

I client sono configurati per trovare Eureka con un nome di dominio AWS completo, così posso vedere come trovano Eureka OK. ad es.

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/ 

Ma, i clienti sembrano essere se stessi la registrazione con la loro finestra mobile interna indirizzo IP (basata sui link stato del sistema Eureka).

enter image description here

I punti di collegamento Edgeserver a http://172.17.0.2/info I punti di collegamento trialservice a http://172.17.0.3/info

Sto indovinando questo non è corretto e che altre istanze EC2 non sanno per arrivare a questo indirizzo.

Ho letto questa pagina https://github.com/Netflix/eureka/wiki/Configuring-Eureka-in-AWS-Cloud che suggerisce di utilizzare gli indirizzi IP elastici AWS EC2, ma speravo di non doverlo fare.

Ho visto anche c'è un dibattito in corso intorno a questo argomento qui, https://github.com/spring-cloud/spring-cloud-netflix/issues/432

Qualcuno è riuscito ad ottenere questo tipo di lavoro messa a punto, e se sì, come hanno fatto a configurare le proprietà Eureka?

+0

Sto lavorando esattamente allo stesso problema ora. Non sono sicuro della risposta o soluzione alternativa al momento. Se trovi qualcosa per favore aggiorna qui. Farò lo stesso. – code

risposta

12

OK, per rispondere alla mia domanda, ho trovato una soluzione. Fondamentalmente implica la configurazione di eureka per utilizzare il nome host e la finestra mobile per utilizzare l'opzione net = host.

Qui è la mia messa a punto (solo mostrando di impostazione per una disponibilità zona):

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/ 

io non sono sicuro se: è necessaria "datacenter cloud"?

Poi per lanciare ogni:

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 

solo per garantire questo funziona in una configurazione più complessa, ho configurato più server, alcuni con più lavoratori portuali per EC2 e ora hanno la seguente configurazione.

enter image description here

Questa configurazione viene duplicato in due zone disponibilità con bilanciamento del carico di fronte ai server Zuul. Ogni servizio ha un endpoint che restituisce solo il nome, il nome host, la porta e il numero di volte in cui è stato chiamato.

Posso quindi eseguire il bilanciamento del carico e vedere ogni servizio richiamato mentre il bilanciamento del carico AWS e i bilanciatori del carico a nastro attraversano i servizi.

+0

Ciao, sto cercando Zuul per l'autenticazione e l'autorizzazione di Microservice. In che modo, se mai, hai assicurato i tuoi servizi? –

+0

Questa dovrebbe probabilmente essere una domanda separata, ma questo link è un ottimo tutorial sull'argomento: https://spring.io/guides/tutorials/spring-security-and-angular-js/ – odedia

+0

Ciao Rob, ho provato questo approccio e funziona bene il modo in cui lo hai descritto. Ma quando cerco di implementarlo nello sciame Docker, sto affrontando un problema. Sto eseguendo zuul e il container di servizio come servizio di docker. Il mio servizio zuul sta dando errore di eccezione dell'host sconosciuto. Eventuali suggerimenti? – sanjaykumar81

Problemi correlati