
4.1 Serverless接入层:API网关
本节主要介绍API网关的基本概念及网关和FaaS联动的应用场景。API网关作为接入层服务,是Serverless架构重要的组成部分,通过了解网关和FaaS函数的结合方式,可以更好地了解并构建Serverless应用架构。
4.1.1 基本概念
当前的软件服务都由大量API组成,因此如何更好地管理服务对内对外的API,成为许多企业面临的问题。API网关主要实现了API托管的能力,能够对API提供完整的生命周期管理,如API的创建、维护、发布、测试、下线等。此外,网关通过集成认证鉴权、流量控制、黑白名单、监控告警等能力,可以作为通用接入层,对外部的多个终端(Web/H5/iOS/Android/IoT等)提供服务。业界比较知名的商业化产品有谷歌Apigee、AWS API Gateway、腾讯云API Gateway等,开源的API网关产品有Kong、Apache基金会顶级项目APISIX等,如图4-1所示。

图4-1 API管理平台主流产品
许多读者对于传统架构下以Nginx为代表的负载均衡(Load Balance,LB)的转发方式更为熟悉,相对于负载均衡,API网关提供了更加抽象的管理能力,并支持一些高级配置。分析和对比业界较为成熟的API网关产品,可以看出它们主要覆盖以下几个方面的能力。
- API管理和配置:如API分组、增删改查等管理能力;基础配置如协议支持、CORS跨域、自定义域名等配置,降低了用户的配置成本。
- API认证能力:如密钥支持鉴权、SAML、JWT、OAuth2等认证方式。
- 多后端支持:除了支持FaaS的对接之外,后端支持主机、容器、微服务架构的接入和转发,且相对于传统的网关服务而言更加灵活可控。
- 版本和环境管理:支持针对API在开发、测试、发布等不同环境的发布,支持API的版本管理和切换,并提供灰度发布、回滚等功能。
- 高级配置:针对IP进行访问控制,针对API进行流量控制、熔断、缓存配置等。
- 导入和导出:支持导入和导出OpenAPI/Swagger等标准规范,支持生成API文档和SDK等。
- 灵活的排障能力:支持多种监控指标和时间维度,帮助用户知悉业务运行情况;日志支持类似ELK平台的运算符检索能力,便于快速定位问题。
- 安全可靠:自带高防IP,抵抗DDoS攻击;具备被攻击后自动更换IP的能力,最大限度避免业务损失。
由上述特性可以看出,API网关可以让用户专注于核心业务的开发,无须为接入层投入过多精力,与Serverless的核心理念非常契合。
4.1.2 网关和FaaS的联动
FaaS平台主要基于事件模型,因此网关和FaaS平台的联动也是通过事件触发的,并通过特定的event格式进行传输。配置网关的后端为FaaS函数,就能实现API接收客户端请求后触发FaaS函数,并将处理结果作为API响应返回给客户端,流程如图4-2所示。

图4-2 API网关和FaaS请求流程
需要注意的是,上述流程是API网关开启了集成响应配置后的结果,此时网关会解析FaaS函数的返回内容,并根据解析内容构造HTTP响应。可以通过代码自主控制响应的状态码、响应头header、响应体body等内容,进而实现自定义格式的响应,例如响应XML、HTML、JSON,甚至JavaScript等格式。因此设置集成响应时,也需要返回特定的数据结构给网关。HTTP是目前最主流的传输方式,集成响应主要是为了支持HTTP场景而提供的配置。
在Web框架支持的场景下,由于涉及路由,对于HTTP的适配和改造会更为复杂,例如Node.js的Express.js框架、Python的Django框架等。在这种场景下,需要一个中间层或适配层对API网关和FaaS函数的事件触发进行改造,即将JSON结构体改造成标准的HTTP请求,并将HTTP响应转换为API网关标准数据结构并返回。在第10章会介绍一个Web服务部署的案例实践,下面对于FaaS平台的一些限制和常用配置进行说明。
1. 上传文件的处理
在传统架构中,上传文件可以直接通过POST表单加上文件类型的标签multipart/form-data的形式实现,但在Serverless架构中,由于使用了API网关和函数,涉及客户端上传文件到FaaS服务时,一般要用下面两种方式进行处理。
第一种是客户端将上传的文件转换为Base64编码,API网关再将Base64编码作为文本传递给云函数,由云函数进行解码。
第二种是客户端将文件上传到对象存储COS的存储桶中,再由API网关将上传文件的对象地址传递给云函数,云函数通过对象地址从COS中拉取文件。
可以看出,当前的两种处理方式都涉及对服务端和客户端的改造,并不友好,因此各云服务商也提供了直接通过网关进行请求的Base64编解码配置,带给用户接近原生的上传文件体验。关于Serverless架构下的文件上传方案和效果对比,在4.2.4节中也有专门的说明和示例代码,供读者参考。
2. 请求/响应大小限制
通常情况下,FaaS平台对同步请求和响应事件大小的限制为6MB ,因此涉及大于6MB的请求时,需要进行切分和优化。结合上述上传文件的限制,网关向云函数中传入文件时,若文件在Base64编码后小于6MB,则将编码后的内容传入FaaS;若文件在Base64编码后大于或等于6MB,建议将文件上传至对象存储,并将对象地址传递给FaaS函数,从而完成大文件的上传。
3. 集成响应
鉴于网关和函数的交互方式,对于有HTTP需求的场景,FaaS平台提供了集成响应的配置,即网关会解析云函数返回的内容,并根据解析内容构造HTTP响应。开启集成响应后,函数需要按照特定的数据结构返回才能被成功解析。如未开启集成响应,则网关会将函数的返回内容直接传递给API请求方,一般为JSON格式。集成响应返回的数据结构如代码清单4-1所示。
代码清单4-1 集成响应返回的数据结构
{ "isBase64Encoded": false, "statusCode": 200, "headers": {"Content-Type":"text/html"}, "body": "<html><body><h1>Heading</h1><p>Paragraph.</p></body></html>" }
4. CORS跨域访问
CORS即跨域资源共享(Cross-origin resource sharing),开启CORS后,允许浏览器向跨源服务器发出XMLHttpRequest请求,因此涉及跨域请求的页面需要在API网关开启该配置。
此外,API网关也能联合FaaS服务提供WebSocket协议的支持,详细实现可以参考第14章WebSocket外卖点单系统的案例,这里就不再赘述了。