企业级 OpenAPI 网关该如何建设?
作者 | 李鹏飞 阿里云开放平台技术专家,负责阿里云OpenAPI网关建设,致力于为用户提供高可用的OpenAPI服务。
企业级API网关作为企业中流量的出入口,典型的特征就是承载了大量不同租户、不同业务的超高流量,对高并发、高性能、高稳定性、强隔离性、依赖熔断能力、安全性都有着非常高的要求。本文将从网关形态,技术选型入手,最后重点解读在安全防护、流量控制、稳定性方面的思路。
引言
随着互联网技术以及微服务、Service Mesh的发展,API在近几年变得越来越重要,大部分的企业都开放了API,绝大多数的技术能力也可以通过API快速获取,比如图像识别、语音识别、资源操作等。
要开放API,就会有一个API网关,互联网上每天数以亿次的API调用背后,除了有具体的API Service提供服务外,还有API 网关作为统一出入口来处理这些流量。
网关形态
API 网关一般分为:1.中心化,2.去中心化。
两类,主要区别如下
得益于开发模型更简单、更易维护、易接入、且有多种手段来保障稳定性,中心化的网关服务更为常见,被很多大型企业、API网关服务提供厂商所采用,我们本次将分享中心化网关的建设。
网关选型
要开放API,常见的解决方案有3种:
云上的API Gateway类云服务,比如API Gateway,提供了开箱即用的API 网关服务;
基于开源API网关二次开发,如Kong;
从零自建。
三种解决方案的对比如下:
核心能力
网络层安全防护;
应用层流量控制;
稳定性。
网络层安全防护
常用的防护手段有:
四层防护;
七层防护;
流量清洗。
四层、七层防护是两块涉及到攻防的专业领域,比如常见的有DDOS、基于IP的CC攻击等,这块需要有专门的技术投入建设的,如果没有资源投入的话,建议购买云上的高防服务来防护,要避免裸奔,没有任何防护的互联网应用是非常危险的,尤其针对于网关。
-
我们需要针对不同的出口IP配置流量阈值,避免某个客户端出口IP占用过多流量而影响整个Endpoint,如果可以识别出用户身份还可以基于用户身份配置流控阈值; -
如果为不同API服务提供了不同的Endpoint,我们还需要为每个Endpoint配置独立的流量阈值,避免单个Endpoint流量过大影响同集群的其他Endpoint; -
除此之外,网络层还需要对后端Real Server进行保护,需要为后端集群配置集群防护阈值,避免有超过集群容量的流量进入集群,这里建议配置为基于单个Server的流控阈值,这样当集群动态扩缩容的时候这个阈值会自动变更,而不是配置为绝对值。
使用二分法,将域名分成2份分别解析到2个LVS上;
判断攻击跟随到了哪个LVS上;
将跟随到的这个LVS继续使用二分法进行拆分,直到定位到攻击流量跟随的是哪个Endpoint。
将这个Endpoint拉到黑洞。
这个流量清洗方案通常可以自己开发完成,但是需要有一个用于清洗的LVS设备池子,至此在网络层的防护就比较全面了,包含了IP、用户、Endpoint、集群、流量清洗。
应用层流量控制
通过网络层防护对网关有了比较全面的防护,网关的处理能要比每个后端Service的处理能力要强,网关作为流量入口除了要保护好网关自身,还好保护好后端Service不受攻击,这个时候就要使用网关应用层流量控制了,在网关层需要支持为以下维度配置流控:
为每个Service租户配置流控阈值,确保每个后端服务收到的流量不会超过Service集群容量;
为每个API配置流控阈值,避免某个API占用了单个Service过多流量;
为每个用户配置Service、API粒度的流控阈值,避免单个用户占用过多流量;
为特殊用户配置特殊的流控配置,比如大用户等。
过去,被很多人问到了应用层要如何做流控,要做一套完善的流控机制,还是需要不少投入的,对技术也有比较高的要求,流控一般有两个相互牵制的因素:性能、准确性,当单次请求流控维度非常多时,性能问题就会凸显出来,尤其是还要保障精度的时候,常用的方案有:
精准流控,基于Redis等分布式缓存的计数器能力进行控制;
单机流控,纯单机流量控制;
单机+分布式两段流控;
集群内部流控。
稳定性
租户隔离:
首先网关需要基于异步的模型,或者使用协程,网关做为一个网络IO密集型应用,一定要避免被某个远程调用影响;
在租户层面可以考虑基于容器的隔离,为所有接入租户或者重要租户进行物理隔离;
对链接进行隔离,比如基于HTTP的连接池,要为每个host设置默认的最大连接数量;
基于线程池的隔离,实际在网关中应用较少,如果有适合的场景也可以考虑使用。
熔断降级:
网关的主要依赖就是后端Service,后端Service通常也是最不稳定的,比如高RT、大Request、大Response等。当某个后端服务、API指定异常数量超过一定数量后要自动降级,只放小流量到后端Service,通过小流量探测后端恢复正常后再恢复服务,避免单个Service、API的异常流量耗尽系统资源;
除了Service外就是数据源、分布式缓存、认证系统等,当这些依赖服务异常后网关要有逃生能力,通常可以通过多级逻辑+物理缓存解决,比如本地缓存、分布式缓存、磁盘文件兜底等方案,当依赖服务故障后对于存量的业务网关依然可以继续提供服务。
巡检、自动化回归测试:
容灾演练:
将容灾演练日常化,在大版本发布的时候要有容灾测试,确保新代码没有破坏系统的容灾能力。
除了上述内容以外,还要结合前面讲到的安全防护能力一起保障网关的稳定性。
往
期
导
读
4.