日均数十亿访问量!解读个推API网关高能演进

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
云原生 API 网关,700元额度,多规格可选
简介: 个推服务端技术专家李白以“API网关演进之路”为主题,分享了个推基于golang进行API网关建设的实践经验和深度思考。

近日,个推服务端技术专家李白受邀参与SegmentFault D-Day 线上技术直播活动,与来自头部互联网企业的后端技术专家们共探 “后端架构演进之路”。李白以“API网关演进之路”为主题,分享了个推基于golang进行API网关建设的实践经验和深度思考

 

以下为李白演讲干货整理:

 

API网关之源起

API网关是随“微服务”概念而兴起的一种架构模式。在微服务拆分过程中,原本庞大的单体应用和业务系统被拆分成许多微服务系统进行独立维护和部署,导致API规模成倍增长,API治理难度日益增加;同时,子系统通过API对外提供能力时,还会存在通用能力重复建设的问题。因此,使用API网关统一发布和管理API逐渐成为一种架构趋势。


API网关之源起.jpg

 

在个推,公司的消息推送、金融风控等业务核心系统均是基于微服务架构,部分系统也存在自建的网关模块。随着不同系统之间的依赖越来越多,高效进行接口治理的需求日益迫切。因此,个推很早就引入了统一的API网关,来解决权限控制、流控、服务降级、灰度发布、版本管理等一系列问题。

 

1、个推早期API网关

 

2015年,SpringCloud的诞生极大促进了微服务架构的发展和流行。个推也是在这一时期,依赖于SpringCloud gateway构建了自己真正意义上的API网关。

 

SpringCloud在生态上比较友好,有很多可以开箱即用的监控和容错组件,但因为不支持流量和安全治理,所以无法很好地满足后续公司进行API治理的需求;尤其是个推后来建设数据中台,更亟需一个统一的API网关来承担数据中台的入口流量。此外,在开发语言上,SpringCloud只支持Java,适用性有限;且存在性能不理想、运维难度大等不足。

 

因此,为了实现更强大的API治理能力、简化接入和运维方式,同时也为了更好地适应公司数据中台建设需求,个推选择自研API网关。

 

2、个推自研API网关

2.1 自研目标

个推建设API网关的几个关键目标:

1)要能够对API完整生命周期进行统一治理


API全生命周期.png


比如,在API设计上,要统一规范,规定API必须有归属服务和标签,做到API设计上的隔离;设计完成后要能够直接调试,自动生成测试代码;发布时,对API流量要做到精细化控制,支持服务的灰度发布;在API运行过程中,要能够对API调用情况进行全方位的监控和告警,对出现问题的服务能够及时地熔断隔离;下线后能够及时回收资源。

 

2)需要有完善的功能组件,来处理再一次请求过程

在整个请求链路中,我们设计实现了链路追踪、日志、鉴权、限流、熔断、插件等一系列核心功能。


链路.png

 

3)保证“三高”的同时,用户迁移和接入要简单

这一点其实是说API网关要便于运维和使用,同时要提供各种指标检测功能,且支持自动容错和弹性扩容

 

2.2 技术选型

基于以上的目标设计和技术调研之后,我们选择将golang作为自研API网关的主力开发语言。之所以选择golang,有以下几个原因:

 

1)个推在做多机房容灾建设和数据拆分迁移过程中,设计了gproxy-codis和gproxy-es,并已经搭建了一套proxy集群来路由不同的用户。这些proxy到目前为止运行良好,一些大的集群单机QPS超过6W。在这些项目的开发过程中,我们积累了不少的开发经验和基础组件,里面的很多轮子都是可以直接复用的。因此,我们使用golang并基于现有的这些组件,开发一套gproxy-http就相对省力得多。

 

2)golang语言本身天然支持高并发,开发速度快,最重要是节省机器成本

 

3golang作为云原生框架使用最多的语言,golang上的技术沉淀也是为个推云原生建设铺路

 

2.3 设计与实现

确认目标和技术选型之后,接下来就是一些具体的设计与实现。

1)整体架构

个推API网关的整体架构设计,如图所示:


架构设计.png


首先是一个Web管理平台,API的创建、发布和后续管理都可在管理平台上配置完成;配置完成后,会下发到配置中心通知到网关,同时网关也会定时拉取全量的API配置;然后是网关的一些核心组件,比如插件引擎,主要是执行配置的一些插件。转发引擎也是API网关的核心模块,个推的转发引擎支持http、grpc,同时还有个推自研的gcf协议,而在数据中台的业务场景下,也支持了kafka的数据推送能力。

 

2)插件服务

从图中可以看到,个推API网关整体架构里有一个独立的插件服务。这个设计的核心原因是golang是类C语言,打包后是可执行文件,而golang的原生插件是直接编译好的,不支持更新和卸载,所以也不能在界面上直接新增和更新插件。基于此原因,我们使用Java开发了一个插件服务,利用Java动态的语言特性,以灵活地支持插件的新增、更新和卸载。

 

网关通过grpc与插件服务通信,性能上有一定损耗。为了尽可能减少性能的损耗,我们把加密、特定的序列化相关插件都使用golang的一个原生插件去实现,一些业务自定义比较强的组件则推荐使用Java插件服务。

 

3)资源隔离

资源隔离是实现系统高可用的常用手段,在隔离设计上主要有集群和线程池的隔离。

 

API网关主要支持服务集群隔离,通过这种集群级别的隔离,在上层可以支持多租户,如果再彻底一点,在LB层面可以把网关集群也隔离出去。另外,服务的灰度发布也是通过网关这种集群隔离来实现的。具体过程是,在升级时,用户可以在界面上配置流量转发规则和集群,通过流量回放,将部分测试流量导入到灰度集群,或把线上真实流量按比例转发给灰度集群,确保没有问题后再全量发布。


资源隔离.png


线程的隔离主要体现在数据服务,主要功能是把数据API化,也就是在界面通过简单的配置就可以把MySQL、ES、Hbase的数据通过API提供出去,不用开发人员动手写CRUD或者客户端代码,非常方便。目前个推数据中台业务场景的大部分流量都是请求数据服务,因此我们设计了普通线程池、慢线程池和自定义配置的线程池等三类线程池。当请求时长超过慢阈值后,接口会被分配到慢线程池处理,避免慢请求拖垮整个服务。

 

4)服务编排

服务编排也是API网关需要满足的一个常见需求,主要是将多个API做聚合调用,大幅降低调用延迟。这部分功能之前是在网关上的,在网关层面支持的服务编排相对来说较为基础,能够支撑API的并发聚合调用,但难以处理复杂的业务组合,特别是涉及到事务的编排场景。因此,我们决定将这部分功能,抽取出去做独立服务,而后续的链路网关会直接访问服务编排模块,这样也保证了网关整体相对轻量。


服务编排.png

 

5)性能优化

针对API网关性能,我们也做了一系列压测和优化,比如,使用开源函数代替或重写内部大量使用的序列化、加解密等函数;大量使用Sync.Pool复用对象,对其内部逻辑进行纯异步处理;自研gnet,替换原生net框架,对网络模型进行优化等。从线上实际运行结果来看,目前个推数据中台中的API平台每天调用量超过10亿次,单机QPS峰值在2W左右,整体性能损耗在10%+,性能表现超过预期。

 

6)易用性设计

通过上述插件机制、隔离手段和性能上的极致优化,我们确保建设的API网关平台整体是高可用且易扩展的。而平台做好以后,还要方便用户接入使用和运维。


易用性设计.png


因此,为了提升易用性,我们采用纯Web的界面设计,并内置了多个API模板。用户通过简单的配置,就可以创建一个API,例如接口授权有效期、QPS、限额等权限配置,都能通过可视化界面操作完成;创建好API之后,用户还可以直接在界面上调试。

 

同时,在对外提供API的场景下,用户可以批量导出某个服务下的API文档,非常方便。个推API平台还实现了监控和统计的功能,比如提供API被调用的趋势、整个服务下API调用量和错误统计等数据,对运营和研发人员比较友好。

 

总结

综上,个推API网关基于golang自主研发,全Web化配置,实现了所有API接口的标准化、可视化;除解决网关基础需求外,也支持了插件热更新、多协议转换、数据推送、集群级别资源隔离等进阶需求。除了整合到系统微服务架构中,个推API网关同时也作为公司数据中台流量入口,日均承担数十亿级的访问量。目前个推API网关新版集群已经稳定运行一年以上,在保障系统稳定运转的同时还在持续进化。未来,我们还将围绕云原生探索更多的可能性,为业务提供稳定高效的基础平台。

目录
相关文章
|
API 开发工具 自然语言处理
API网关统一管理企业内部API
使用API网关统一管理公司内部API接口,提供统一通信协议,API文档和SDK,将大大提升公司内部部门间协作的效率。阿里云的API网关不但为单租户提供统一的API管理平台,还具备API的流量控制、多语言统一SDK、统一签名认证机制,流量预警,API文档自动生成(即将上线)等强大的能力支持。
5137 0
|
2月前
|
机器人 API Python
智能对话机器人(通义版)会话接口API使用Quick Start
本文主要演示了如何使用python脚本快速调用智能对话机器人API接口,在参数获取的部分给出了具体的获取位置截图,这部分容易出错,第一次使用务必仔细参考接入参数获取的位置。
121 1
|
12天前
|
安全 API 开发者
Web 开发新风尚!Python RESTful API 设计与实现,让你的接口更懂开发者心!
在当前的Web开发中,Python因能构建高效简洁的RESTful API而备受青睐,大大提升了开发效率和用户体验。本文将介绍RESTful API的基本原则及其在Python中的实现方法。以Flask为例,演示了如何通过不同的HTTP方法(如GET、POST、PUT、DELETE)来创建、读取、更新和删除用户信息。此示例还包括了基本的路由设置及操作,为开发者提供了清晰的API交互指南。
55 6
|
2月前
|
存储 JSON API
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
——在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦! 淘宝API接口(如淘宝开放平台提供的API)允许开发者获取淘宝商品的各种信息,包括商品详情。然而,需要注意的是,直接访问淘宝的商品数据API通常需要商家身份或开发者权限,并且需要遵循淘宝的API使用协议。
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
|
2月前
|
SQL 存储 数据处理
|
2月前
|
XML JSON API
RESTful API设计最佳实践:构建高效、可扩展的接口
【8月更文挑战第17天】RESTful API设计是一个涉及多方面因素的复杂过程。通过遵循上述最佳实践,开发者可以构建出更加高效、可扩展、易于维护的API。然而,值得注意的是,最佳实践并非一成不变,随着技术的发展和业务需求的变化,可能需要不断调整和优化API设计。因此,保持对新技术和最佳实践的关注,是成为一名优秀API设计师的关键。
|
2月前
|
监控 API 数据安全/隐私保护
​邮件API触发式接口分析?邮件API接口好评榜
邮件API在企业通信和营销中至关重要,通过自动化邮件发送流程提升效率与客户满意度。本文解析邮件API触发式接口,即基于特定事件(如用户注册、购买产品)自动发送邮件的技术,能显著加快企业响应速度并增强用户体验。推荐市场上的优秀邮件API产品,包括SendGrid、Mailgun、Amazon SES、Postmark及新兴的AOKSend,它们各具特色,如高发送率、详细分析工具、灵活配置、强大的日志功能及用户友好的API接口,帮助企业根据不同需求选择最合适的邮件API解决方案。
|
2月前
|
存储 算法 Oracle
19 Java8概述(Java8概述+lambda表达式+函数式接口+方法引用+Stream+新时间API)
19 Java8概述(Java8概述+lambda表达式+函数式接口+方法引用+Stream+新时间API)
60 8
|
1月前
|
测试技术 API 数据库
电商API接口定制与开发系列之——商品详情接口介绍
——在成长的路上,我们都是同行者。这篇关于API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦! 在电商API接口定制与开发系列中,商品详情接口是至关重要的一部分,它直接关系到用户浏览商品、获取商品信息的关键环节。以下是对商品详情接口的详细介绍:
|
2月前
|
存储 数据采集 API
提升店铺好评秘籍:淘宝商品评论接口与电商 API 接口的深度解析
该接口名为item_review,用于获取淘宝商品评论信息,支持HTTP GET或POST请求,体验API为c0b.cc/R4rbK2。主要请求参数包括商品ID(num_iid)、排序方式(sort)、页码(page)。响应参数涵盖评论内容(rate_content)、评论日期(rate_date)、评论图片(pics)、买家昵称(display_user_nick)、商品属性(auction_sku)
下一篇
无影云桌面