如何使用AWS Beanstalk和Spring Cloud Netflix在Docker容器之间建立连接

时间:2015-07-01 15:09:58

标签: amazon-web-services docker elastic-beanstalk microservices netflix-eureka

我的应用程序包含几个微服务。 我想使用NetFlix Eureka作为发现服务器,我想将我的应用程序部署为Docker容器。我想在我的服务之间建立沟通,但问题很少:

  1. Beanstalk总是使用nginx作为容器的反向代理,默认情况下将所有请求路由到端口80.好吧,我用一些棘手的脚本打败了它。
  2. 我的EC2 Beanstalk实例上有几个网络接口 - docker0,它是docker的桥接器,eth0是主机IP。问题是,我无法动态确定容器内的主机IP地址,因此我无法在没有硬编码的情况下将其传递给Eureka发现服务器(也作为Docker镜像运行)。使用代码或配置我只能暴露内部Docker接口而不是桥接。
  3. 所以,底线 - 我想使用Docker,Beanstalk和Eureka构建支持微服务的应用程序。解决方案应该是可扩展的,除了Eureka主机IP之外,不应该存在任何硬编码值。

    感谢。

1 个答案:

答案 0 :(得分:0)

  1. 不要使用Elastic Beanstalk - 而是使用ECS代替Docker部署。
  2. 要告诉Eureka应该使用哪个IP,如https://github.com/spring-cloud/spring-cloud-netflix/issues/30中所述,请使用以下代码段:

    public EurekaInstanceConfigBean eurekaInstanceConfig() { InetUtilsProperties inetUtilsProperties = new InetUtilsProperties(); inetUtilsProperties.setDefaultHostname(EC2MetadataUtils.getLocalHostName()); inetUtilsProperties.setDefaultIpAddress(EC2MetadataUtils.getPrivateIpAddress()); EurekaInstanceConfigBean config = new EurekaInstanceConfigBean(new InetUtils(inetUtilsProperties)); AmazonInfo info = AmazonInfo.Builder.newBuilder().autoBuild("eureka"); config.setDataCenterInfo(info); info.getMetadata().put(AmazonInfo.MetaDataKey.publicHostname.getName(), EC2MetadataUtils.getLocalHostName()); config.setHostname(EC2MetadataUtils.getLocalHostName()); config.setIpAddress(EC2MetadataUtils.getPrivateIpAddress()); config.setNonSecurePort(port); return config; }