架构|如何架构一个合适的企业API网关(1)API网关的介绍、应用场景、作用及常用方案

一、何为API网关?

APIGateway 即API网关,所有请求首先会经过这个网关,然后到达后端服务,有点类似于Facade模式。API网关作为系统接口对外的统一出口,可以减少调用方对服务实现的感知。 没有API网关时的系统结构如下图1:由图可以看出,在没有API网关作为统一出口的情况下,需要调用方自己组合各种服务,而且容易让调用方感知后端各种服务的存在。

图1 没有网关时的系统结构

加入API网关时的系统结构如下图2:由图可以看出,在加入了API网关之后,通过网关暴露接口给调用方,调用方可以在不感知后端服务的情况下调用服务,而且通过统一的接口,后端服务接口的变化不会影响调用方,后端服务变化可以通过网关的转换,对外仍然保持一致的风格。

图2 加入网关的系统结构

二、网关的几种使用场景

图3 使用场景

2.1、面向Web App 这类场景,在物理形态上类似前后端分离,此时的Web App已经不是全功能的Web App,而是根据场景定制、场景化的App。

2.2、面向Mobile App 这类场景,移动App是后端Service的使用者,此时的APIGateway还需要承担一部分MDM(此处是指移动设备管理,不是主数据管理)的职能。

2.3、面向Partner OpenAPI 这类场景,主要为了满足业务形态对外开放,与企业外部合作伙伴建立生态圈,此时的APIGateway需要增加配额、流控、令牌等一系列安全管控功能。

2.4、面向Partner ExternalAPI 这类场景,业界提的比较少,很多时候系统的建设,都是为了满足企业自身业务的需要,实现对企业自有业务的映射。当互联网形态逐渐影响传统企业时,很多系统都会为了导入流量或者内容,依赖外部合作伙伴的能力,一些典型的例子就是使用「合作方账号登录」、「使用第三方支付平台支付」等等,这些对于企业内部来说,都是一些外部能力。此时的API GW就需要在边界上,为企业内部Service 统一调用外部的API做统一的认证、(多租户形式的)授权、以及访问控制。

三、APIGateway的作用

通过上面的几种使用场景,我们归纳APIGateway的主要作用包括如下几点:

3.1、统一对外接口 当用户需要集成不同产品或者服务之间的功能,调用不同服务提供的能力。利用APIGateway可以让用户在不感知服务边缘的情况下,利用统一的接口组装服务。 对于公司内部不同的服务,提供的接口可能在风格上存在一定的差异,通过APIGateway可以统一这种差异。 当内部服务修改时,可以通过APIGateway进行适配,不需要调用方进行调整。

3.2、增加系统安全性 APIGateway对外部和内部进行了隔离,减少对外暴露服务可以增加系统安全性,保障了后台服务的安全性。

3.3、统一鉴权 通过APIGateway对访问进行统一鉴权,不需要每个应用单独对调用方进行鉴权,应用可以专注业务。

3.4、服务注册与授权 可以控制调用方可以使用和不可以使用的服务。

3.5、服务限流 通过APIGateway可以对调用方调用每个接口的每日调用及总调用次数限制。

3.6、提升预发能力 为服务熔断,灰度发布,线上测试提供简单方案。

3.7、全链路跟踪 通过APIGateway提供的唯一请求Id,监控调用流程,以及调用的响应时间。

四、APIGateway需要考虑的因素

4.1、安全性问题 企业在把服务暴露给外部使用时,首先要确保服务使用的安全,防止外部的恶意访问对公司业务的影响,特别是涉及交易方面的服务,更是要全面考虑安全性。为确保安全,需要考虑在通讯链路的建立、通讯数据的加密、数据的完整性等方面。

4.2、性能问题 作为企业API的入口,所有的请求都会经过APIGateway进行转发,可想而知,对API网关的访问压力是巨大的,有的网站甚至达到每分钟上千万的访问量。特别是在一些互联网企业,海量的移动终端每时每刻都需要与后端的服务进行交互,如果不能保证APIGateway的高性能,企业在网关层需要投入大量的设备和成本。

4.3、高可用问题 APIGateway作为逻辑上的单点,一旦发生问题,将造成企业服务的不可用,对企业来说可能造成的致命的影响。计算短时间的不可用,也会给企业带来直接的经济损失。所以,如何保证APIGateway的7*24小时的稳定运行,网关的自动伸缩、API的热更新等问题,都是企业级的网关需要考虑的。

4.4、扩展性问题 企业APIGateway提供了一个脚手架,一些非功能性的问题,例如日志、安全、负载均衡策略、鉴权等。这些插件会随着企业业务规模等的变化进行不断的强化与调整。这就需要网关层提供这样一种机制,使得可以灵活地进行这些调整和变化,而不用频繁对网关层进行改动,确保网关层的稳定性。

4.5、API高效运维的问题 API在上线、发布过程中,都需要涉及到网关层的配合,例如,需要网关层知道API发布的地址,API的接口形式、报文格式,也需要网关层对后台API进行封装。在API调整后,需要作出相应的修改。所以,API网关设计时,需要明确网关层与服务层的职责切分与协作模式,使得API的管理、发布更加高效。

4.6、API全生命周期的管理 API服务的全生命周期,包括服务的开发、测试、上线发布;服务使用的申请、开通;服务分类分级别的管理、服务使用情况的监控、计费等等。

一个企业可能会暴露成百上千个API,日常也会经常进行API的发布、升级、改造、下架等操作。对不同的服务,不同的访问者,需要提供不同的服务访问策略。有的商业API公司,还需要对API的使用进行付费。所以,与API网关配套的,需要一套完善的自助系统,提供给服务的提供者、管理者、使用者,来对服务的发布、使用、和运营。

五、APIGateway的常用实现方案

5.1、开源API网关框架Spring Cloud Zuul

Spring Cloud Zuul

Zuul是Netflix出品的一个基于JVM路由和服务端的负载均衡器。它的主要功能有:认证、压力测试、金丝雀测试、动态路由、负载削减、安全、静态响应处理和主动/主动交换管理。spring zuul 是spring Cloud的组件,可以和spring cloud的各个组件结合使用。 SpringCloud的整体组建包括:Zuul、Ribbon、EureKa、Fein、Hystrix等。其中Zuul就是一个类似APIGateway的组建,Ribbon是类似于Nginx的代理服务器,Eureka用于注册和发现服务,Hystrix可以作为整个架构的断路服务,用于服务降级。Fein可以作为一个Rest服务的提供者,可以供内部服务之间相互调用。

5.2、开源API网关框架Kong

Kong

Kong是一个现成的APIGateway的解决方案, Kong本身是基于Nginx开发的,在性能和稳定性上都没有问题。

5.3、Nginx+Lua

Nginx + Lua

基本功能: 1)静态web资源服务器,能够缓存打开的文件描述符 2)支持http/imap/pop3/smtp的反向代理;支持缓存、负载均衡 3)支持fastcgi(fpm) 4)模块化,非DSO机制,支持过滤器zip压缩,SSI以及图像大小调整 5)支持SSL Nginx的扩展功能: 1)基于名称和IP的虚拟主机 2)支持keepalive的保持机制 3)支持平滑升级 4)定制访问日志,支持使用日志缓存区提高日志存储性能 5)支持url rewrite 6)支持路径别名(root或alias指定) 7)支持基于IP以及用户的访问控制 8)支持传输速率限制,并发限制 性能和高可用性上: Nginx性能极高,Nginx先天的事件驱动型设计、全异步的网络I/O处理机制、极少的进程间切换以及许多优化设计,都使得Nginx天生善于处理高并发压力下的互联网请求。Nginx的稳定性也在各大网站得到验证。官方提供的常用模块都非常稳定,每个worker进程相对独立,master进程在1个worker进程出错时可以快速“拉起”新的worker子进程提供服务。支持热部署,可以不停机更新配置文件、更新日志文件、更新服务器程序版本。 扩展性上: Nginx的设计极具扩展性,它完全是由多个不同功能、不同层次、不同类型且耦合度极低的模块组成。因此,当对某一个模块修复Bug或进行升级时,可以专注于模块自身,无须在意其他 易用性上: Nginx使用最自由的BSD许可协议,允许用户在自己的项目中直接使用或修改Nginx源码,有大量的插件可以利用。但是,Nginx模块需要用C开发,而且必须符合一系列复杂的规则。虽然通过第三方模块,可以支持Nginx与Perl、Lua等脚本语言集成工作,但对使用者的要求还是很高。

如果只是使用Nginx做APIGateway还是不够的,因为Nginx有单点问题,这里可以结合阿里云的SLB一起做。


从对上面三种方案的比较中可以看到,Spring Cloud Zuul非常适合创业初期的团队,快速搭建一个“基本可用”的API网关。Nginx适合有较强研发团队,自主开发企业自己的API网关,当然如果结合阿里云的SLB去做的话还是挺方便的。Kong适合于没有自身研发团队,但需要拥有企业级API网关能力的公司。

六、参考资料

https://blog.csdn.net/akin_zhou/article/details/50373414 https://blog.csdn.net/zhengpeitao/article/details/72722301 https://blog.csdn.net/Tredemere/article/details/78246413?locationNum=10&fps=1 https://help.aliyun.com/document_detail/27539.html?spm=a2c4g.11186623.6.539.WlAqyy

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏开源项目

Java 微服务从源码实战开始 | 码云周刊第 49 期

在软件开发的不同时期、阶段,对技术架构的理解、选择和应用都有着不一样的诉求。微服务架构是当前互联网业界的一个技术热点,它的思想也更符合我们的目标: 根据业务模块...

4047
来自专栏Java进阶干货

大型分布式网站架构技术总结:高性能+高可用+可扩展+可伸缩架构

集群:一个应用/模块/功能部署多份(如:多台物理机),通过负载均衡共同提供对外访问。

3583
来自专栏Java技术栈

通往Java 9之路:每年两次发布即将到来

Oracle将加速标准Java的发布,每六个月推出一个新版本的Java开发工具包(JDK),每三年更新一次长期支持的版本。因此,下个版本的Java9将在2018...

3355
来自专栏java思维导图

大型分布式网站架构技术总结

#0 系列目录# 大型分布式网站架构 大型分布式网站架构技术总结 本文是学习大型分布式网站架构的技术总结。对架构一个高性能,高可用,可伸缩,可扩展的分布式网站进...

3894
来自专栏CSDN技术头条

Uber是如何通过Mesos和Cassandra实现跨多个数据中心每秒100万的写入速度的?

每隔三十秒就会有位置数据返回,包括来自于司机和乘客应用的各类数据,需要实时使用的实时数据非常之多,那么Uber是如何存储这些位置数据的呢? Uber的解决方案非...

2289
来自专栏架构说

分布式配置中心架构与实战

声明:信息来源 docker.io 分享主题:分布式配置中心架构与实战 分享主题:分布式配置中心架构与实战 声明 信息来源docker.io 今天的大规模...

1.2K8
来自专栏Golang语言社区

棋牌游戏服务器架构: 总体设计

首先要说明的是, 这个棋牌游戏的服务器架构参考了网狐棋牌的架构。网狐棋牌最令人印象深刻的是其稳定性和高网络负载。它的一份压力测试报告上指出:一台双核r的INTE...

6309
来自专栏Java技术栈

干货 | 京东购物车的 Java 架构实现及原理!

3274
来自专栏Golang语言社区

棋牌游戏服务器架构: 总体设计

首先要说明的是, 这个棋牌游戏的服务器架构参考了网狐棋牌的架构。网狐棋牌最令人印象深刻的是其稳定性和高网络负载。它的一份压力测试报告上指出:一台双核r的INTE...

7516
来自专栏架构之美

实施微服务架构的关键技术

1363

扫码关注云+社区

领取腾讯云代金券