【问题标题】:How should I configure Spring Cloud with Netflix Zuul and Eureka in a Docker contained in an EC2 instance我应该如何在 EC2 实例中包含的 Docker 中使用 Netflix Zuul 和 Eureka 配置 Spring Cloud
【发布时间】:2015-10-25 02:11:02
【问题描述】:

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

我有一个向 Eureka 注册的简单 REST 服务,并已将 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/

但是,客户端似乎正在使用其内部 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 属性的?

【问题讨论】:

  • 我现在正在处理完全相同的问题。目前不确定答案或解决方法。如果您发现了什么,请在此处更新。我也会这样做。

标签: spring amazon-web-services spring-cloud netflix-eureka


【解决方案1】:

好的,为了回答我自己的问题,我找到了解决方案。它基本上涉及配置 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/

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

然后启动每个:

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 上具有多个 docker,现在具有以下设置。

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

然后我可以点击负载均衡器并看到每个服务都被称为 AWS 负载均衡器,并且 Ribbon 负载均衡器在服务中循环。

【讨论】:

  • 您好,我正在研究 Zuul 的微服务身份验证和授权。如果有的话,您是如何保护您的服务的?
  • 这应该是一个单独的问题,但这个链接是一个很好的教程:spring.io/guides/tutorials/spring-security-and-angular-js
  • 嗨,Rob,我尝试了这种方法,并且按照您描述的方式工作得很好。但是当我尝试在 Docker swarm 中实现它时,我遇到了问题。我正在将 zuul 和服务容器作为 docker 服务运行。我的 zuul 服务给出了未知主机异常的错误。有什么建议吗?
猜你喜欢
  • 2020-04-15
  • 1970-01-01
  • 1970-01-01
  • 2016-01-05
  • 2017-11-02
  • 2020-01-02
  • 2018-01-01
  • 2017-07-21
  • 1970-01-01
相关资源
最近更新 更多