全文共3770 字,预计阅读时间: 10 分钟前端
写在前面nginx
API经济生态链已经在全球范围覆盖, 绝大多数企业都已经走在数字化转型的道路上,API成为企业链接业务的核心载体, 并产生巨大的盈利空间。快速增加的API规模以及调用量,使得企业IT在架构上、模式上面临着更多的挑战。关于如何承载现有快速发展的API生态链,本文接下来介绍API网关在其中扮演的角色。算法
API是什么编程
应用编程接口(Application Programming Interface,简称:API),就是软件系统不一样组成部分衔接的约定(维基百科)。举个简单的例子: 您每次登录微信, 须要提供帐号信息才能访问, 微信提供的这个认证载体就是一个API。 API已经无处不在,金融、IT、物联网等,发展趋势至关迅速, 无形之中贯穿着咱们的生活。后端
纵观这几年的发展,API在不断的技术迭代中造成了几股共同的趋势:api
01缓存
API开放数量不断增长安全
毋庸置疑, 随着企业的数据化进展,微服务改造,不一样领域的API层出不穷, 早在2014年ProgrammableWeb便预测API矢量可达到100,000到200,000, 并会不断增加。API开发数量的增长给边缘系统带来机会, 也随即演变了API网关的出现。大规模的API管理系统成为核心的发展趋势。微信
API发展趋势网络
02
API服务平台多样化
最初的API主要针对不一样单体应用的网络单元之间信息交互, 现已演变到服务间快速通信。随着人工智能EI, IOT的不断演进, 依赖API的平台不断更新, 如Web, Mobile, 终端等,将来将会出现更多的服务体系。
03
逐步替换原有企业的服务模式,
API即商品
卖计算, 卖软件, 卖能力, 最终的企业的销售模式会逐步转变,能力变现, 释放数据价值,依托不一样的API管理平台创造新的盈利。
API网关为什么诞生
随着API的总体趋势发展, 每一个历史时代都面临着不一样的挑战, 架构也随之变化, 能够参考一下:
API发展趋势
随着API的总体趋势发展, 每一个历史时代都面临着不一样的挑战, 架构也随之变化:从最原始的“传输协议通信” -> “简单的接口集成” -> “消息中间件” -> “标准REST”, 能够看到API的发展更趋向于简洁, 集成,规范化, 这也促使更多的系统边界组件不断涌现,在承载了万亿级的API经济的背景下, API网关应运而生。
Gartner 报告中提到: 若是没有合适的API管理工具, API经济不可能顺利开展。 同时提出了对于API管理系统的生命周期定义:
planning(规划), design(设计), implementation(实施), publication(发布),operation(运维), consumption(消费), maintenance(维护) and retirement of APIs(下架)(来源:Magic Quadrant for Full Life Cycle API Management,Gartner发表于2016-10-27)
API网关贯穿整个流程,并提供丰富的管理特性。
●高性能,可横向扩展
●高可靠,业务不中断
●插件化的API安全控制
●灵活的数据编排
●精细化流控
●API版本管理
●API数据分析
●高效插件化路由算法
●安全认证,防***
●API访问控制
●Swagger导入导出
……
API网关的核心设计实践
提供一个可参考的高性能API网关架构, 在设计API网关的时候把总体分为两个平面, API Consumer使用的称之为数据平面, API Provider使用的称之为管理平面, 可在必定程度上对业务请求跟管理请求进行有效隔离。
总体架构图
先谈一下数据平面
API网关最核心设计理念: 保证数据面的业务不中断。因为对接API网关的服务是多样的, 客户API跟应用的设计不可控, 你很难能要求每一个接入的服务以及客户端都具有容错能力, 特别是一些比较传统的业务。 这就要求网关尽可能保证能正常处理每一个请求, 且知足较高的SLA(Service-Level Agreement), 为此咱们选择了Nginx+openresty,主要考虑以下:
1.支持热重启
数据面的组件升级是一个高风险动做, 一旦出现异常就可能致使链接中断,系统异常, 除非你的前端LB(负载均衡)能具有快速排水的能力,固然即便如此,仍是可能致使正在处理的请求被强制中断。因此数据面的热重启很是关键。
2.支持订阅式动态路由
API路由变化相对频繁,及时性也要求比较高, 若是采用按期同步方案, 一次性同步几万条的数据会拖慢你的系统, 所以增长一个订阅式的路由服务中心很是关键, Openresty自研能够快速订阅ETCD中的路由数据并实时生效。并且只拿增量数据性能压力不会太大。
3.支持插件化管理
Nginx在插件方面提供了丰富的生态。不一样的API,不一样的用户所须要的处理流程不彻底一致, 若是每一个请求过来都按照相同流程处理,一定带来相关的冗余操做。 插件化管理能够在必定程度上提高性能,还能保障在升级过程当中能快速添加处理链。
4.高性能的转发能力
API网关通常工做在多后端API反向代理模式,不少自研的API网关在性能上容易出现瓶颈,所以nginx优异的性能和高效的流量吞吐是其核心竞争力。
5.无状态可横向扩展
API网关承载的是整个系统全部请求的集合,须要根据业务规模进行弹性伸缩,采用服务中心配合Nginx配置管理能够快速增删已有的集群,并同步到LVS,实现快速的横向扩展能力。
再说一下管理面
相对于数据面, 管理面的约束就没有那么明显了, 管理面考虑更多应该在于数据的存储跟展现能力。一开始就定义好API的规范相当重要, Swagger做为如今最为主流的API描述模式,拥有很是完整的生态,AWS的整个API网关模型就是参考Swagger来构建的。
核心架构实现
API网关的相关实现, 咱们今天就流控和路由遍历进行说明,其余相关的核心设计后续的文章中会陆续提供。
精细化秒级流控
分钟级以上的流控,相对来讲都比较好处理, 可是提高到秒级流控,对于系统的性能跟处理能力就是一个很大的挑战。网上的流控方案不少, 同步的,异步的各有优点, 可是都会遇到共同的问题: 性能与准确度。
如下是一种最为常见的流控方案(集群流控), 使用Redis共享存储记录全部的流控请求并实时访问, 该架构存在一个很明显的问题:当集群数量跟请求量很大的时候,Redis的集群性能会成为很大的瓶颈。
常见的共享存储的集群流控
咱们从新设计了一套API流控架构, 混合使用多种流控方案, 按照业务需求自动调整。这里咱们拆分为本地流控和集群流控。 对于流量敏感的应用,会要求流控精度越精确,计算及时性高,时间维度低(秒级), 采用本地流控。对于时间周期长, 访问频率较低的API咱们采用集群流控, 下降对共享存储的操做频率。
优化后的混合流控
注:上图展现具体流控架构,与API网关的集成请参考本章节开头的API网关架构全景。
本地流控
即单机流控,适用流量敏感型业务。 API按照Nginx集群节点计算Hash值,确保每一个API都能负载到其中一个集群节点上。 假设有A, B,C三台Nginx, 若是某个API计算的一致性hash值为A节点, 当请求发送到A节点时直接从这台节点转发,并记录一个流控值, 当请求发送到B/C节点的时候都会转发到A节点计算一个流控值再日后转发。 这样同一个API的流控请求就会所有记录到一台Nginx上。能够借助Nginx的单机流控能力。单机流控的算法也是插件化的,能够采用计数,漏桶等。
固然本地流控也会带来必定问题,当全部的API都负载到一个节点上,若是一个API的访问量特别大, 那就可能致使负载不太均匀。还有就是若是流控时间记录很长,好比12次/天, 计数时间周期太长了也不太适合本地流控。
集群流控
集群流控适用计数周期长, 流控精度要求不高的业务。跟本地流控相辅相成, 按照不一样的业务选择不一样的流控, 相关的流控处理流程跟上述的本地流控基本相同,可是会在本地会先缓存一段时间的流控数据再统一上报流控中心。
基于树形结构的路由遍历算法
API网关数据面的主要流程包含路由匹配算法, 路由的全部数据都会缓存在ETCD中,为提高数据面性能, 存储的结构相当重要。在存储过程当中咱们分为两部分: 域名树, URI树
树形匹配模式
从第一个树形结构中咱们能够遍历到有如下几个域名: www.apig.com, test.com, .apig.com, .com。 域名存储从最后一个“.”开始遍历。 举例:
匹配: www.test.com , 先匹配com, 匹配成功继续遍历test, 匹配成功遍历www, 无www匹配失败。
匹配: test.apig.com, 先匹配com, 匹配成功继续遍历apig, 匹配成功遍历test, 无test, 遍历号, 匹配目标: .apig.com
URL的匹配为前序匹配跟域名的匹配模式相反,可是遍历算法一致。
总结
业界主流的开源API网关架构不少, Kong,,Tyk, Zuul等,开源软件都有一个共同的特色: 量级,安全,运维分析相对匮乏, 并且真正要知足生产环境需求,还须要投入较高的研发成本。术业有专攻,找一个完善的API管理解决方案对于企业能力变现很是重要。
华为云API网关服务提供完整的API生命周期管理解决方案, 支持多种使用场景, 提供便捷的管理服务。让API的上线,发布,管理到最后售卖的流程再也不复杂,快速完成企业能力变现。 欢迎点击“阅读原文”体验: 华为云-API 网关