今天我们来聊聊API集成,通过前两天的了解,我们了解到微服务是多服务,松耦合的服务集,既然涉及到了多服务,调用外部的API的必不可少的。
由于客户的多样性,设计应用程序的外部 API 变得更具有挑战性。这些客户端通常具有不同的数据要求。
1、直接沟通
这种方式以客户端直接调用服务的方式设计 API。由于以下缺点,微服务架构目前很少采用这种方法。
- 客户端必须通过细粒度的服务 API 发出多个请求来检索他们需要的数据,这不仅效率低下,而且可能导致比较差的用户体验。
- 由于客户端对每个服务及其 API 的了解导致缺乏封装,因此很难更改架构和 API。
- 客户可能觉得使用服务的 IPC 机制既不方便也不实用。
我们在研发的时候,不能把保持向后兼容性留给后端服务的开发人员。需要开发单独的公共 API,而不是直接向第三方公开服务。
这项艰难的工作就是由API 网关的架构组件完成的。
2、API 网关模式
直接访问服务有许多缺点。API 网关是一种更好服务访问模式。
基本上,API 网关也是一种服务,它充当外部应用程序的入口点。该组件负责请求路由、API 组合和其他横切关注点,例如身份验证、监控和速率限制。API 网关类似于 OOPS(设计模式) 中的外观设计模式。API 网关封装应用程序的内部架构并向其客户端提供 API。
API 网关还负责请求路由、API 组合和协议转换。来自外部客户端的 API 请求通过 API 网关,API网关将一些请求路由到相应的服务。API 网关还可以通过调用多个服务并聚合结果来处理其他请求。服务器还可以在客户端友好协议(例如 HTTP 和 WebSockets)与服务使用的客户端不友好协议之间进行转换。
3、请求路由
请求路由是 API 网关最重要的功能之一。API 网关通过将请求路由到适当的服务来实现 API 操作。API 网关在收到请求时查询路由映射以确定将请求路由到哪个服务。例如,路由映射可能会将 HTTP 方法和路径映射到服务的 HTTP URL。NGINX 等 Web 服务器提供反向代理作为此功能的一部分。
4、API 组成
API 网关通常不仅仅做反向代理。他们还可以使用 API 组合执行 API 操作。API 网关为客户端提供了一个粗粒度的 API,使他们能够通过一个请求来检索他们需要的数据。
聚合器/组合模式有两个子模式。
- 链式模式:基本上,这种类型的组合模式遵循链式结构。在这种模式下,客户端与服务通信,所有服务链接在一起,一个服务的输出成为下一个服务的输入。
- 分支模式:分支模式是聚合器和链模式的扩展版本。客户端可以直接与服务通信,在这种设计模式下,服务可以同时与多个服务通信。
5、协议转换
API 网关也可以转换协议。尽管应用程序服务在内部使用各种协议,包括 REST 和 gRPC,但它可能会向外部客户端提供 REST API。一些 API 操作在需要时在 RESTful 外部 API 和内部基于 gRPC 的 API 之间进行转换。
国外一些技术网站,把这项功能直接称为:Protocol Translation,直接翻译就是:协议翻译,我根据能力直接叫做:协议转换
6、前端模式的后端
API 网关可以提供一个通用的 API。单一 API 面临的一个问题是不同的客户端通常有不同的需求。这个问题的解决方案是让客户端可以选择在请求中指定服务器应该返回哪些字段和相关对象,就像使用 GraphQL 一样。对于必须为第三方应用程序提供服务的公共 API,这种方法就足够了,但它不能为客户提供更多可选的操作。
通过API网关为客户端提供个性化API是一个不错的选择,我也比较喜欢这个能力,从一定程度上减少了通讯数据的压力
7、实施横切关注点
API 网关主要处理 API 路由和组合,但它们也可能处理横切关注点。横切关注点的例子包括:
- 身份验证: 验证发出请求的客户端身份。
- 授权:验证客户端是否被授权执行该特定操作。
- 速率限制:限制每秒来自特定客户端或所有客户端的请求数。
- 缓存:缓存响应以减少对服务的请求数量。
- 指标收集:为计费分析目的收集 API 使用指标。
- 请求日志记录:记录请求。
注:横切关注点指的是一些具有横越多个模块的行为,使用传统的软件开发方法不能够达到有效的模块化的一类特殊关注点。比如典型的案例,日志功能
8、API 网关架构
API 网关具有分层的模块化架构。它由两层组成,API 层和公共层。一个或多个 API 模块构成 API 层。API 模块根据客户要求实现 API。
9、API 网关的好处
- 使用 API 网关的主要优点是它封装了应用程序的内部结构。
- API 网关为客户端提供客户端特定的 API,减少客户端和应用程序之间的往返次数
- 简化了客户端代码。
10、API网关的缺点
- 增加维护成本,也是一个可开发、部署和管理的高可用性组件。
- API 网关有可能成为开发瓶颈,因为开发人员必须不时更新 API 网关以公开他们的服务 API。
11、现成的 API 网关
有几种现成的服务和产品实现了 API 网关功能。
AWS API Gateway : AWS API Gateway API 是一组 REST 资源,每个资源都支持一个或多个 HTTP 方法。您可以配置 API 网关以将每个请求路由到后端服务。您需要在后端服务中实现 API 组合,AWS API Gateway**不支持 API 组合。
Kong : Kong基于 NGINX HTTP 服务器,它允许您根据 HTTP 方法、标头和路径定义灵活的路由规则,以决定使用哪个后端服务。
12、开发 API 网关
使用 Web 框架,您可以构建自己的 API 网关,将请求代理到其他服务。我们来看看Netflix Zuul和Spring Cloud Gateway。
Netflix Zuul : Zuul是一个 Netflix 框架,它实现了诸如路由、速率限制和身份验证等横切功能。Zuul 使用了过滤器的概念,过滤器是类似于 servlet 过滤器的可重用请求拦截器。Zuul 通过组装一系列过滤器来处理 HTTP 请求,这些过滤器会转换请求、调用后端服务并将响应发送到客户端之前对其进行转换。
Spring Cloud Gateway : Spring Cloud Gateway是一个 API 网关框架,基于 Spring Framework、Spring Boot 和 Spring Webflux,一个反应式 Web 框架。
Spring Cloud Gateway 提供了一种简单而全面的方式来完成以下任务:
- 将请求路由到后端服务。
- 实现执行 API 组合的请求处理程序。
- 处理横切关注点,例如身份验证。