API网关旨在用一套单一且统一的API入口点,来组合一个或多个内部API。
API网关定位为应用系统服务接口的网关,区别于网络技术的网关,但是原理是一样的。API网关统一服务入口,可方便实现对平台众多服务接口进行管控,如对访问服务的身份认证、防报文重放与防数据篡改、功能调用的业务鉴权,以及响应数据的脱敏、流量与并发控制,甚至基于API调用的计量或计费等。
API并不能适用于所有场景
在基于微服务的架构设计中,往往包含多个服务,这些服务并不能适用于所有场景。例如,在一个面向PC的Web应用中,服务所要提供的API是要返回一个页面,而非单纯的数据,那么这样的API只能适用于Web应用,而不能适用于移动APP。
又如,在移动APP的架构设计中,由于网络带宽的限制,在设计API时,往往会考虑较少的网络传输次数及更少的传输数据。而面向PC的Web应用却无须考虑这些限制。
图10-1展示了不同场景下的API网关使用情况。
API网关常用于以下场景。
API网关所带来的好处
API网关能够为外部消费方提供一套统一的入口点,且不会受到内部微服务的具体数量与组成的影响。
API网关为微服务架构系统带来了如下好处。
1.避免将内部信息泄露给外部
在数据安全方面,API网关能够将外部公共API与内部微服务API区分开来,使各项微服务在添加或变更时,能有明确的安全边界。这样,微服务架构就能随时间推移而始终通过重组来保证系统安全,且不会对外部绑定客户造成影响。另外,其还能够为全部微服务提供单一入口点,从而避免外部客户进行服务发现及版本控制信息查看。
2.为微服务添加额外的安全层
API网关能够提供─套额外的保护层,足以应对SQL注入、XML解析攻击及拒绝服务(DoS)攻击等常见威胁因素,从而实现额外的保护层效果。系统的权限控制也可以在这一层来实施。
3.支持混合通信协议
面向外部的API,由于考虑到平台和语言的无关性,往往向外提供基于HTTP或REST的API。但内部微服务往往会采用不同的通信协议。此类协议包括ProtoBuf、AMQP或其他集成有SOAP、JSON-RPC或XML-RPC的系统。API网关可跨越这些协议,提供一个外部统一的、基于REST的API,并允许各团队以此为基础选择最适合内部架构的协议方案。
4.降低构建微服务的复杂性
微服务架构系统往往拥有比单个架构更多的管理复杂度,如API令牌验证、访问控制及速率限制等。每一项功能的实施,都会给相关实现服务带来影响,进而会延长微服务的开发时间。API网关能够从代码层面隔离这些功能项,使开发人员在构建单个微服务时,能够专注于实际的核心业务。
5.微服务模拟与虚拟化
通过将微服务内部API与外部API加以区分,大家可以模拟或虚拟化自己的服务,从而满足设
计要求或配合集成测试。
API网关的弊端
虽然使用API网关会给微服务架构带来一定的好处,但同时仍然要考虑如下的弊端。
业界常用的API网关方式有很多,技术方案也很成熟,其中也不乏很多开源的产品,如NG-INX、Tyk、Kong、API Umbrella、ApiAxle、Zuul、WSO2 API Manager等。下面介绍三种常见的API网关方案。
NGINX
NGINX是一个免费的、开源的、高性能的HTTP服务器和反向代理,以及一个IMAP/POP3代理服务器。NGINX以其高性能、稳定性、丰富的功能集、简单的配置和低资源消耗而闻名。
NGINX是为解决C10K问题而编写的少数服务器之一。与传统服务器不同,NGINX不依赖于线程来处理请求。相反,它使用可扩展的事件驱动(异步)架构。这种架构在负载下使用小的但更重要的可预测的内存量。即使用户不希望处理数千个并发请求,仍然可以从NGINX的高性能和小内存中获益。NGINX在各个方向扩展:从最小的VPS一直到大型服务器集群。
NGINX拥有诸如Netflix、Hulu、Pinterest、CloudFlare、Airbnb、WordPress.com、GitHub、SoundCloud、Zynga、Eventbrite、Zappos、Media Temple、Heroku、RightScale、Engine、Yard,MaxCDN等众多高知名度网站。
NGINX具有很多非常优越的特性。
将NGINX作为API网关
NGINX用server_name来定义服务器名称,所以它可以决定哪一个server块将用来处理给定的请求,也就是实现了API网关的功能。
NGINX可以使用精确名称、通配符、正则表达式来定义服务器名称。下面是一个例子。
server{
listen
80;
server name example.org www.example.org;
server {
listen 80;
server name .example.org;
..
server{
listen
80;
server namemail.*;
server {
listen
80;
server name~^(?.+).examplel.net$;
。。。
}
当寻找一个虚拟服务器的名称时,如果指定的名称匹配多个变量,如通配符和正则表达式都匹配,将会按照以下的顺序选择第一个匹配的变量。
Spring Cloud Zuul
Zuul是Netflix公司开源的一个API网关组件,提供了认证、鉴权、限流、动态路由、监控、弹性、安全、负载均衡、协助单点压测、静态响应等边缘服务的框架。
Zuul的基本功能如下。
Zuul处理每个请求的方式是针对每个请求使用一个线程来处理。通常情况下,为了提高性能,所有请求会被放到处理队列中,从线程池中选取空闲线程来处理该请求。2016年年底,Netlix将它们的网关服务Zuul进行了升级,全新的Zuul 2将HTTP请求的处理方式从同步变成了异步,以提升其处理性能。
Spring Cloud Zuul是基于Netflix Zuul的微服务路由和过滤器的解决方案,也用于实现API网关。
有关Zuul的内容,将会在本文后续章节中详细介绍。
Kong
Kong 是专注于提供微服务API网关的管理平台,它本身是基于NGINX的,但比NGINX提供了更为简单的配置方式,并且提供了一些优秀的插件,如验证、日志、调用频次限制等。
Kong 另外一个强大之处在于提供了大量的插件来扩展应用,通过设置不同的插件,可以为服务提供各种增强的功能。Kong 的插件平台可以访问https://konghq.com/pluginsl。
Kong具有以下特性。
图10-2展示了Kong 的架构示意图,该图来自Kong官网。