我应该如何在EC2实例中包含的Docker中使用Netflix Zuul和Eureka配置Spring Cloud

Rob*_*Rob 14 spring amazon-web-services spring-cloud netflix-eureka

我正在使用Spring Boot和Spring Cloud(Zuul和Eureka)在单独的docker容器中运行构建微服务,这些容器部署在单独的Amazon EC2实例中.

我有一个简单的REST服务,它向Eureka注册,并已配置Zuul通过在Eureka中查找请求来将请求路由到此服务. 在此输入图像描述

我可以使用boot2docker在Mac上本地运行(即不在Amazon/EC2中),但是当部署在EC2上时,Zuul无法找到服务,并报告"转发错误"(状态500).

在EC2中,一切都配置为在端口80上运行(只是在评估时,我可以通过我们的防火墙轻松访问).我可以在Eureka系统状态页面中看到Zuul和我的服务(尽管没有链接可用!).

客户端配置为使用完整的AWS域名查找Eureka,因此我可以看到他们如何找到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/
Run Code Online (Sandbox Code Playgroud)

但是,客户似乎正在使用其内部docker IP地址进行注册(基于Eureka系统状态链接).

在此输入图像描述

edgeserver链接指向http://172.17.0.2/info 试用服务链接指向http://172.17.0.3/info

我猜这是不正确的,其他EC2实例不知道到达这个地址.

我已经阅读了这个页面https://github.com/Netflix/eureka/wiki/Configuring-Eureka-in-AWS-Cloud,建议使用AWS EC2弹性IP地址,但我希望我不必这样做.

我也看到目前有关于这个主题的讨论,https://github.com/spring-cloud/spring-cloud-netflix/issues/432

有没有人设法让这种类型的设置工作,如果是这样,他们是如何配置Eureka属性的?

Rob*_*Rob 16

好的,回答我自己的问题,我找到了解决方案.它主要涉及配置eureka以使用主机名和docker来使用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/
Run Code Online (Sandbox Code Playgroud)

我不确定是否需要"数据中心:云"?

然后发布每个:

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
Run Code Online (Sandbox Code Playgroud)

为了确保在更复杂的设置中工作,我配置了更多的服务器,其中一些服务器每个EC2有多个docker,现在有以下设置.

在此输入图像描述

此设置在两个可用区域中重复,并在Zuul服务器前面具有负载平衡器.每个服务都有一个端点,只返回其名称,主机名,端口及其被调用的次数.

然后,我可以点击负载均衡器,看到每个服务被调用为AWS负载均衡器,并且功能区负载均衡器在服务中循环.