问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

高性能API网关设计与美团Shepherd架构解析

创作时间:
作者:
@小白创作中心

高性能API网关设计与美团Shepherd架构解析

引用
1
来源
1.
https://www.cnblogs.com/istitches/p/18148535

API网关作为微服务架构中的关键组件,负责处理所有非业务功能,如身份验证、缓存、流控等。本文将介绍高性能API网关的设计理念,并以美团Shepherd API网关为例,详细解析其架构设计和高可用性方案。

利用已有开源软件构建API网关

API网关是一个服务器,作为系统的唯一入口,封装了系统内部架构,为每个客户端提供定制的API。它还可能包含其他功能,如权限管理、缓存、请求分片与管理、静态响应处理等。所有客户端和消费端都要通过统一的网关接入微服务,并在网关层处理所有非业务功能。

理想的网关服务架构

相关开源API网关项目

  • Tyk:一个快速、可扩展的API管理平台,提供API网关、API分析、开发人员门户和API管理面板等功能,基于Go语言实现。
  • Kong:一个可扩展的API层,通过插件扩展提供额外功能和服务。
  • Orange:基于OpenResty的API网关,由国人开发。
  • Netflix Zuul:提供动态路由、监视、弹性、安全性等功能的边缘服务,基于JVM实现。
  • apiaxle:基于Node.js实现的API网关。
  • api-umbrella:基于Ruby实现的API网关。

美团Shepherd API网关服务

为什么需要API网关

在微服务架构中,单体应用被拆分为多个独立部署和维护的服务,导致API数量激增,管理难度加大。因此,需要在外部请求和内部服务之间搭建一个中间层,统一管理非业务功能,如协议转换、身份认证、鉴权、流控等。

Shepherd API网关架构

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

Shepherd网关的整体架构包括:

  • 控制面:管理平台和监控中心组成,管理平台主要完成API的全生命周期管理以及配置下发的工作;监控中心完成API请求监控以及数据收集和业务告警功能;
  • 配置中心:完成控制面与数据面的交互,由Lion统一实现;
  • 数据面:一个或多个Shepherd服务端组成。

一次完整的API请求流程如下:从移动应用、Web应用或内部系统发起请求,经过Nginx负载均衡后到达服务端。在服务端内部集成了一系列的基础功能组件和业务自定义组件,通过泛化请求调用后端RPC服务、HTTP服务、函数服务或服务编排服务,最后返回响应结果。

控制面

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

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

配置中心

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

配置信息说明:

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

数据面

API路由

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

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

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

协议转换/服务调用

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

高可用设计

性能优化

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

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

服务隔离

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

服务编排

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

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

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号