百亿规模API网关服务Shepherd的设计与实现发表时间:2022-07-18 11:58 一、背景介绍1.1 API网关是什么?API网关是随着微服务(Microservice)概念兴起的一种架构模式。原本一个庞大的单体应用(All in one)业务系统被拆分成许多微服务(Microservice)系统进行独立的维护和部署,服务拆分带来的变化是API的规模成倍增长,API的管理难度也在日益增加,使用API网关发布和管理API逐渐成为一种趋势。一般来说,API网关是运行于外部请求与内部服务之间的一个流量入口,实现对外部请求的协议转换、鉴权、流控、参数校验、监控等通用功能。 1.2 为什么要做Shepherd API网关?在没有Shepherd API网关之前,美团业务研发人员如果要将内部服务输出为对外的HTTP API接口。通常要搭建一个/s21i.faimallusr.com/4/1/ABUIABAEGAAg47TTlgYosIPKhwEwsBQ4vAc.png" alt="图 1" style="box-sizing:border-box;border:0px;vertical-align:middle;display:block;margin:2rem auto 0.2rem;max-width:75%;cursor:pointer;"/> 图 1 1.3 使用Shepherd带来的收益是什么?从业务研发人员的角度来看,接入Shepherd API网关,能带来哪些收益呢?简而言之包括三个方面。
二、技术设计与实现2.1 整体架构我们先来看看Shepherd API网关的整体架构,如下图所示: 图 2 Shepherd API网关的控制面由Shepherd管理平台和Shepherd监控中心组成。管理平台主要完成API的全生命周期管理以及配置下发的工作,监控中心完成API请求监控数据的收集和业务告警功能。 Shepherd API网关的配置中心主要完成控制面与数据面的信息交互,通过美团统一配置服务Lion来实现。 Shepherd API网关的数据面也就是Shepherd 服务端。一次完整的API请求,可能是从移动应用、/s21i.faimallusr.com/4/1/ABUIABAEGAAg47TTlgYoruOGwQQwjwg42AQ.png" alt="图 4" style="box-sizing:border-box;border:0px;vertical-align:middle;display:block;margin:2rem auto 0.2rem;max-width:75%;cursor:pointer;"/> 图 4 API配置的详细说明:
2.1.3 数据面API路由 API网关的数据面在感知到API配置后,会在内存中建立请求路径与API配置的路由信息。通常HTTP请求路径上,会包含一些路径变量,考虑到性能问题,Shepherd没有采用正则匹配的方式,而是设计了两种数据结构来存储。如下图所示: 图 5 一种是不包含路径变量的直接映射的MAP结构。其中,Key就是完整的域名和路径信息,Value是具体的API配置。 另外一种是包含路径变量的前缀树数据结构。通过前缀匹配的方式,先进行叶子节点精确查找,并将查找节点入栈处理,如果匹配不上,则将栈顶节点出栈,再将同级的变量节点入栈,如果仍然找不到,则继续回溯,直到找到(或没找到)路径节点并退出。 功能组件 当请求流量命中API请求路径进入服务端,具体处理逻辑由DSL中配置的一系列功能组件完成。网关提供了丰富的功能组件集成,包括链路追踪、实时监控、访问日志、参数校验、鉴权、限流、熔断降级、灰度分流等,如下图所示: 图 6 协议转换&服务调用 API调用的最后一步,就是协议转换以及服务调用了。网关需要完成的工作包括:获取HTTP请求参数、Context本地参数,拼装后端服务参数,完成HTTP协议到后端服务的协议转换,调用后端服务获取响应结果并转换为HTTP响应结果。 图 7 上图以调用后端RPC服务为例,通过JsonPath表达式获取HTTP请求不同部位的参数值,替换RPC请求参数相应部位的Value,生成服务参数DSL,最后借助RPC泛化调用完成本次服务调用。 2.2 高可用设计Shepherd API网关作为接入层的基础组件,高可用性一直是业务研发人员非常关心的部分。接下来。我们就来探索一下Shepherd在高可用设计方面的实践。 2.2.1 排除性能隐患一个高可用的系统,预防故障的发生,首先要排除性能隐患,保证高性能。 Shepherd对API请求做了全异步化处理,请求通过Jetty IO线程异步提交到业务处理线程池,调用后端服务使用RPC或HTTP框架的异步方式,释放了由于网络等待引起的线程占用,使线程数不再成为网关的瓶颈。下图是使用Jetty容器时,服务端的请求线程处理逻辑: 图 8 我们通过域名压测网关单机的端到端QPS,发现QPS在超过2000时,会出现很多超时错误,而网关的服务端负载与性能却非常富余。调研发现,公司内其他的/s21i.faimallusr.com/4/1/ABUIABAEGAAg5LTTlgYo8L_IvwUw5BQ42AQ.png" alt="图 9" style="box-sizing:border-box;border:0px;vertical-align:middle;display:block;margin:2rem auto 0.2rem;max-width:75%;cursor:pointer;"/> 图 9 2.2.2 服务隔离集群隔离 借鉴公司缓存、任务调度等成熟组件的经验,Shepherd在设计之初,就考虑了按业务线维度进行集群隔离,也支持重要业务独立部署。如下图所示: 图 10 请求隔离 服务节点维度,Shepherd支持请求的快慢线程池隔离。快慢线程池隔离主要用于一些使用了同步阻塞组件的API,例如SSO鉴权、自定义鉴权等,可能导致长时间阻塞共享业务线程池。 快慢隔离的原理是统计API请求的处理时间,将请求处理耗时较长,超过容忍阈值的API请求隔离到慢线程池,避免影响其他正常API的调用。 除此之外,Shepherd也支持业务研发人员配置自定义线程池进行隔离。具体的线程隔离模型如下图所示: 图 11 2.2.3 稳定性保障Shepherd提供了一些常规的稳定性保障手段,来保证自身和后端服务的可用性。如下图所示: 图 12
2.2.4 请求安全请求安全是API网关非常重要的能力,Shepherd集成了丰富的安全相关的系统组件,包括有基础的请求签名、SSO单点登录、基于SSO鉴权的UAC/UPM访问控制、用户鉴权Passport、商家鉴权EPassport、商家权益鉴权、反爬等等。业务研发人员只需要简单配置,即可使用。 2.2.5 可灰度API网关作为请求入口,往往肩负着请求流量灰度验证的重任。 灰度场景 Shepherd在灰度能力上,支持灰度API自身逻辑,也支持灰度下游服务,也可以同时灰度API自身逻辑和下游服务。如下图所示: 图 13 灰度API自身逻辑时,通过将流量分流到不同的API版本实现灰度能力;灰度下游服务时,通过给流量打标,分流到指定的下游灰度单元中。 灰度策略 Shepherd支持丰富的灰度策略,可以按照比例数灰度,也可以按照特定条件灰度。 2.2.6 监控告警立体化监控 Shepherd提供360度的立体化监控,从业务指标、机器指标、JVM指标提供7x24小时的专业守护,如下表:
多维度告警 有了全面的监控体系,自然少不了配套的告警机制,主要的告警能力包括:
2.2.7 故障自愈Shepherd服务端接入了弹性伸缩模块,可根据CPU等指标进行快速扩容、缩容。除此之外,还支持快速摘除问题节点,以及更细粒度的问题组件摘除。 图 14 2.2.8 可迁移对于一些已经在对外提供API的/s21i.faimallusr.com/4/1/ABUIABAEGAAg5LTTlgYopITz_AYwjBM4xAc.png" alt="图 15" style="box-sizing:border-box;border:0px;vertical-align:middle;display:block;margin:2rem auto 0.2rem;max-width:75%;cursor:pointer;"/> 图 15 灰度中:在Shepherd管理平台开启灰度功能,灰度SDK将灰度流量转发到网关服务,进行验证。 图 16 灰度后:通过灰度流量验证Shepherd上的API配置符合预期后再迁移。 图 17 2.3 易用性设计Shepherd API网关的功能强大且复杂,易用性对业务研发人员来说至关重要,我们着重来看下自动生成DSL、API操作提效的解决方案。 2.3.1 自动生成DSL业务研发人员在实际使用网关管理平台时,我们尽量通过图形化的页面配置来减轻DSL的编写负担。但服务参数转换的DSL配置,仍然需要业务研发人员手工编写。一般来说,生成服务参数DSL的流程是:
整个过程非常繁琐,且容易出错。如果需要录入的API多达几十上百个,全部由业务研发人员手工录入的效率是非常低下的。 解决方案 那么能不能将服务参数DSL的生成过程给自动化呢? 答案是可以的,业务RD只需在网关录入API文档信息,然后录入服务的Appkey、服务名、方法名信息,Shepherd管理端会从最新发布的服务框架控制台获取到服务参数的JSON Schema信息,JSON Schema定义了服务参数的类型和结构信息,管理端可根据这些信息,自动生成服务参数的JSON Mock数据。结合API文档的信息,自动替换参数名相同的Value值。 这套DSL自动生成方案,使用过程中对业务透明、标准化,业务方只需升级最新版本服务框架即可使用,极大提升研发效率,目前受到业务研发人员的广泛好评。 图 18 2.3.2 API操作提效快速创建API API网关的核心能力是建立在API配置的基础上的,但提供强大功能的同时带来了较高的复杂性,不少业务研发人员吐槽API配置太繁琐,学习成本高。快速创建API的功能应运而生,业务研发人员只需要提供少量的信息就可以创建API。快速创建API的功能当前分为4种类型(后端RPC服务API、后端HTTP服务API、SSO CallBack API、Nest API),未来会根据业务应用场景的不同,提供更多的快速创建API类型。 批量操作 业务研发人员在API网关上,需要管理非常多的业务分组,每个业务分组,最多可以有200个API配置,多个API可能有很多相同的配置,如组件配置,错误码配置和跨域配置的。每个API对于相同的配置都要配置一遍,操作重复度很高。因此Shepherd支持批量操作多个API:勾选多个API后,通过【批量操作】功能可一次性完成多个API配置更新,降低业务重复配置的操作成本。 API导入导出 Shepherd提供在不同研发环境相互导入导出API的能力,业务研发人员在线下测试完成后,只需要使用API导入导出功能,即可将配置导出到线上生产环境,避免重复配置。 2.4 可扩展性设计一个设计良好的基础组件,除了能提供强大的基础能力,还需要有良好的扩展能力。 Shepherd的可扩展性主要体现在:支持自定义组件、服务编排的能力。 2.4.1 自定义组件Shepherd提供了丰富的系统组件完成鉴权、限流、监控能力,能够满足大部分的业务需求。但仍有一些特殊的业务需求,如自定义验签、自定义结果处理等。Shepherd通过提供加载自定义组件能力,支持业务完成一些自定义逻辑的扩展。 下图是自定义组件实现的一个实例。getName中填写自定义组件申请时的名称,invoke方法中实现自定义组件的业务逻辑,如继续执行、进行页面跳转、直接返回结果、抛出异常等。 图 19 目前Shepherd通过自定义组件已经成功支持了美团优选、外卖、餐饮、打车等重要业务,接入的自定义组件数量有200多个。 2.4.2 服务编排一般情况下,网关上配置的一个API对应后端一个RPC或者HTTP服务。如果调用端有聚合和编排后端服务的需求,那么有多少后端服务,就必须发起多少次HTTP的请求调用。由此就会带来一些问题,调用端的HTTP请求次数过多,效率低,在调用端聚合服务的逻辑过重。 服务编排的需求应运而生,服务编排是对既有服务进行编排调用,同时对获取的数据进行处理。主要应用在数据聚合场景:一次HTTP请求返回的数据需要调用多个或多次服务(RPC或HTTP)才能获取到完整的结果。 经过前期调研,公司已经有一套成熟的服务编排框架,由客服团队开发的海盗组件(参见 图 20 三、未来规划目前接入Shepherd API网关的API数量超过18000多个,线上运行的集群数量90多个,日均总调用次数在百亿以上。随着Shepherd API网关业务规模的不断增长,对我们的可用性、易用性、可扩展性必将提出更高的要求。未来一年,Shepherd的规划重点包括有云原生架构演进、静态网站托管、组件市场等。 3.1 云原生架构演进Shepherd API网关的云原生架构演进有三个目标:简化接入网关步骤,提升业务研发人员的研发效率;减小服务端War包大小,提升安全性和稳定性;接入Serverless弹性,降低成本,提高资源利用率。 为了实现这个三个目标,我们计划整体迁移网关服务到公司的Serverless服务Nest(参见 图 22 3.3 组件市场Shepherd API网关组件市场的目标是:合作共赢,形成开发生态,业务研发人员可将开发的自定义组件提供给其他有需要的业务研发团队使用。 我们希望让业务研发人员参与到自定义组件的开发,完善使用文档后设置为公共组件,开放给所有使用Shepherd的业务研发人员使用,避免重复造轮子。 【来源:快资讯】 免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:1953179025@qq.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
文章分类:
专栏文章
|