重定向是 API 网关的有效策略吗?
Posted
技术标签:
【中文标题】重定向是 API 网关的有效策略吗?【英文标题】:Is redirection a valid strategy for an API Gateway? 【发布时间】:2019-11-07 23:31:28 【问题描述】:我阅读了this article 关于 API 网关模式的信息。我意识到 API 网关通常用作 反向代理,但这会导致出现瓶颈。如果对应用程序公共服务的所有请求都通过单个网关,甚至是跨网关多个副本的单个负载均衡器(可能是比 API 网关更容易处理大量带宽的硬件负载均衡器),那么单个接入点是瓶颈。
我也知道这是一个广泛的瓶颈,因为它只需要在代理中传递消息,因为网关和负载平衡器本身不负责任何处理或查询。然而,想象一个有很多用户的非常大的应用程序,需要非常强大的硬件才能注意到通过网关或负载平衡器传输的大量带宽,因为对网关公开的每个微服务的每个请求都通过该单个访问点传输。
如果 API 网关只是将客户端重定向到公开的微服务(有点像自定义 DNS 查找),则硬件要求会低得多。这是因为往返 API 网关的消息非常小,请求仅包含微服务名称,响应仅包含关联的公共 IP 地址。
我认识到,由于外部请求的增加,这种模式会导致更大的延迟。由于每个微服务都是公开的,而不是在单个入口点提供身份验证,因此保护起来也更加困难。但是,它将允许带宽分布更均匀,并提供更广泛的瓶颈,从而使应用程序更具可扩展性。这是一个有效的策略吗?
【问题讨论】:
【参考方案1】:从很多角度来看,基于 DNS/公共 IP 的方法并不好:
更高的攻击面,因为您有太多的暴露点并且每个都需要保护 没有。所需的公共 IP 数更高 您可能需要更多带有子域或域的 DNS 设置才能用于这些 API 很多时候,您的 API 将在根路径上运行,但您可能希望在文件夹路径example.com/service1
上公开它们,这需要
你可以使用一些网关来做同样的事情
处理这些公开的 SSL 证书
集中节点集的安全性与保护每个公开服务的安全性成为一项非常艰巨的任务
【讨论】:
这些原因中的许多似乎本质上是相同的; 1、5 和 6 都指保护多个节点而不是单个入口点。 4 问题不大;无论如何,url 不应该用于任何面向客户的 UX 问题,所以如果它们都必须是子域而不是单个域的不同端点,那很好,如果这意味着应用程序更具可扩展性。如果项目符号 2 是支持云的系统,则它不是什么大问题。这些 ips 随平台提供。 Bullet 3 也很容易克服。那么,如果它们都可以通过通配符 SSL 得到保护,那么问题是什么? 另外,如果网关将客户端重定向到正确的子域,例如example.com/gateway/microservice1 转到 microservice1.example.com,然后客户端甚至并不真正关心子域。无论如何,他们通过“文件夹结构”的重定向访问子域。 @Nerdizzle,有多种方式可以做事,然后通常会有更被接受的做事方式。入口网关通常是这样一种被接受的方式。网关与直接暴露的额外跃点可能会给您一些额外的毫秒数,但您必须权衡成本。此外,如果您使用的是响应时间非常关键的应用程序,那么您可以研究这些类型的解决方案,但否则这样做是过度的【参考方案2】:虽然理论上可以将客户端直接重定向到节点,但存在一些缺陷。
@Tarun 已涵盖安全、证书和 DNS 管理
高可用性问题
DNS 缓存它们所服务的域与 IP,因为它们很少更改。如果我们使用 DNS 公开多个服务实例,并且其中一台服务器出现故障,或者如果我们正在进行部署,DNS 将继续将请求路由到已停机相当长一段时间的节点。我们无法控制外部 DNS 及其政策。 使用反向代理,我们可以避免根据运行状况检查访问这些节点。
【讨论】:
您仍然可以为每个微服务使用反向代理,但使用从网关到这些反向代理的重定向。如果反向代理出现故障,这只是一个问题。如果是这样的话,没有任何策略可以解决这个问题。如果无法访问微服务负载均衡器,则无法访问微服务。您只需要为每个负载均衡器/反向代理提供公共 IP/DNS 解析,而且它们不应该改变。 同意。但是你会遇到你最初提到的同样的瓶颈,尽管是在稍后的阶段。此外,要进行 Canary 部署等,您可能希望将一些服务捆绑在同一个反向代理后面。这种分组很快升级为原始问题,无论如何我们都需要处理。 如果您的服务组彼此完全独立,并且从不需要相互交互,那么请务必将它们完全分区并通过重定向导航到它们。 这很公平。虽然“对微服务的每个请求都在反向代理中遇到瓶颈”的问题比“对整个应用程序的每个请求都在反向代理中遇到瓶颈”的影响要小得多,但您确实会以某种方式遇到瓶颈反向代理,而防止这种情况只能通过公开每个节点来完成。以上是关于重定向是 API 网关的有效策略吗?的主要内容,如果未能解决你的问题,请参考以下文章