mirror of
https://github.com/LCTT/TranslateProject.git
synced 2024-12-26 21:30:55 +08:00
156 lines
11 KiB
Markdown
156 lines
11 KiB
Markdown
|
[#]: subject: "Use this open source API gateway to scale your API"
|
|||
|
[#]: via: "https://opensource.com/article/23/1/api-gateway-apache-apisix"
|
|||
|
[#]: author: "Bobur Umurzokov https://opensource.com/users/iambobur"
|
|||
|
[#]: collector: "lkxed"
|
|||
|
[#]: translator: "cool-summer-021"
|
|||
|
[#]: reviewer: "wxy"
|
|||
|
[#]: publisher: "wxy"
|
|||
|
[#]: url: "https://linux.cn/article-15943-1.html"
|
|||
|
|
|||
|
使用开源 API 网关实现可伸缩 API
|
|||
|
======
|
|||
|
|
|||
|
![][0]
|
|||
|
|
|||
|
> 采用 Apache APISIX 的 API 主导架构。
|
|||
|
|
|||
|
API 网关是一个单一节点,提供对 [API][1] 调用入口。网关聚合了所请求的服务,并相应传回合适的响应信息。为了令你的 API 网关有效地工作,设计一个可靠、高效且简洁地 API 至关重要。本文介绍一种设计风格,但只要你理解其中的重点内容,它就能解决你的相关问题。
|
|||
|
|
|||
|
### 由 API 主导的方法
|
|||
|
|
|||
|
API 主导的方法是将 API 置于应用程序和它们需要访问的业务能力之间的通信核心,从而在所有数字通道上一致地交付无缝功能。API 主导的连接是指使用一种可重用、且设计得当的 API 来连接数据和应用程序的方法。
|
|||
|
|
|||
|
### API 主导的架构
|
|||
|
|
|||
|
API 主导的架构是一种架构方法,它着眼于实现重用 API 的最佳方式。它能解决以下问题:
|
|||
|
|
|||
|
- 保护 API,使外界无法在未授权情况下访问 API
|
|||
|
- 确保应用程序能找到正确的 API 端点
|
|||
|
- 限制对 API 的请求次数,从而确保持续的可用性
|
|||
|
- 支持持续集成、测试、生命周期管理、监控、运维等等
|
|||
|
- 防止错误在栈间传播
|
|||
|
- 对 API 的实时监测和分析
|
|||
|
- 实现可伸缩和灵活的业务能力(例如支持 [微服务][2] 架构)
|
|||
|
|
|||
|
### API 资源路由
|
|||
|
|
|||
|
实现一个 API 网关,把它作为与所有服务通信的单一入口点,意味着使用者只需要知道 URL 就能使用 API。将请求路由到相应的服务端点,并执行相应的功能是 API 网关的职责。
|
|||
|
|
|||
|
![Image depicting the API routing traffic.][3]
|
|||
|
|
|||
|
由于客户端应用程序不需要从多个 HTTP 端点调用功能,这个办法就减少了 API 使用者的操作复杂度。对每个服务来说,也不需实现一个单独的层级去实现认证、授权、节流和速度限制。大多数API 网关,如开源的 [Apache APISIX][4],已经包含了这些核心功能。
|
|||
|
|
|||
|
### API 基于内容的路由
|
|||
|
|
|||
|
基于内容的路由机制也使用 API 网关根据请求的内容进行路由调用。例如,一个请求可能是基于 HTTP 请求的头部内容或消息体被路由,而不只基于它的目标 URI。
|
|||
|
|
|||
|
考虑这样一个场景:为了将负载在多个数据库实例间均分,需要对数据库进行分区。当记录总数较大,单个数据库实例难以管理负载时,常常会用这个办法。
|
|||
|
|
|||
|
还有一个更好的办法,就是把记录在多个数据库实例间分散开来。然后你实现多个服务,每个不同的数据库都有一个服务,把一个 API 网关作为访问所有服务的唯一入口。然后,你可以配置你的 API 网关,根据从 HTTP 头或有效载荷中获得的密钥,将调用路由到相应的服务。
|
|||
|
|
|||
|
![Image of the API gateway exposing a single customer.][5]
|
|||
|
|
|||
|
在上面的图表中,一个 API 网关向多个客户服务暴露一个单一的 `/customers` 资源,每个服务都有对应的不同数据库。
|
|||
|
|
|||
|
### API 地理路由
|
|||
|
|
|||
|
API 地理路由解决方案根据 API 调用的来源将其路由到最近的 API 网关。为了防止地理距离导致的延迟问题(例如一个位于亚洲的客户端调用了位于北美地区的 API),你可以在多个地区部署 API 网关。对于一个 API 网关,你可以在每个区域使用不同的子域名,让应用程序基于业务逻辑选择最近的网关。因此 API 网关就提供了内部负载均衡,确保进入的请求分布于可用的实例之间。
|
|||
|
|
|||
|
![Image of a DNS traffic management system.][6]
|
|||
|
|
|||
|
通常使用 DNS 流量管理服务和 API 网关,针对该区域的负载均衡器解析子域名,定位到距离最近的网关。
|
|||
|
|
|||
|
### API 聚合器
|
|||
|
|
|||
|
这项技术对多个服务执行操作(例如查询),并向客户端服务以单个 HTTP 响应的形式返回结果。API 聚合器使用 API 网关在服务器端代表使用者来执行这项工作,而非让客户端程序多次调用 API。
|
|||
|
|
|||
|
假定你有一款移动端 APP,对不同的 API 发起多次调用。这增加了客户端代码的复杂性,导致网络资源的过度使用,而且由于延迟性,用户体验也不好。网关可以接收所有需要的信息,可以要求认证和验证,并理解来自每个 API 的数据结构。它也可以传递响应的有效载荷,因此它们也会作为一个用户需要的统一负载传回移动端。
|
|||
|
|
|||
|
![Image of an API gateway.][7]
|
|||
|
|
|||
|
### API 集中认证
|
|||
|
|
|||
|
在这种设计中,API 网关就是一个集中式认证网关。作为一个认证者,API 网关在 HTTP 请求头中查找访问凭据(例如不记名的令牌)。然后它借助于身份验证提供方执行验证凭据的业务逻辑。
|
|||
|
|
|||
|
![Image of a tree showing API gateway's centralized authentication.][8]
|
|||
|
|
|||
|
使用 API 网关的集中式身份验证能解决很多问题。它完全取代了应用程序中的用户管理模块,通过对来自客户端应用程序的身份验证请求的快速响应来提高性能。Apache APISIX 提供了一系列插件,支持不同的 API 网关认证方法。
|
|||
|
|
|||
|
![Image showing Apache ASPISIS and various plugins.][10]
|
|||
|
|
|||
|
### API 格式转换
|
|||
|
|
|||
|
API 格式转换是通过同一传输方式将有效载荷从一种格式转换为另一种格式的能力。例如,你可以通过 HTTPS 从 XML/SOAP 格式转换为 JSON 格式,反之亦然。API 网关提供了支持 [REST API][11] 的功能,可以有效地进行负载和传输的转换。例如,它可以把消息队列遥测传输(MQTT)转换为 JSON 格式。
|
|||
|
|
|||
|
![Image depicting APISIX transfers.][12]
|
|||
|
|
|||
|
Apache APISIX 能够接收 HTTP 请求,对其进行代码转换,然后将其转发给 gRPC 服务。它通过 [gRPC Transcode][13] 插件获取响应并将其以 HTTP 格式返回给客户端。
|
|||
|
|
|||
|
### API 的可观察性
|
|||
|
|
|||
|
现在,你知道 API 网关为进入各种目的地的流量提供了一个中心控制点。但它也可以是一个中心观察点,因为就监控客户端和服务器端的流量来说,它有独特的资格。为了收集监测工具所需要的数据(结构化日志、度量和跟踪),你可以对 API 网关作出调整。
|
|||
|
|
|||
|
Apache APISIX 提供了 [预先构建的连接器][14],因此你可以跟外部监测工具结合使用。你可以利用这些连接器从你的 API 网关收集日志数据,进一步获得有用的指标,并获取完整可见的服务使用情况。
|
|||
|
|
|||
|
### API 缓存
|
|||
|
|
|||
|
API 缓存通常在网关内部实现。它可以减少对端点的调用次数,同时通过缓存上游的响应,改进了请求延迟的情况。如果网关缓存对请求资源有一个新副本,它会直接使用这个副本来响应这个请求,而不必对端点发出请求。如果缓存数据不存在,就将请求传到目标上游服务。
|
|||
|
|
|||
|
![Image depicting how the API gateway cache functions.][15]
|
|||
|
|
|||
|
### API 错误处理
|
|||
|
|
|||
|
由于各种原因,API 服务可能会出错。在这种情况下,API 服务需要有一定的弹性,来应对可预见的错误。你也希望确保弹性机制能正常工作。弹性机制包括错误处理代码、断路器、健康检查、回退、冗余等等。新式的 API 网关支持各种常见错误处理功能,包括自动重试和超时设置。
|
|||
|
|
|||
|
![Image depicting some of the many mechanisms that the modern API Gatway can support.][16]
|
|||
|
|
|||
|
API 网关作为一个协调器,它会根据各方面情况来决定如何管理流量、将负载均衡发送到一个健康的节点,还能快速失败。当有异常状况,它也会向你发出警示。API 网关也保证路由和其他网络级组件能协同将请求传给 API 进程。它能帮助你在早期检测出问题,并修复问题。网关的错误注入机制(类似于 Apache APISIX 使用的那种)可用于测试应用程序或微服务 API 在各种错误发生时的弹性。
|
|||
|
|
|||
|
### API 版本管理
|
|||
|
|
|||
|
版本管理是指定义和运行多个并发的 API 版本的功能。这点也很重要,因为 API 是随着时间推移不断改进的。如果能对 API 的并发版本进行管理,那么 API 使用者就可以较快地切换到新的版本。这也意味着较老的版本可以被废弃并最终退役。API 也跟其他应用程序类似,无论是开发新功能还是进行错误修复,都存在演变的过程。
|
|||
|
|
|||
|
![Image of using the API Gateway to implement API versioning.][17]
|
|||
|
|
|||
|
你可以使用 API 网关来实现 API 版本管理。版本管理可以是请求头,查询参数或路径。
|
|||
|
|
|||
|
### APISIX 的网关
|
|||
|
|
|||
|
如果你需要令 API 服务可伸缩,就需要使用 API 网关。Apache APISIX 提供了必要的功能,可以实现健壮的入口,它的好处是显而易见的。它遵循 API 主导的架构,并且有可能改变客户端与托管服务交互的方式。
|
|||
|
|
|||
|
本文经作者许可,从 [Apache APISIX][18] 博客改编并转载。
|
|||
|
|
|||
|
*(题图:MJ/f1d05345-48f5-4e3e-9c65-a2ba9105614a)*
|
|||
|
|
|||
|
--------------------------------------------------------------------------------
|
|||
|
|
|||
|
via: https://opensource.com/article/23/1/api-gateway-apache-apisix
|
|||
|
|
|||
|
作者:[Bobur Umurzokov][a]
|
|||
|
选题:[lkxed][b]
|
|||
|
译者:[cool-summer-021](https://github.com/cool-summer-021)
|
|||
|
校对:[wxy](https://github.com/wxy)
|
|||
|
|
|||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
|||
|
|
|||
|
[a]: https://opensource.com/users/iambobur
|
|||
|
[b]: https://github.com/lkxed
|
|||
|
[1]: https://www.redhat.com/en/topics/api/what-are-application-programming-interfaces
|
|||
|
[2]: https://www.redhat.com/en/topics/microservices/what-are-microservices?intcmp=7013a000002qLH8AAM
|
|||
|
[3]: https://opensource.com/sites/default/files/2022-12/API.routing.traffic.png
|
|||
|
[4]: https://apisix.apache.org/docs/apisix/terminology/api-gateway/
|
|||
|
[5]: https://opensource.com/sites/default/files/2022-12/API%20gateway%20%20exposing%20a%20singlecustomer.png
|
|||
|
[6]: https://opensource.com/sites/default/files/2022-12/DNS-traffic%20management%20.png
|
|||
|
[7]: https://opensource.com/sites/default/files/2022-12/API-gateway.png
|
|||
|
[8]: https://opensource.com/sites/default/files/2022-12/Apigateway.centralized.png
|
|||
|
[9]: https://apisix.apache.org/docs/apisix/plugins/openid-connect/
|
|||
|
[10]: https://opensource.com/sites/default/files/2022-12/Apache.ASPISISplugins.png
|
|||
|
[11]: https://www.redhat.com/en/topics/api/what-is-a-rest-api?intcmp=7013a000002qLH8AAM
|
|||
|
[12]: https://opensource.com/sites/default/files/2022-12/APISIX.transfers.png
|
|||
|
[13]: https://apisix.apache.org/docs/apisix/plugins/grpc-transcode/
|
|||
|
[14]: https://apisix.apache.org/docs/apisix/plugins/prometheus/
|
|||
|
[15]: https://opensource.com/sites/default/files/2022-12/APIgatewaycache.png
|
|||
|
[16]: https://opensource.com/sites/default/files/2022-12/ModernAPIGatways.png
|
|||
|
[17]: https://opensource.com/sites/default/files/2022-12/API.gateway.version.png
|
|||
|
[18]: https://apisix.apache.org/blog/2022/10/27/ten-use-cases-api-gateway/
|
|||
|
[0]: https://img.linux.net.cn/data/attachment/album/202306/26/170002ty8ygsys4ikr6yys.jpg
|