将微服务提升为 public API 的良好做法是什么?

What is a good practice to promote a microservice to a public API?

在观看和阅读 Martin Fowler、Sam Newman、Adrian Cockcroft 和 Sudhir Tones 的大量文章后,微服务似乎非常适合我的软件。然而,在深入思考实施时,有很多问题:

  1. 我的软件有一个 UI,我们称它为基于网络的组件。该组件将需要 coordinate/orchestrate 内部调用 10-20 个不同的微服务(我们称之为 "private microservices")和 return 数据到 AJAX 调用。在这个组件中耦合编排逻辑是不是一个好的设计?或者我应该创建另一个微服务来完成这项工作,并且基于 Web 的组件应该非常薄以将调用委托给这个微服务?
  2. 我需要公开一些 public API。我是否应该像上面的情况一样有一个单独的层来委托调用?

我认为这可能或多或少与 public/private 微服务的设计模式有关。

什么是解决上述问题的好模式?

2015 年 4 月 9 日更新

API 网关模式实际上解决了我的顾虑。我也同意关于 EAI 模式或安全考虑的其他答案。

为了进一步扩展我的发现,我认为 Netflix 架构具有所谓的 "edge service",这是服务来自基于 Web 或设备的请求的前端和中间层服务实际上是您的微服务。所以我认为要将中间层服务提升为边缘服务,这必须是一个委托。它将保持中间层的清洁和一致。

看看 https://github.com/cfregly/fluxcapacitor#project-overview 以获得更多想法。

这些决定将由两个问题驱动:状态和安全(这是状态的特定情况)。
状态:你打算如何保持瞬态(即你会推入会话数据的东西)?如果你想尝试将它们保持在 UI 中,那么你可以考虑保留纯微服务,否则你将需要一个协调的 "service" 来保持那个状态,而那必然会成为还有调度中心。

安全:身份验证是状态的一种特殊情况,通常不能存储在客户端中。它通常是驱使人们使用有状态应用程序的原因。它也将是 API 层与 Web 应用程序层的驱动因素。 API 层需要保护,可能通过某种 Auth 令牌方案(查看 OAuth 或类似方案)。此令牌的验证和用户凭据的检索可能相当慢(相对而言)。这通常在集中式服务中最有效地完成,而不是在每个微服务调用中完成。

您可以将所有编排逻辑放在流程管理器中的长 运行 事务之间。流程管理器可以订阅事件,从事件中派生命令并将此命令委托给您的另一个 MS。您可以在 Saga 中处理所有失败。当您的长 运行 逻辑抛出一些异常时,Saga 应该执行补偿操作。

更多关于 Process Manager pattern and Saga 模式。

API 网关模式是在一组微服务前面实现 public API 的好方法:http://microservices.io/patterns/apigateway.html