java - 开发者环境——如何调用/消费其他微服务

标签 java rest playframework docker

背景

我的环境——Java、Play2、MySql

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

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 镜像发送,我如何使用 docker 容器(每个容器运行一项服务)完成同样的事情

最佳答案

最简单的方法 (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 文件将在应用程序和所有服务之间建立链接,以便在您的代码中,您可以通过主机名 service1 引用它们,service2

为了开发目的,这里还有很多东西需要加入:对于每个服务,您可能想要挂载一个目录来编辑代码,您可能想要公开一些端口以便测试服务直接等等。但其核心是,开发环境与生产环境相同。

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

关于java - 开发者环境——如何调用/消费其他微服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27408510/

相关文章:

java - maven testNG 目录结构方法

java - Spring Batch - 如何使用从 REST API 请求收到的文件名启 Action 业

java - Jenkins api 太慢

c# - Web API - REST 帮助和说明

java - OptimisticLockException Ebean 即使使用@Version

java - 在数据库和 postman 上无法看到实际上传的文件(.pdf 格式)格式?

java - 即使使用关键字 "after",AOP 方面也会在给定方法之前执行?

java - 如何在 spring-cloud-stream-binder-kafka-streams :3. 1.1 中使用功能方法检索/设置 header

java - 如何在 Play 框架的索引页面上加载示例 html 页面?

json - 重载方法值 [read] 不能应用于 (String => SearchController.this.TrackSearch)