高性能API网关(1)、微服务API网关架构设计

利用已有开源软件聚合成 API 网关思路介绍

https://www.cnblogs.com/savorboard/p/api-gateway.html

API 网关是一个服务器,是系统的唯一入口。它封装了系统内部架构,为每个客户端提供一个定制的 API,同时它可能还有其它权限(身份验证、缓存、请求分片与管理、静态响应处理)。所有客户端和消费端都要通过统一的网关接入微服务,并且在网关层处理所有非业务功能,网关也提供 REST/HTTP的访问 API。

  • 理想的网关服务——单节点网关:
    img

  • 理想的网关服务——单客户端单节点网关服务:
    img

相关开源 API 网关项目:


美团 Shepherd API网关服务

为什么要做 API网关

现多为微服务架构,这就设计到对原始单体应用的内部服务拆分细化,然后进行独立的部署和维护,这个过程带来的是 API 规模的成倍增长,API 管理难度也日益增加。所以我们需要一个外部请求和内部服务中搭建一个中间层,由中间层来统一维护并实现一些非业务功能(比如说协议转换、身份认证、鉴权、流控、参数校验、监控等通用功能)。

Shepherd API 网关架构

img

主要优化点在于对非业务功能的统一管理,并且支持自主配置,提升开发效率。

img

Shepherd 网关的整体架构包括:

  • 控制面:管理平台和监控中心组成,管理平台主要完成 API 的全生命周期管理以及配置下发的工作;监控中心完成 API 请求监控以及数据收集和业务告警功能;
  • 配置中心:完成控制面与数据面的交互,由 Lion 统一实现;
  • 数据面:一个或多个 Shepherd 服务端组成。一次完成的 API 请求,可能是从移动应用、Web应用、或者是内部系统发起的,在经过 Nginx 负载均衡后请求到达服务端。在服务端内部集成了一系列的基础功能组件和业务自定义组件,通过泛化请求调用后端 RPC 服务、HTTP 服务、函数服务或者服务编排服务,最后返回响应结果。

控制面

在控制面内部,研发人员可以轻松完成 API 的全部生命周期的管理。

img

  • 创建 API,完成参数录入、DSL 脚本生成;
  • 通过文档或者 MOCK 功能提供对 API 的测试;
  • 测试完成后,为保证服务上线的稳定性,提供发布审批、灰度上线、版本回滚等一系列措施;
  • API运行期间,监控 API 的调用情况并记录请求日志,一旦发现异常及时发出告警;
  • 对于不再使用的 API 下线后,回收 API 所占用的各类资源并等待重新启用。

配置中心

使用自定义的 DSL 来描述 API 配置信息,用于向 API 网关的数据面下发 API 路由、规则、组件等配置变更。

img

配置信息说明:

  • Name、Group:名字、所属分组。
  • Request:请求的域名、路径、参数等信息。
  • Response:响应的结果组装、异常处理、Header、Cookies信息。
  • Filters、FilterConfigs:API使用到的功能组件和配置信息。
  • Invokers:后端服务(RPC/HTTP/Function)的请求规则和编排信息。

数据面

API 路由

API 网关的数据面在感知到 API 配置后,会在内存中建立请求路径与 API 配置的路由信息。通常在 HTTP 请求路径上会包含一些路径变量,考虑到性能问题,Shepherd 没有采用正则匹配的方式,而是设计了两种数据结构来存储。

img

  • 不包含路径变量的请求,直接映射到 MAP 结构。其中 Key 就是完整的域名和路径信息,Value 是具体的 API 配置。
  • 另一种是包含路径变量的前缀树数据结构。因此通过前缀匹配的方式,进行叶子节点的精确查找(类似于 Gin 的路由匹配)。

功能组件

当请求流量命中API请求路径进入服务端,具体处理逻辑由DSL中配置的一系列功能组件完成。网关提供了丰富的功能组件集成,包括链路追踪、实时监控、访问日志、参数校验、鉴权、限流、熔断降级、灰度分流等,如下图所示:

img

协议转换/服务调用

API调用的最后一步,就是协议转换以及服务调用了。网关需要完成的工作包括:获取HTTP请求参数、Context本地参数,拼装后端服务参数,完成HTTP协议到后端服务的协议转换,调用后端服务获取响应结果并转换为HTTP响应结果。

img

高可用设计

性能隐患排除,保证高性能

img

对于外部请求,利用 Jetty IO 线程异步提交到业务处理线程池,处理线程调用后端服务使用 RPC/HTTP 框架的异步方式,释放了由于网络等待引起的线程占用。

img

后续改用 netty,性能进一步提升,QPS 达到 15000 以上。

服务隔离

  • 集群隔离:Shepherd 起初就按照业务线维度进行集群隔离。

img

  • 请求隔离:Shepherd 支持快慢线程池隔离。快慢线程池隔离主要用于一些使用了同步阻塞的 API,比如 SSO鉴权、自定义鉴权,可能导致长时间阻塞业务线程池。快慢隔离的原理是统计 API 请求的处理时间,将请求耗时长、超过容忍度阈值的 API 请求隔离到慢线程池,避免影响其它 API 的调用;

img

服务编排

服务编排的需求应运而生,服务编排是对既有服务进行编排调用,同时对获取的数据进行处理。主要应用在数据聚合场景:一次HTTP请求返回的数据需要调用多个或多次服务(RPC或HTTP)才能获取到完整的结果。

img

采用海盗中间件设计服务编排方法。

posted @ 2024-04-21 01:56  Stitches  阅读(9)  评论(0编辑  收藏  举报