kubernetes-handbook/usecases/service-mesh-vs-api-gateway.md

92 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 服务网格对比 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/)