设计应用程序外部API的任务因其客户端的多样性而变得更具有挑战性,不同客户端通常需要不同的数据,拥有单一、适合所有客户端的API通常没有意义。
使用服务API的客户端一共有四种
Web应用程序在防火墙内部,可以通过高带宽、低延迟的局域网访问服务,其他客户端在防火墙之外,通过较低的带宽、较高的网络延迟或者移动网络访问服务。
API的一种设计思路是让客户端直接调用服务,但存在以下弊端,很少用于微服务:
API Gateway模式
API Gateway模式:实现一个服务,该服务是外部API客户端进入基于微服务应用程序的入口点
API网关同时负责请求路由、API组合以及协议转换。所有外部客户端的请求都先到达API网关,网关再把部分请求路由给不同的服务。另一部分请求,由API网关使用API组合模式处理,网关分别请求多个服务,并把结果组合起来。同时可能把对客户端友好得协议,比如HTTP和WebSocket转换成客户端不友好的协议。
请求路由
当接收到请求时,API网关将查询路由映射,该路由映射指定将请求路由到哪个服务。例如,路由映射可以将HTTP方法和路径映射到服务的HTTP URL。此功能与NGINX等web服务器提供的反向代理功能相同。
API 组合
比如外卖应用的API网关,可能会实现Get Order Details API 操作。如下图所示,移动应用向API 网关发送一个请求,然后网关向各个服务获取订单的详情。
协议转换
网关向外部客户端提供RESTFul接口,而内服务可能是多种协议混用,比如REST或gRPC。
为每一个客户端提供专用的API
因为不同的客户端对同一对象需要查询的数据不同,所以最好网关对不同类型的客户端提供不同的接口。
实现边缘功能
API Gateway架构
API网关是一种分层、模块化的架构。
这里展示了两层,API层和通用层。API层由一个或多个独立的API模块构成。每个API模块为一种客户端实现一个API。通用层实现通用功能,包括边缘功能,比如认证。
集中式:API Gateway由独立团队开发和维护
所有者模式:API Gateway为每个客户端提供专用API(适合规模较大网关服务)
后端前置模式:为每种类型的客户端实现单独的API Gateway
AG三种模式对比
集中式 | 所有者模式 | 后端前置模式 | |
隔离性 | 低 | 中 | 高 |
可观测性 | 低 | 中 | 高 |
可扩展性 | 低 | 中(内部模块化) | 高(服务化) |
可部署性 | 低(团队协调) | 中(应实现自动化部署,不然需等AG团队发版) | 高(独立部署) |
松耦合 | 耦合大 | 团队自治,业务和团队绑定 | 谁构建谁拥有 |
使用AG前后对比
无API Gateway | 使用API Gateway | |
封装性 | 低(客户端可知后端服务结构) | 高(内部服务结构客户端无法得知) |
调用次数 | 多 | 少 |
边缘功能扩展 | 复杂、冗余大 | 统一实现(鉴权、身份验证、限流、埋点、负载均衡等) |
性能瓶颈 | 各个微服务本身 | API Gateway成为瓶颈,必须保证高可用 |
性能和可扩展性
需要使用异步IO模型提高并发,Java提供了很多NIO框架(netty、Spring Reactor、Vertx、JBoss Undertow、NodeJS)
使用响应式编程编写可维护代码
AG服务中使用响应式方法,并发调用其他服务,以提高AG的响应速度。如一个请求在AG里组合调用了其他四个服务,且为顺序调用,那么应该实现四个调用并发执行,在得到所有执行结果再进行组合最终结果返回。
使用传统的异步回调方法编写API组合代码很快会导致“回调地狱”,更好的方法是使用响应式方法:
处理局部故障
可观测性
AG服务的运行状态等数据监控
使用现成的API Gateway产品或者服务
其中,定制化产品Kong(基于Nginx),实现了身份验证、鉴权、可埋点、路由规则动态配置、负载均衡,需要独立运维和配置。Traefik(Golang编写),类似Kong并支持服务注册发现(基于K8S)。APISIX,支持动态负载平衡、身份验证、限流限速,国产云原生、高性能、可扩展的微服务 API 网关,定制插件开发。
其实如果只需要路由和负载均衡,nginx就够了,如果还需要认证鉴权可以使用Kong。
开发自己的API Gateway
并不难,但需要解决两个关键问题
因此,开发API Gateway更好的起点是使用满足上述目的的框架,可以显著减少代码量。
云产品服务 | 已有成熟产品 | 自主开发 | |
灵活性 | 低 | 中(不同产品有差异) | 高,可定制化(动态路由、指标收集、缓存、限流) |
开发难度 | 低 | 中(配置即用) | 高 |
维护难度 | 低 | 高 | 高 |
并发性 | 高 | 高 | 中(NIO模型较好) |
高可用 | 高 | 高 | 中(维护集群,且API Gateway是瓶颈点) |
部署性 | 低 | 高(独立安装部署) | 高(独立开发部署) |
使用GraphQL实现API Gateway
GraphQL是一种基于图像的API框架,其旨在支持高效的数据提取。
好处
GraphQL API以模式(Schema)为中心,模式由一组类型组成,这些类型定义了服务器端数据模型的结构,以及客户端可以执行的操作(如查询)。
关键部分
留言与评论(共有 0 条评论) “” |