客户端可以绕过API网关调用前端微服务吗?

Posted

技术标签:

【中文标题】客户端可以绕过API网关调用前端微服务吗?【英文标题】:Can client-side call frontend microservices bypassing API gateway? 【发布时间】:2018-02-19 12:56:39 【问题描述】:

我们的系统是使用微服务构建的,这些微服务都位于 API 网关之后。因为它们都是 REST API 服务,所以我很清楚使用 API 网关的好处和重点。现在,前端微服务(既具有 UI 又具有相应后端来处理内部通信的小组件)呢?是否存在代理每个微服务 HTTP 调用有害的情况?

示例

我们的微服务之一是支付提供商集成。由于处理付款有特定的规定,其中之一是必需网络浏览器重定向到用户的银行页面以进行授权。由于这不可能以纯粹的后端方式进行,因此我们提供了一个前端微服务——该服务本质上提供 html,您必须嵌套在 iframe 中,并且应该能够以 e2e 方式处理付款.下面是非常简化和剥离的示例。

假设您在https://acme.com/order 上并想付款,其中嵌入了这样的 sn-p:

<iframe src="https://pay.acme.com?amount=42+USD
                                 &returnUrl=https://acme.com/thankyou/[orderId]">
</iframe>

对于https://acme.com 的开发人员来说,这基本上是一回事。 iframe 内部发生的事情会保留在那里。 https://pay.acme.com 但是现在担心:收集信用卡详细信息,验证它们,将用户重定向到银行页面以输入 2FA 代码或任何需要的内容,等到付款被批准,最后通过适当的线索将用户移回 returnUrl为哪个订单完成付款 (orderId)。

现在,pay.acme.com frontend &lt;-&gt; pay.acme.com backend 通信呢?是否可以让微服务与自己对话,或者更确切地说,所有的,甚至是对 API 消费者没有任何意义的内部通信,都必须通过 API 网关?这当然是可以做到的,并且仍然保持微服务解耦并且不知道 API 网关,但这比偏离 always do 约束并带来非常小的好处要昂贵得多,因为我们不这样做'暂时不要使用任何高级速率限制或代理功能。

【问题讨论】:

【参考方案1】:

有一个简单的方法 - 拥有 UI 网关。代替 API 调用将路由和代理资产请求调用(静态文件服务)的网关。

如果实体属于同一个限界上下文 (pay.acme.com frontend &lt;-&gt; pay.acme.com backend),它们绝对应该作为单一后端微服务存在,服务于以下之一:

同构js 具有实时重新加载功能的瘦客户端应用程序(然后 UI 网关将需要代理 ws 连接) 厚客户端应用程序 (SPA)

此类微服务是常规微服务,其 API(如果存在)应可通过 API 网关访问,并且 UI 应通过 UI 代理/网关代理。

希望对您有所帮助。

【讨论】:

以上是关于客户端可以绕过API网关调用前端微服务吗?的主要内容,如果未能解决你的问题,请参考以下文章

API 网关上的数据聚合

个推微服务网关架构实践

Ocelot实现API网关服务

第五章API服务网关(Zuul) 上

API网关

API服务网关(Zuul)