API网关:系统的门面要如何做呢?
创始人
2025-07-13 12:30:28
0

API 网关(API Gateway)不是一个开源组件,而是一种架构模式,它是将一些服务共有的功能整合在一起,独立部署为单独的一层,用来解决一些服务治理的问题。你可以把它看作系统的边界,它可以对出入系统的流量做统一的管控。在我看来,API 网关可以分为两类:一类叫做入口网关,一类叫做出口网关。

入口网关通常位于负载均衡服务器和应用服务器之间,具有多个重要作用。首先,它为客户端提供一个统一的接入地址,使得客户端无需关心各个微服务的具体部署地址和协议细节,从而带来便利。其次,API网关可以动态路由客户端请求到不同的业务服务上,并且进行必要的协议转换工作,例如将HTTP请求转换为RPC请求等。另外,API网关还可实现服务治理策略,如熔断、降级、流量控制和分流等。此外,客户端的认证和授权功能也可以在API网关中实现,使得不同类型的客户端采用不同的认证方式得到统一处理。针对黑白名单管理和日志记录等功能也可以在API网关中完成。

图片图片


出口网关相比入口网关可能功能和作用较少。在系统开发中,我们通常会依赖许多外部的第三方系统,比如第三方账户登录、支付工具等。为了简化与这些外部系统的交互,我们可以在应用服务器和第三方系统之间部署出口网关。在出口网关中,可以实现对调用外部API的统一认证、授权、审计以及访问控制,从而提高系统的安全性和稳定性。

图片图片

API 网关要如何实现

理解了API网关的作用后,接下来需要关注其实现中的几个关键点以及常见的开源API网关。在实现API网关时,首要考虑的是性能。因为API入口网关承担着来自客户端的所有流量,所以性能直接影响用户体验。举例来说,如果业务服务处理时间为10ms,而API网关的耗时为1ms,那么每个接口的响应时间都会增加10%,这对性能影响巨大。API网关的性能优化关键在于I/O模型。举例来说,Netflix开源的API网关Zuul在1.0版本中采用同步阻塞I/O模型,而在2.0版本中改造成了基于Netty的非阻塞I/O模型,性能提升了约20%。

此外,API网关中的操作可以预先定义,如黑白名单设置、接口动态路由,也可以根据业务需要定义。因此,API网关的设计需要注意扩展性,即可以动态添加或移除一些逻辑,使得网关的执行链路更加灵活。一般来说,可以将每个操作定义为一个过滤器(filter),然后使用责任链模式将这些过滤器串起来。责任链可以动态组织过滤器,解耦各个过滤器之间的关系,使得增加或减少过滤器不会影响其他过滤器的运行。

在实践中,对API网关的设计和优化需要综合考虑性能、扩展性和灵活性等因素,以提供高效、可靠的服务。

如何在你的系统中引入 API 网关

一方面,API网关负责对服务层接口数据进行聚合。举例来说,商品详情页的接口可能需要调用多个服务接口获取商品信息、用户信息、店铺信息以及用户评论等数据,API网关可以负责将这些数据聚合并返回给前端。

另一方面,Web层需要将HTTP请求转换为RPC请求,并对前端的流量进行限制,例如对某些请求添加设备ID的黑名单等。因此,在进行系统改造时,可以将API网关从Web层中独立出来,将协议转换、限流、黑白名单等功能迁移到API网关中进行处理,形成一个独立的入口网关层。

针对服务接口数据聚合的操作,通常有两种解决思路:

独立出一组网关专门处理服务聚合和超时控制等任务。其中,一种网关被称为流量网关,负责处理流量控制、协议转换等任务;另一种网关则被称为业务网关,负责处理超时控制等业务相关任务。

抽取独立的服务层,专门负责接口聚合的操作。这样,服务层可以大致分为原子服务层和聚合服务层两部分,原子服务层提供单一功能的原子服务接口,而聚合服务层负责调用多个原子服务接口并进行数据聚合。

我认为,接口数据聚合是业务操作,与其放在通用的网关层来实现,不如放在更贴近业务的服务层来实现,所以,我更倾向于第二种方案。

图片图片

同时,我们可以在系统和第三方支付服务、以及登录服务之间部署出口网关服务。以前,通常会在拆分出来的支付服务中完成对于第三方支付接口所需数据的加密、签名等操作,然后再调用第三方支付接口完成支付请求。现在,我们将对数据的加密、签名等操作放在出口网关中。这样一来,支付服务只需要调用出口网关的统一支付接口即可完成支付请求,大大简化了支付服务的调用流程。

在引入了 API 网关之后,我们的系统架构就变成了下面这样:

图片图片

总结:

API网关分为入口网关和出口网关两类。入口网关的功能包括隔离客户端和微服务、提供协议转换、安全策略、认证、限流、熔断等;而出口网关则主要用于统一调用第三方服务,提供统一的认证、授权、审计以及访问控制。

在实现API网关时,性能和扩展性是重点。可以采用多路I/O复用模型和线程池并发处理来提升性能,使用责任链模式来提升扩展性。线程池可以针对不同的接口或服务进行隔离和保护,提升网关的可用性。

API网关可以替代系统中原有的Web层,将Web层中的功能如协议转换、认证、限流等迁移到API网关中,将服务聚合的逻辑下沉到服务层。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...