Как мне настроить Spring Cloud с Netflix Zuul и Eureka в Docker, содержащемся в экземпляре EC2

Я оцениваю создание микросервисов с использованием Spring Boot и Spring Cloud (Zuul и Eureka), работающих в отдельных контейнерах докеров, развернутых в отдельных экземплярах Amazon EC2.

У меня есть простая служба REST, которая регистрируется в Eureka, и я настроил Zuul для маршрутизации запросов к этой службе, просматривая ее в Eureka. введите описание изображения здесь

Я могу заставить это работать локально (то есть не в Amazon / EC2) на моем Mac с помощью boot2docker, но при развертывании на EC2 Zuul не может найти службу и сообщает об ошибке пересылки (статус 500).

В EC2 все настроено для работы на порту 80 (только во время оценки, чтобы я мог легко получить доступ через наш брандмауэр). Я вижу и Zuul, и мою службу на странице состояния системы Eureka (хотя ни одна из ссылок не работает!).

Клиенты настроены на поиск Eureka с полным доменным именем AWS, поэтому я могу видеть, как они находят Eureka OK. например

  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/

Но клиенты, похоже, регистрируются со своим внутренним IP-адресом докера (на основе ссылок состояния системы Eureka).

введите описание изображения здесь

Ссылка на пограничный сервер указывает на http://172.17.0.2/info Ссылка на пробную службу указывает на http://172.17.0.3/info

Я предполагаю, что это неверно, и что другие экземпляры EC2 не знают, как добраться до этого адреса.

Я прочитал эту страницу https://github.com/Netflix/eureka/wiki/Configuring-Eureka-in-AWS-Cloud, в котором предлагается использовать эластичные IP-адреса AWS EC2, но я надеялся, что мне не придется этого делать.

Я также видел здесь текущую дискуссию по этой теме, https://github.com/spring-cloud/spring-cloud-netflix/issues/432

Кому-нибудь удалось заставить этот тип настройки работать, и если да, то как они настроили свойства Eureka?


person Rob    schedule 03.08.2015    source источник
comment
Сейчас я работаю над точно такой же проблемой. На данный момент не уверен в ответе или обходном пути. Если вы что-то найдете, обновите здесь. Я сделаю то же самое.   -  person code    schedule 05.08.2015


Ответы (1)


Хорошо, отвечая на свой вопрос, я нашел решение. В основном это включает в себя настройку eureka для использования имени хоста и докера для использования опции net = host.

Вот мои настройки (просто показаны настройки для одной зоны доступности):

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/

Я не уверен, нужен ли «датацентр: облако»?

Затем для запуска каждого:

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

Чтобы убедиться, что это работает в более сложной настройке, я настроил больше серверов, некоторые с несколькими докерами на EC2, и теперь у меня есть следующая настройка.

введите описание изображения здесь

Эта настройка дублируется в двух зонах доступности с балансировщиком нагрузки перед серверами Zuul. У каждой службы есть конечная точка, которая просто возвращает ее имя, имя хоста, порт и количество вызовов.

Затем я могу включить балансировщик нагрузки и увидеть, как каждая служба вызывается, когда балансировщик нагрузки AWS и балансировщики нагрузки ленты циклически проходят через службы.

person Rob    schedule 06.08.2015
comment
Привет, я ищу в Zuul проверку подлинности и авторизацию микросервисов. Каким образом вы обезопасили свои услуги? - person Abhijit Sarkar; 24.12.2015
comment
Вероятно, это должен быть отдельный вопрос, но эта ссылка является отличным руководством по этому вопросу: spring.io/guides/tutorials/spring-security-and-angular-js - person odedia; 07.03.2016
comment
Привет, Роб, я пробовал этот подход, и он отлично работает, как вы его описали. Но когда я пытаюсь реализовать это в Docker Swarm, я сталкиваюсь с проблемой. Я использую zuul и сервисный контейнер как докер-сервис. Моя служба zuul выдает ошибку исключения неизвестного хоста. Какие-либо предложения? - person sanjaykumar81; 11.09.2017