# 服务网格对比 API 网关

API网关（API Gateway）为所有与应用程序后端交互的客户端流量提供单一的入口和出口点，作为集群南北流量的入口；服务网格既可以管理南北流量，又可以管理集群内部的东西流量，其基本涵盖了 API 网关的功能。

本文将为你介绍：

* 为什么需要 API 网关？
* 何时使用网关？
* 服务网格与 API 网关有什么关系？
* 使用服务网格后还需要 API 网关吗？

## 为什么需要 API 网关？

客户端可能是你的应用程序的前端，形式是网页或应用程序，也可能是你的组织内部需要与你的应用程序交互的其他内部服务，或者是第三方客户端应用程序和网站。像API代理一样，网关接收传入的请求，并将其引导到系统的相关部分，然后将响应转发回客户端。但API网关不仅仅是一个简单的反向代理服务，它提供了一个统一的接口，并提供了安全、负载均衡、请求和响应转换、监控和追踪等功能。

## 什么是 API 网关？

API 网关主要功能是：作为客户端访问的统一界面，并且可以管理 API，确保流量安全。

### 统一界面

API网关的主要好处之一是能够将后端系统的复杂性与客户端交互的外向API解耦。API网关在微服务架构中特别受欢迎，在微服务架构中，一个应用程序可能由数十甚至数百个松散耦合的服务组成，这些服务通过网络相互通信。通过将系统分解为微服务（基于业务功能的较小组件），开发团队可以比单体设计更快速地交付变更。

然而，微服务架构的更大灵活性和敏捷性带来了更大的复杂性；每个服务可能用不同的语言或框架编写，并通过API、RPC或消息协议与其他组件进行通信。这就是API网关的作用。API网关不是要求系统外的客户端直接与各种后端服务交互，而是在系统边缘添加一个API网关，为外部客户提供一个统一的接。网关作为一个抽象层，为整个应用提供面向外部的API端点，并掩盖了底层服务的复杂性。

在后端和客户端之间有了这个抽象层，又增加了一个好处。微服务架构的优势之一是，各个团队可以快速、定期发布变更。然而，当这些变化涉及到对API的定期更新时，客户端可能很难保持更新。使用API网关可以让面向外部的API端点保持更稳定，后端变化会影响到从网关到后端的连接，而客户端保持不变，除非正在添加或删除功能。

此外，对于从单体架构过渡到微服务的组织来说，提供一致的面向客户端的接口可以使过渡过程更加顺利，因为这样对前端来说是透明的，后端的变化是隐藏的。

### 管理 API

API代理只是简单地路由请求和响应，而API网关则提供了围绕管理传入和传出流量的额外功能。网关还可以处理跨多个后端实例的服务发现和请求的负载均衡。在商业化API的情况下，客户根据请求的数量和/或频率付费，网关可以管理不同客户的速率限制。

API网关可以通过金丝雀发布来促进新功能的发布过程。网关将指定比例的传入请求路由到服务的新版本，使负责的团队能够监控问题，同时限制任何失败的影响。一旦团队有信心，流量就会切换到新版本。

网关的配置通常通过命令行界面或管理员API应用的策略进行管理，有些网关还提供管理GUI。

### 确保流量安全

作为您的应用程序的入口点，API网关的理想定位是确保传入请求的安全和保护您的系统。在网关上实施身份验证和授权可以防止恶意行为者获得对服务的访问，而节流请求的数量和维护白名单和/或黑名单可以降低分布式拒绝服务攻击的风险。API网关还可以管理客户端之间和系统内部的通信加密。

在网关处应用安全性，不仅可以减少潜在的攻击面，还可以确保策略的应用一致且高效。在微服务架构中，集中式管理比要求为每个服务实现相同的功能更有效率，因为要实现的话可能会使用不同的语言和框架。

## 何时需要使用 API 网关？

虽然API以各种形式存在了几十年，但在过去的10年里，API的数量有了巨大的增长，因为组织越来越多地采用API优先的开发方法。在构建产品时，不是将客户端如网站或基于GUI的应用程序与后端紧密耦合，然后构建和暴露API，以允许第三方与同一系统进行交互，而是专注于提供一个对外的API，该API将被内部和外部的所有客户消费。这样不仅效率更高，而且还能为系统提供更多的使用机会。

举个简单的例子，一家航空公司有一个管理航班时刻表和可用性的系统。同样的API可以被航空公司自己的网站和移动应用以及第三方旅行预订服务使用，无论是面向企业还是面向消费者。虽然API优先的方法避免了新功能发布时的重复工作，但通过网关提供API可避免客户因后端变化而受到不必要的影响，并允许航空公司监控和确保使用、管理性能和交易变现。例如，航空公司可能希望对来自第三方客户端的请求适用不同的速率限制，并根据交易数量收费。

虽然API网关位于后端和客户端之间的边界，但这并不意味着它们必须面向外部。网关的目的是为客户提供一个与系统交互的接口，这些客户端可以是内部的，也可以是外部的。

例如，如果一个组织有多个独立的内部系统，例如一个管理产品订单的系统和一个独立的财务系统，可能需要允许一个系统向另一个系统发出请求。订单管理系统边缘的API网关将允许财务系统请求有关订单的数据。该网关还可以支持一个客户端网络应用，供财务团队用户查看数据和生成报表（进而导致对订单系统的请求）。当然，也可以建立一个由这些功能和数据存储组成的单一系统；系统之间的边界应该在哪里，取决于业务需求和背景。

## 选择API网关时的考虑因素

在决定一个API网关是否能满足你的需求之前，了解网关不做什么很重要。在围绕微服务构建的系统中，通过网关进来的每个请求必须被路由到相关的服务。只有在后端服务之间已经存在网络和通信方法的情况下，网关才能路由这些请求。在同步通信或异步通信之间进行选择，是按服务实现还是使用服务网格，这都是系统设计的重要部分，是否需要API网关，如果需要，选择哪一个。

选择API网关时，要同时考虑你的架构和部署环境。它们现在是什么样子的，你期望它们如何发展？你可能会从头开始构建一个云原生系统，以便利用容器和自动可扩展性的优势，或者你可能会在内部托管系统，并计划随着系统的发展进行混合部署。一些API网关是为特定环境设计的，而另一些则提供了与您的应用程序一起发展的灵活性。

根据设计，在您的系统中添加一个API网关，会给所有传入和传出的流量增加一个跳转。因此，在为您的系统选择网关时，性能应该是一个关键的考虑因素。并非所有的网关都是一样的，通过网关发送请求所产生的额外延迟会对最终用户产生明显的影响。另一方面，一些网关允许您跟踪请求和响应时间。这些性能数据不仅可以帮助您优化系统，而且还可以在某些东西没有按照预期工作时提供指示。

## 使用API网关时的最佳实践

作为系统的单一入口和出口点，网关需要确保对系统的访问安全。确保用户在通过之前进行身份验证和请求授权，应用转换以确保响应中只包含必要的信息，以及速率限制和流量节流都可以在网关上实施。

网关作为系统的单一入口点，不应该出现单点故障。稳健可靠的设计是一个良好的开端，但根据系统的正常运行时间要求，您可能希望实现API网关的高可用性集群。有些网关要求为每个实例复制数据存储，从而增加了整体成本，而其他网关则支持单数据库和多数据库实现。

由于所有流量都流经网关，它们是监控流量和观察系统行为理想地点。选择一个能够收集指标、支持日志记录和跟踪并提供分析趋势的仪表板的网关，可以让您更深入地了解您的系统，并使您能够在症状出现时迅速对问题做出反应。

## 服务网格与 API 网关的关系

上文说到，API 网关负责管理进出集群的入口，即**南北向流量**；服务网格的首要功能是管理集群内部服务间的流量，即**东西向流量**，而有些服务网格自带 API 网关，如 Istio 内置基于 Envoy 的 API 网关，Istio 中可以声明 Gateway 对象并与 VirtualService 绑定来履行网关职能，这样的服务网格可以接管进出集群及集群内部所有服务的流量。限于服务网格中内置的 sidecar 主要作为代理而存在，而未对作为 API 网关的功能作定制开发，可能在功能上逊色于传统的 API 网关。

## 使用了 API 网关是否还需要服务网格？

API 网关和服务网格并非二选一，两者可以同时存在。如果你已经有稳定成熟的微服务中间件，对于集群内服务的安全性、可观察性要求不高，可以继续沿用传统的 API 网关。但是如果你已经开始迁移到服务网格，并且希望构建零信任网络，对集群内服务进行全方位的可观察性分析，可以继续使用 API 网关和服务网格，或逐步将 API 网关迁移到服务网格中。

## 如何为服务网格选择 API 网关？

[这篇文章](https://cloudnative.to/blog/how-to-pick-gateway-for-service-mesh/)详细解读了 Kubernetes 如何对外暴露服务，Istio 服务网格是如何支持 API 网关的，虽然 Istio 内置了 Gateway，但是，你仍然可以选择自己喜欢的网关，如 Traefik，参考[在 Istio 服务网格中使用 Traefik Ingress Controller](https://cloudnative.to/blog/using-traefik-ingress-controller-with-istio-service-mesh/)。

## 结论

API网关为客户与您的系统进行交互提供了一个一致的接口，也是管理请求和响应的中心点。在微服务架构中，它们可以用来实现原本必须在每个单独服务中复制的功能，并且可以帮助从单体设计向松散耦合的服务平滑过渡。

在您的系统中添加一个API网关具有许多优势，但它也增加了另一个需要配置和维护的组件，因此您需要确保它得到有效的使用。在选择网关时，请考虑您的系统的现在和未来的需求；一个高性能、低延迟的网关，并可随着系统的发展而扩展功能，将确保它在不给系统增加多余重量的情况下提供价值。

## 参考

* [What is the Purpose of an API Gateway? - konghq.com](https://konghq.com/learning-center/api-gateway/)
* [如何为服务网格选择入口网关？ - cloudnative.to](https://cloudnative.to/blog/how-to-pick-gateway-for-service-mesh/)
* [在 Istio 服务网格中使用 Traefik Ingress Controller - cloudnative.to](https://cloudnative.to/blog/using-traefik-ingress-controller-with-istio-service-mesh/)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://doc.cncf.vip/kubernetes-handbook/fu-wu-wang-ge/the-enterprise-path-to-service-mesh-architectures/service-mesh-vs-api-gateway.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
