开发者环境 – 如何调用/使用其他微服务

背景

我的环境 – Java,Play2,MySql

我在Play2 – > / S1,/ S2,/ S3上写了3个无状态的Restful Microservices

S1消费来自S2和S3的数据。 所以当用户点击/ S1时,该服务asynchronous调用/ S2,/ S3,合并数据并返回最终的json输出。 附注 – 这些服务最终将作为docker图像发送。

为了在开发环境中进行testing,我分别在端口9000,9001和9002上运行/ s1,/ s2,/ s3。 我从configuration文件等取得端口号我打了服务,一切正常。 但有一个更好的方法来设置我的开发人员框中的testing环境是否正确? 示例 – 如果我想运行20个服务等等。

所以说,在生产,他们将被称为就像mydomain.com/s1,mydomain.com/s2,mydomain.com/s3等我想要在我的开发环境框中完成此….我想有一些反向代理涉及我会想象。

所以问题是,如何在S1中调用/ S2和/ S3,而无需在开发人员环境中指定或使用端口号。 人们如何在本地机器上testing微服务?

额外奖励

知道我将把我的服务作为docker图像发送,我如何用docker容器(每个容器运行一个服务)完成同样的事情

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

在一堆不同的容器中build立大量微服务的最简单方法可能是使用Fig或Docker即将推出的集成编排工具 。 由于我们没有完整的细节,所以我将使用Fig。这是生产服务器的一个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文件将在应用程序和所有服务之间build立链接,以便在代码中可以通过主机名service1service2等引用它们。

出于开发目的,还有更多需要进入的地方:对于每个服务,您可能需要安装一个编辑代码的目录,您可能需要公开一些端口,以便您可以直接testing服务等。但是在核心上,开发环境和生产环境是一样的。

听起来好像很多,但像Fig这样的工具可以很容易地configuration和运行你的应用程序。 如果你不想使用Fig,那么你可以用Docker命令做同样的事情 – 关键是容器之间的链接。 我可能会创build一个脚本来设置生产环境和开发环境。

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

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

“我怎么做到同样的事情……”

这是一个悬而未决的问题,这里有一些很好的阅读主题。 SkyDock和SkyDNS为您提供大部分的服务发现方式,并且让您可以轻松地在远程docker集装箱之间使用networking。 我还没有看到一个更好的端到端的解决scheme,尽pipe可能有一些在那里。