接口调度者——API 网关

本文涉及的产品
云原生 API 网关,700元额度,多规格可选
简介:

背景

我们知道在微服务架构风格中,一个大应用被拆分成为了多个小的服务系统提供出来,这些小的服务他们自成体系,也就是说这些小系统可以拥有自己的数据库,框架甚至语言等,这些小系统通常以提供 Rest Api 风格的接口来被 H5, Android, IOS 以及第三方应用程序调用。

在《浅入浅出消息队列》这一篇文章中,我提到了消息队列是方便服务与服务之间的通信解耦,如下图所示:

那么这时候问题来了,如果一个外部的应用(浏览器、App)要去访问这个大应用怎么办?

很简单啊,直接通过 HTTP 请求不就完了?

问题

真的这么简单吗?我们以淘宝的商品详情页为例:

如上图所示,这个页面包含了视频、库存、商品价格、商品评价等内容,这些数据都来自不同的微服务中,所以没办法像传统单体应用一样依靠数据库的 join 查询来得到最终结果,因此就需要多次调用以检索数据,如下图所示:

这就会引发几个严重的问题:

  • 不同的客户端设备可能需要不同的数据。Web,H5,APP,需要单独写一套 API
  • 多次客户端请求导致用户体验不佳。移动网络相较于服务于服务间的局域网,有更低的带宽和更高的延时,如果可以同时执行请求倒也还好,但如果客户端要按照顺序执行请求,就会让用户体验变得异常糟糕。
  • 缺乏封装导致前后端不协调。过分的拆分 API,会导致客户端和服务端过度耦合,再加上移动端 APP 的新版本迭代到每个手机用户时需要很久,这样会使后端很难更改服务的 API。

这样显然是不好的设计,因此,本期的“天降猛男”就出现了——API 网关。

API 网关

在介绍 API 网关前,我们先来介绍一个设计模式——外观模式。

外观模式(Facade Pattern)它向现有的系统添加一个接口,来隐藏系统的复杂性。类图如下所示:

之所以要在说 API 网关前说一下外观模式,是因为二者的设计理念是类似的。

和外观模式类似,API 网关封装了应用程序的内部架构,并为其客户端提供 API,他还可能具有其他职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。下图展示了客户端、API 网关和服务之间的关系。

所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。其出现也是侧面贯彻了软件工程中"高内聚,低耦合"的思想。

核心作用

API 网关负责请求路由、API 组合和协议转换。来自外部客户端的所有 API 请求首先会先转到 API 网关,后者再将请求路由到相应的服务。API 网关使用 API 组合模式处理其他请求,调用多个服务并聚合结果。同时他还可以在客户端友好的协议(例如 HTTP)与客户端不友好的协议之间进行转换。

请求路由

当 API 网关收到请求时,随机会查询路由映射,该映射将指定请求路由到哪个服务。例如,路由映射可以将 HTTP 方法和路径映射到服务的 HTTP URL,这一点和 Nginx 提供的反向代理的功能是一样的,后面我们也会对其进行一个比较。

既然有路由映射,那存放在哪就是一个问题了,我们需要为 API 网关设置一个路由映射的存储位置,通过可能会用 zookeeper 等作为注册中心来使用,文末我们也会提一下弊端。

API 组合

除去反向代理这个功能外,API 网关还提供了 API 组合的操作。以上面的淘宝详情页为例,如果我们单独获取视频、商品价格、商品评论等信息,需要发多个请求(getVideo,getPrice,getComments)。有了 API 网关后我们就可以将 API 接口组合起来,通过一次请求(getItemDetail)来获取需要的信息,如下图所示,这样可以极大的改善由于网络延时导致的差用户体验。

协议转换

API 网关可以为外部客户端提供 RESTful API,即使内部的服务使用混合的通信协议,例如 REST、gRPC 等。这样做的好处是,对于外部客户端而言,服务端更像是一个不可见的黑盒。

API 网关和 Nginx

本质上看 API 网关也是做了请求的转发,那既然 Nginx 也可以做请求转发,这两者有什么区别?

一张图就可以很好的理解了。

Nginx 做负载均衡时,考虑到 API 网关在系统中不止一个(以集群的方式做高可用),我们可以将 Nginx 至于 API 网关前,负责对 API 网关的负载均衡,然后再由网关决定进入到哪个真实的 web 服务器。
这样就可以让两者的分工更加明确:API 网关聚合服务,Nginx 请求转发

API 网关的优缺点

API 网关封装了应用程序的内部结构,使得客户端只需要同网关交互,而不必调用特定的服务。同时 API 网关为每一类客户端提供了特定的 API ,从而减少客户端与应用程序间的交互次数,简化客户端代码的处理。

但就和所有中间件一样,他们都存在一个共同的问题,API 网关的存在使系统增加了一个必须开发、部署和维护的高可用组件。如果这个组件没有处理好,那么 API 网关就会变成了应用的性能瓶颈。

而且为了暴露每个微服务,开发人员必须更新 API 网关,所以就有可能会搭配其他服务发现类的中间件使用,例如 zookeeper,这样就又引入了新的中间件。所以我们需要保证 API 网关的更新过程要尽可能地简单,否则为了更新网关,开发人员将不得不排队等待。

由此可见,API 网关也并不是一颗"银弹",我们在中间件的选择上还是需要结合项目的实际情况,万不可追求新颖就滥用中间件,适合自己的才是最好的。不过,API 网关虽然仍有不足,但对于大多数现实世界的应用程序而言使用 API 网关是合理的。

最后

以上就是本文的全部内容了,如果你觉得本文对你有所帮助,不妨点个赞关注一下,你们的支持是我原创的最大动力!

相关文章
|
5天前
|
API PHP 开发者
速卖通商品详情接口(速卖通API系列)
速卖通(AliExpress)是阿里巴巴旗下的跨境电商平台,提供丰富的商品数据。通过速卖通开放平台(AliExpress Open API),开发者可获取商品详情、订单管理等数据。主要功能包括商品搜索、商品详情、订单管理和数据报告。商品详情接口aliexpress.affiliate.productdetail.get用于获取商品标题、价格、图片等详细信息。开发者需注册账号并创建应用以获取App Key和App Secret,使用PHP等语言调用API。该接口支持多种请求参数和返回字段,方便集成到各类电商应用中。
|
3天前
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
24 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
|
2天前
|
监控 供应链 搜索推荐
亚马逊商品详情接口(亚马逊 API 系列)
亚马逊作为全球最大的电商平台之一,提供了丰富的商品资源。开发者和电商从业者可通过亚马逊商品详情接口获取商品的描述、价格、评论、排名等数据,对市场分析、竞品研究、价格监控及业务优化具有重要价值。接口基于MWS服务,支持HTTP/HTTPS协议,需注册并获得API权限。Python示例展示了如何使用mws库调用接口获取商品详情。应用场景包括价格监控、市场调研、智能选品、用户推荐和库存管理等,助力电商运营和决策。
44 23
|
3天前
|
JSON 数据挖掘 API
lazada商品详情接口 (lazada API系列)
Lazada 是东南亚知名电商平台,提供海量商品资源。通过其商品详情接口,开发者和商家可获取商品标题、价格、库存、描述、图片、用户评价等详细信息,助力市场竞争分析、商品优化及库存管理。接口采用 HTTP GET 请求,返回 JSON 格式的响应数据,支持 Python 等语言调用。应用场景包括竞品分析、价格趋势研究、用户评价分析及电商应用开发,为企业决策和用户体验提升提供有力支持。
48 21
|
4天前
|
数据采集 JSON 监控
速卖通商品列表接口(以 AliExpress Affiliate 商品查询 API 为例)
以下是使用 Python 调用速卖通商品列表接口(以 AliExpress Affiliate 商品查询 API 为例)的代码示例。该示例包含准备基础参数、生成签名、发送请求和处理响应等关键步骤,并附有详细注释说明。代码展示了如何通过公共参数和业务参数构建请求,使用 HMAC-SHA256 加密生成签名,确保请求的安全性。最后,解析 JSON 响应并输出商品信息。此接口适用于商品监控、数据采集与分析及商品推荐等场景。注意需通过 OAuth2.0 获取 `access_token`,并根据官方文档调整参数和频率限制。
|
5天前
|
存储 搜索推荐 API
淘宝拍立淘按图搜索API接口系列概述
淘宝拍立淘按图搜索API接口允许用户通过上传图片或拍摄实物来搜索相似或相同的商品。这一功能主要依赖于图像识别技术,系统会对上传的图片进行分析和处理,提取出商品的特征信息,并在淘宝的商品数据库中进行匹配搜索,最终返回与上传图片相似或相同的商品列表。
|
4天前
|
JSON 监控 API
速卖通商品列表接口(速卖通API系列)
速卖通提供商品列表API,开发者可通过关键词、类目、价格范围等条件获取商品标题、价格、销量等基本信息。使用前需注册开发者账号、创建应用并授权获取access_token。Python示例代码展示了如何调用接口,返回JSON格式数据,包含商品列表、总数、页码等信息。应用场景包括商品监控、数据分析和个性化推荐。注意API会更新,请参考官方文档。
|
5天前
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
27 5
|
8天前
|
JSON 监控 API
虾皮(shopee)商品列表接口(虾皮API 系列)
虾皮(Shopee)是东南亚及台湾地区的知名电商平台,提供丰富的商品数据。通过其API接口,开发者可合法获取商品列表信息,包括商品ID、名称、价格等,支持按分类、关键词、价格范围等条件筛选。Python示例代码展示了如何使用API进行请求,并解析返回的JSON数据。应用场景涵盖市场调研、竞品分析、选品决策、价格监控及数据可视化,帮助电商从业者和分析师更好地理解市场动态,优化运营策略。
|
6天前
|
JSON API 数据安全/隐私保护
虾皮(shopee)商品详情接口(虾皮 API 系列)
Shopee 商品详情接口(item_get)用于获取商品的标题、价格、描述、库存和图片等详细信息。开发者需使用 Shopee 提供的 API 密钥进行认证,通过 GET 请求访问指定 URL。请求参数包括 partner_id、shopid、itemid、timestamp 和 sign。签名生成需按字母顺序排序参数,拼接后与 API 密钥进行 HMAC-SHA256 加密。响应为 JSON 格式,包含商品详细信息及错误提示。注意妥善保管 API 密钥,并遵守请求频率限制。