开发人员环境 - 如何调用/使用其他微服务

时间:2014-12-10 18:43:33

标签: java rest playframework docker

背景

我的环境 - Java,Play2,MySql

我在Play2上写了3个无状态Restful微服务 - > / S1,/ S2,/ S3

S1消耗来自S2和S3的数据。因此,当用户点击/ S1时,该服务异步调用/ S2,/ S3,合并数据并返回最终的json输出。附注 - 服务最终将以docker图像的形式发货。

对于在开发人员环境中进行测试,我分别在端口9000,9001和9002上运行/ s1,/ s2,/ s3。我从配置文件中提取端口号等。我点击服务,一切正常。但是有一种更好的方法可以在我的开发人员盒子上设置测试环境吗?示例 - 如果我想运行20个服务等,该怎么办?

所以说,在制作时,他们将被称为mydomain.com/s1,mydomain.com/s2,mydomain.com/s3等。我想在我的开发者环境框中完成这个....我猜想我会想到有一些反向代理。

问题

所以问题是,如何在未指定或使用开发人员环境中的端口号的情况下从S1中调用/ S2和/ S3。人们如何在本地机器上测试微服务?

额外奖金

知道我将我的服务作为docker images运送,如何使用docker容器完成相同的操作(每个容器运行一个服务)

2 个答案:

答案 0 :(得分:1)

最简单的方法(IMO)是设置您的开发环境,以尽可能接近您的生产环境。如果您希望生产应用程序使用20个微服务,每个微服务在一个单独的容器中运行,那么请使用您的开发机器。这样,当您部署到生产环境时,您不必从使用端口更改为使用主机名。

在一堆不同容器中设置大量微服务的最简单方法可能是Fig或Docker即将发布的integrated orchestration tools。由于我们没有关于即将发生的所有细节,我将使用图。这是生产服务器的fig.yml文件:

application:
  image: application-image
  links:
    - service1:service1
    - service2:service2
    - service3:service3
    ...

service1:
  image: service1-image
  ...

service2:
  image: service2-image
  ...

service3:
  image: service3-image
  ...

此缩写fig.yml文件将设置应用程序与所有服务之间的链接,以便在您的代码中,您可以通过主机名service1service2等来引用它们。 / p>

出于开发目的,还需要进一步了解:对于您可能希望安装编辑代码的目录的每个服务,您可能希望公开一些端口以便您可以测试服务但是,在它的核心,开发环境与生产环境是一样的。

它确实听起来很多,但像Fig这样的工具使配置和运行应用程序变得非常容易。如果您不想使用Fig,那么您可以使用Docker命令执行相同的操作 - 关键是容器之间的链接。我可能会创建一个脚本来为生产和开发环境进行设置。

答案 1 :(得分:0)

  

示例 - 如果我想运行20个服务等

,该怎么办?

docker将使用别名为每个链接容器在etc hosts文件中创建条目。因此,如果您链​​接了很多容器,您只需使用别名来解决它们。不要使用-p 9000:9000将端口映射到公共端口。这样,所有服务都可以在他们自己的docker主机上的端口9000上,可以从/ etc / hosts中查找

  

"我如何完成同样的事情......"

这是一个悬而未决的问题,这里有一些关于该主题的good readingSkyDock和SkyDNS为您提供了大部分服务发现方式,weave让您可以轻松地在远程docker容器之间使用网络。我还没有看到更好的端到端解决方案,尽管可能有一些解决方案。