工作中写了很多RESTful API,也用了Axway作为API Gateway,这篇文章希望总结一下API Gateway的知识点。
API gateway
什么是API gateway?API gateway解决哪些问题?
在微服务架构中,每个客户端需要调用一个或者多个API,那么客户端如何知道要调用的后端接口是什么?当引入新的API接口或者现有API接口被更新时,如何把信息同步给客户端?以及API如何处理安全,日志,限速等所有API都需要考虑的问题?
API gateway是位于客户端和API之间的一个单点入口,它作为反向代理将客户端请求路由到后面的一组API。同时,API gateway可以承担cross-cutting交叉功能,如安全与认证,请求速率管理,日志,缓存等。如果没有API gateway,客户端就会直接把请求发给API,此时可能会有下列问题:
1)客户端调用代码复杂,客户端需要和多个API交互,并且处理来自不同API的不同错误。
2)客户端与API之间的耦合度高,客户端需要知道各个API的调用细节,当API的接口发生变化,客户端也需要进行更改。
3)客户端的一次操作可能需要调用多个API接口,此时会产生多次网络调用并增加延迟。
4)每个面向公共网络调用的API都需要实现安全,请求速率管理等功能,都需要经过安全测试。
5)API必须使用对调用端友好对通信协议,如http或者websocket。
API gateway归纳为三种模式
1)路由:API gateway作为反向代理将客户端的请求路由到API,API gateway作为单点入口对客户端和API进行解耦。
2)聚合:当客户端的某个操作需要调用多个API时,API gateway可以把多个API请求聚合为一个请求,即客户端发送一个请求至API gateway,API gateway分发多个请求到各个API,并且将各个API返回到应答聚合成一个应答返回给客户端,从而达到降低请求交互次数的作用。
3)卸载:API gateway可以卸载 API的功能,尤其是一些crossing cutting交叉功能。因此我们可以在API gateway单点实现功能,而不是在各个API上重复实现,尤其是一些专业性要求高的,如安全的实现,而API则可以专注于业务逻辑。
综上,我们对API gateway有了基本对认识,接下来介绍两种API gateway产品:AWS API gateway,Kong API gateway
AWS API gateway
AWS API gateway Overview
如图所示,AWS API gateway支持客户端包括:移动端应用,网页应用和web服务,支持的后端调用包括:部署在amazon EC2上的服务,使用AWS lambda实现的serverless服务,以及其他部署可以通过公共网络访问的接口。AWS API gateway依托于AWS平台及其丰富的组件,比如基于amazon CloudWatch提供监控相关功能,基于AWS Lambda提供Serverless功能,基于AWS CloudTrail提供审计功能等等。
另外,AWS API gateway还可以提供MOCK集成,即配置静态应答。这样,只需要确定后端服务的接口定义,即使后端服务没有开发完成,也可以通过配置API gateway的Mock应答,使得客户端的开发和测试可以顺利进行,从而解耦了客户端和API的开发测试过程。
AWS API gateway提供的主要功能
1. Security and Authorization
1)AWS API gateway可以保护后端API免受DDoS攻击。
2)通过AWS Cloudtrail记录审计日志并持续监控服务调用情况。
3)通过AWS IAM,AWS COGNITO,AWS SIGNATURE V4等组件提供安全支持,此外也支持通过AWS Lambda实现可定制的授权访问。
4)通过配置trusted relationship,以白名单方式进行访问控制。
5)支持客户端调用代码的自动生成,包括认证授权的相关代码。
2. Monitoring, Metrics and Logging
AWS API gateway通过AWS cloudwatch对API的调用情况,性能指标和错误率进行监控,并提供控制面板如下图所示。我们可以通过AWS控制面板监测API的调用,API调用延迟,API集成延迟,调用时出现的客户端错误及服务端错误。
针对AWS cloudwatch提供的日志功能,AWS API gateway支持基于部署阶段和API方法的配置。
3. Throttling and Caching
AWS API gateway提供缓存及流量管理功能。如下图所示,当请求到达AWS API gateway,API gateway首先检查请求资源是否存在于缓存中,如果存在,则直接返回缓存中的内容。如果不存在,则检查当前的请求速率(RPS:Request Per Second),如果超过了允许的最大速率则返回HTTP status 429(Too Many Request),只有速率检查通过,才真正执行后端调用。
AWS API gateway通过缓存后端返回的应答,可以有效减少后端调用。通过流量管理,可以保护后端API经受峰值流量的考验。
AWS API gateway支持部署阶段级别的缓存和流量管理配置,支持API方法级别的流量管理配置。
4. Payload Modeling and Transformation
在API Gateway 中,客户端发送的请求负载格式可能与后端API接受的请求负载格式不同。同样,API返回的响应负载可能不同于客户端接收的响应负载。AWS API Gateway 提供映射模板将负载从客户端请求映射到API接收的请求,以及从API响应映射到相应的客户端响应。
映射模版是一个用Velocity模版语言表示的脚本。
AWS API gateway的映射模版配置如下图所示:
5. Native Code Generation
AWS API gateway提供自动代码生成功能来生成客户端调用代码,支持的语言平台如下图所示:
作为总结,AWS API gateway尤其适用于较多使用AWS平台组件的组织。如果团队中使用Amazon ALM,包括CodeCommit, CodeDeploy and CodePipeline,那么和AWS API gateway的集成是非常非常方便的。最后,如果你希望基于AWS Lambda开发微服务,那么AWS API gateway也是首选。
AWS API gateway的其他优势包括:依托于AWS CloudFront的全球边缘网络作为基础设施,为API调用提供尽可能低的网络延迟;基于请求和应答数目计费,没有请求则无费用产生。
Kong API gateway
首先kong API gateway分为社区版和企业版,其中社区版是开源的。之所以选择Kong作为开源API gateway来了解,是因为从Kong社区版的官网上,我们可以看到:
“The World’s Most Popular Open Source Microservice API Gateway.”
下图列举了Kong API gateway提供的主要功能,可以看到和AWS API gateway的区别并不大,就不重复说明了。
Kong的特点在于,通过插件实现API gateway的可扩展性,我们可以通过配置插件来实现上述的功能,另外除了Kong本身提供的插件,我们也可以自定义插件。
负载均衡功能
除了上述功能,Kong还通过Ring-balancer的方式提供负载均衡功能。如下图所示,配置一个可工作的ring-balancer,我们需要配置route,service,upstream和targets。按照自顶而下的顺序:
1)配置route,路由规则为:当请求头部中的host设定为‘address.mydomain.com’时,就路由到‘address service’;
2)配置‘address service’,将请求转发给名为‘address.v1.service’的upstream,且路径为/address;
3)配置名为‘address.v1.service’的upstream;
4)为上述upstream配置两个target,配置属性包括IP地址和权重。比如下图中target1具有权重100,target2具有权重50,则请求来临时,2/3会被分配到target1,1/3会被分配到target2。
Health Check & Circuit Breaker
基于ring-balancer,Kong API gateway还提供了health check和circuit breaker的功能。上面已经说过,一个upstream包括多个target,Kong提供两种方式检查target是否处于运行状态,如果不是,则负载均衡器不会向其发送请求。
Kong API gateway提供两种方式进行health check:主动检查和被动检查。主动检查即周期性地发送请求至各个target,基于target的应答进行判断。被动检查即circuit breaker,Kong通过监测发送给各个target的请求及应答情况进行判断。
一般情况下,circuit breaker是指:当A服务实时调用B服务时,B有可能发生不可用或者高延迟的情况,此时A的线程资源可能会在等待中被占用,最糟糕的情况会造成资源耗尽导致A也服务不可用,从而引发传递性失败。为了解决这个问题,A服务可以通过代理访问B服务,当连续出现的失败次数超过配置的门限时,即触发断路,接下来timeout时间内对B服务的调用都会不经尝试,直接失败。timeout时间过后,cirtuit breaker会允许通过一部分到B服务的请求,如果成功则继续正常调用,如果失败那么又开始新一轮的timeout处理。
BFF模式与API gateway的结合
BFF模式即Backend For Frontend。如何理解呢?假设我们要构造一个宠物商店在线管理系统,且该系统基于微服务架构,而此时我们需要构造一个宠物详情页面,包括web端和mobile端。首先,宠物详情页面的信息需要通过多个API来获取,比如宠物基本信息API,订单API,库存API,定价API等等。其次,网页端和移动端需要的信息不尽相同。
那么这种情况下API的应答需要通过组合,裁剪,转化以适应客户端的需求。因此Backend For Frontend就是通过介绍中间层,来完成上述的组合,裁剪与转化。而这一部分也是可以通过API gateway这一中间层来实现的,相当于前文中提到的API gateway aggregation模式。