当前位置: 首页 > 知识库问答 >
问题:

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

吕宇定
2023-03-14

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

我可以使用boot2docker在我的Mac上本地运行(即不在Amazon/EC2),但当部署在EC2上时,Zuul找不到该服务,并报告一个“转发错误”(状态500)。

在EC2中,一切都被配置为在端口80上运行(只是在评估时,这样我就可以轻松地通过防火墙访问)。我可以在Eureka系统状态页面中看到Zuul和我的服务(尽管这些链接都不起作用!)。

客户机被配置为使用完整的AWS域名找到尤里卡,所以我可以看到他们如何找到尤里卡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,trialservice链接指向http://172.17.0.3/info

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

是否有人成功地使这种类型的设置工作,如果是,他们是如何配置Eureka属性的?

共有1个答案

元景天
2023-03-14

好了,回答我自己的问题,我找到了解决办法。它主要涉及配置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

然后,我可以点击负载均衡器,看到随着AWS负载均衡器和功能区负载均衡器在服务中循环而调用的每个服务。

 类似资料:
  • 我使用了一个简单的Spring Boot应用程序,它在Eureka中注册自己,并使用Spring cloud配置来读取一些属性。 是这样的: 我有一个rest控制器,我想为它编写一个测试。测试将使用mockmvc。简化示例如下: 控制器: 测试:

  • 我的目标是能够使用boto3运行Python程序来访问DynamoDB,而无需任何本地配置。我一直在关注这个AWS文档https://boto3.amazonaws.com/v1/documentation/api/latest/guide/configuration.html)使用“IAM角色”选项似乎是可行的https://boto3.amazonaws.com/v1/documentatio

  • 我正在Eclipse中处理一个Java项目,该项目是使用Maven构建的。我使用的是一个旧项目中的一些循环代码,其中一个类在JAR的文件夹中查找一个具有特定名称的文件,然后解析该文件的文本。在这个特定的示例中,它查找一个具有Java接口名称的文件,然后从文件内部获取实现的类名。

  • 问题内容: 我正在使用GlassFish来提供Java EE Web应用程序。在我本地的开发机器上一切正常。我有 将postgres JDBC库复制到正确的位置 在Glassfish管理控制台中配置了连接池和JDBC资源 部署了使用上述连接的网络应用 在我的浏览器中看到了结果 我正在尝试将同一应用程序部署到AWS Elastic Beanstalk托管的Glassfish实例。AWS- EB使用D

  • 因此,我曾一度通过Beanstalk使用亚马逊实例(2013.09)ami-35792c5c进行此操作。当时,此扩展脚本在 .eb 扩展/ 中放置在存储库的根目录中时效果很好 00_repo.config 01_app.config 因此,现在当我使用同一实例并启动我的环境时,我得到了关于依赖项的错误。 看起来同一个存储库现在正在返回一个更新版本的popple,它是12. x,现在它的22. x和