API网关:系统的门面要如何做呢?

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

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

总结:

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

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

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

原文始发于微信公众号(二进制跳动):API网关:系统的门面要如何做呢?

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/223245.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!