背景介绍和理解
在微服务概念的流行之前,API GW 的实体就已经诞生了,这时的主要应用场景是OpenAPI,也就是开放平台,面向的是企业外部合作伙伴,对于这个应用场景,相信接触的人会比较多。当在微服务概念流行起来之后,API网关似乎成了在上层应用层集成的标配组件
API网关的定位
介于外部用户与内部系统之间的,作为一个入口,实现对外部请求的协议转换、流量控制、接口监控、鉴权等功能
面向Web App这类场景
在物理形态上类似前后端分离,此时的Web App已经不是全功能的Web App,而是根据场景定制、场景化的App。
面向Mobile App这类场景
移动App是后端Service的使用者,此时的API GW还需要承担一部分MDM(此处是指移动设备管理,不是主数据管理)的职能。 面向Partner OpenAPI这类场景,主要为了满足业务形态对外开放,与企业外部合作伙伴建立生态圈,此时的 API GW 需要增加配额、流控、令牌等一系列安全管控功能。
面向Partner ExternalAPI这类场景
面向Partner ExternalAPI这类场景,业界提的比较少,很多时候系统的建设,都是为了满足企业自身业务的需要,实现对企业自 业务的映射。当互联网形态逐渐影响传统企业时,很多系统都会为了导入流量或者内容,依赖外部合作伙伴的能力,一些典型的例子就 使用「合作方账号登录」、「使用第三方支付平台支付」等等,这些对于企业内部来说,都是一些外部能力。此时的 API GW 就需要 边界上,为企业内部 Service 统一调用外部的 API 做统一的认证、(多租户形式的)授权、以及访问控制。
面向IoT SmartDevice这类场景
面向IoT SmartDevice这类场景,业界就提的更少了,但在传统企业,尤其是工业企业,传感器、物理设备从工业控制协议向 IP 换,导致具备信息处理能力的「智能产品」在被客户激活使用直至报废过程中,信息的传输不能再基于 VPN 或者企业内部专线,导致理链路上会存在一部分公网链路。此时的 API GW 所需要满足的,就是不是前三种单向的由外而内的数据流,也不是第四种由内而外数据流,「内外兼修」的双向数据流,对于企业的系统来说终端设备很多情况下都不是直连网关,而是进过一个「客户侧」的集中网关和企业的接入网关进行通信。
API网关在微服务架构中的作用
除了保证数据的交换之外,还需要实现对接入客户端的身份认证、防报文重放与防数据篡改、功能调用的业务鉴权、响应数据的脱敏、流量与并发控制,甚至基于 API 调用的计量或者计费。
API网关需要包含哪些要素
API GW本身
- NIO 接入,异步接出
- 流控与屏蔽
- 秘钥交换
- 客户端认证与报文加解密
- 业务路由框架
- 报文转换
- HTTP DNS/ Direct IP
API GW客户端SDK/Library
- 基本通信
- 秘钥交换与 Cache
- 身份认证与报文加解密
配套的在线自助服务平台
- 代码生成
- 文档生成
- 沙盒调测
API网关的落地
后端API粒度
能和原子业务能力找到映射最好,一定要避免「万能接口」的出现。
业务路由的实现和含报文转换的 API 不停机发布
尽可能的在报文头里面存放业务路由所需要的信息,避免对报文体进行解析。
API GW 上线后,面临的很大问题都是后端服务如何自助发布到外部,同时不能重启网关服务,以保障业务的连续。在此过程中,如果涉及到报文格式的转换,那对 API 网关实现的技术要求比较高。如果让网关完成报文转换,第一种方案,网关需要知道报文的具体格式(也就是报文的元数据,或者是类定义),这部分要支持热更新。第二种方案,需要客户端在报文内另外附加元数据,网关通过运行期加载元数据对报文进行解析在进行报文的转换,这种方案性能不会很好。第三种方案,就是在运行期首次报文转换的时候,根据元数据生成报文转换代码并加载,这种方案对技术实现要求比较高,对网关外围平台支撑力度要求也不低。
客户端的秘钥管理
很多人都会把安全问题简单的用加密算法来解决,这是一个严重的误区,很多时候都存在对秘钥进行系统性管理的短板。打个比方,加密算法就好比家里的保险箱,而秘钥是保险箱的钥匙,而缺乏秘钥管理的安全方案,就好比把钥匙放在自家的客厅茶几上。更何况,安全方案里加解密也只是其中的一部分。
具备的功能
面向运行期
- 对客户端实现身份认证
- 通信会话的秘钥协商,报文的加密与解密
- 日常流控与应急屏蔽
- 内部响应报文的场景化裁剪
- 支持「前正后反模型」的集成框架
- 报文格式的转换
- 业务路由的支撑
- 客户端优先的超时机制
- 全局流水号的生成与应用
- 面向客户端支持 HTTP DNS / Direct IP
面向开发期
- 自助的沙盒测试环境
- 面向客户端友好的 SDK / Library 以及示例
- 能够根据后端代码直接生成客户端业务代码框架
- 完善的报文描述能力(元数据),支撑配置型的报文裁剪
面向运维与运营
- 支持面向接入方的独立部署与快速水平扩展
- 面向业务场景或合作伙伴的自助 API 开通
- 对外接口性能与线上环境故障定位自助平台