《微服务架构设计模式》第八章 外部API模式

news2024/9/23 7:27:07

内容总结自《微服务架构设计模式》

外部API模式

    • 一、API设计难题
    • 二、API Gateway 模式
      • 1、简介
      • 2、所有者模式
      • 3、好处和弊端
      • 4、设计问题
      • 5、实现一个API Gateway
    • 三、使用GraphQL 实现API Gateway
    • 四、总结



一、API设计难题

1、移动客户端的API设计难题

在此设计中,移动应用程序扮演着API组合器的角色。它调用多个服务并组合结果。尽管这种方法看似合理,但它有几个严重的问题。(虽然书中说这合理,不会真的有微服务架构是这样设计的吧?好呆呀)

  1. 多次客户端请求导致用户体验不佳
  2. 缺乏封装导致前端开发出的代码修改影响后端
  3. 服务可能选用对客户端不友好的进程间通信机制

2、Web 应用程序的API设计难题

传统的服务器端Web应用程序处理来自浏览器的HTTP请求并返回HTML页面,在防火墙内运行并通过局域网访问服务。网络带宽和延迟不是在Web应用程序中实现API组合的障碍。此外,Web应用程序可以使用非 Web友好的协议来访问服务。开发Web应用程序的团队是同一组织的一部分,并且经常与编写后端服务的团队密切合作,因此无论何时更改后端服务,都可以轻松更新Web应用程序。因此,Web应用程序直接访问后端服务是可行的。


3、基于浏览器的JavaScript应用程序的API设计难题

现代浏览器应用程序使用一些JavaScript。即使HTML 主要由服务器端Web应用程序生成,但在浏览器中运行的JavaScript通常会调用服务。

一方面,当服务API发生变化时,基于浏览器的JavaScript应用程序很容易更新。另一方面,通过互联网访问服务的JavaScript应用程序与移动应用程序具有相同的网络延迟问题。更糟糕的是,基于浏览器的用户界面,尤其是桌面用户界面,通常比移动应用程序更复杂,需要组合更多服务。


4、为第三方应用程序设计API

第三方应用程序通过互联网访问API,因此API组合可能效率低下。但是,与设计第三方应用程序使用的API面临的更大问题相比,API组合的低效率是一个相对较小的问题。因为第三方开发人员需要一个稳定的API。

很少有组织可以强制第三方开发人员升级到新的API。具有不稳定API的组织可能会使开发人员加入竞争对手阵营。因此,你必须仔细管理第三方开发人员使用的API的演变。通常你必须长时间维护旧版本(可能永远)。

这个要求对组织来说是一个巨大的负担。让后端服务的开发人员负责维护长期的后向兼容性是不切实际的。组织应该拥有一个由独立团队开发的独立公共API,而不是直接向第三方开发人员公开服务的API。




二、API Gateway 模式

1、简介

其实就是抽一层,将前端的组合逻辑抽到统一的一层,这一层就是API Gateway层

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

特点:

  1. API组合:API Gateway通常不仅仅是简单地扮演反向代理的角色。它也可能使用API组合实现一些API操作。移动应用程序向API Gateway发出一个请求,该API Gateway从多个服务获取订单详细信息。API Gateway提供粗粒度API,使移动客户端能够通过单个请求检索所需的数据。
  2. 协议转换:API Gateway也可以完成协议转换。它可能为外部客户端提供RESTful API,即使应用程序服务在内部使用混合协议,包括REST 和gRPC。在需要时,某些API的操作实现在RESTful外部 API和基于内部的gRPC API之间进行转换。
  3. API Gateway能够为每一个客户端提供它们专用的API:API Gateway可以提供单一的万能( one-size-fits-all, OSFA)API。单一API的问题在于不同的客户端通常具有不同的需求。例如,第三方应用程序可能需要Get order DetailsAPI操作以返回完整的order信息;而移动客户端只需要订单的部分数据即可。解决此问题的一种方法是为客户端提供在请求中指定服务器应返回哪些字段和相关对象的选项。这种方法适用于公共API,因为这些API必须为大量的第三方应用程序提供服务,但它通常不会为客户端提供所需的细颗粒度控制。
  4. 实现边缘功能:身份验证、访问授权、速率限制、缓存、指标收集(手机有关API的使用情况的指标,可进行分析)、请求日志等

2、所有者模式

谁负责API Gateway的开发及运维?

这个问题有几种不同的答案。

1、由一个单独的团队负责API Gateway。弊端是它与SOA类似,SOA中企业服务总线(ESB)团队负责所有ESB开发。如果从事移动应用程序的开发人员需要访问特定服务,他们必须向API Gateway团队提交请求并等待他们公开API。组织中的这种集中式的瓶颈与微服务架构的理念背道而驰,微服务架构下我们更提倡松散耦合的自治团队。


2、Netflix推出的方法为,让客户端团队(包括移动、Web和公共API团队)拥有与他们有关的API模块并公开API。API Gateway团队负责开发公共模块和API Gateway的运维


3、后端前置模式:为每种类型的客户端实现单独的API Gateway

即前端有移动端、PC端、第三方,这三端在前端团队的工作划分



3、好处和弊端

好处

使用API Gateway的一个主要好处是它封装了应用程序的内部结构。客户端不必调用特定服务,而是与API Gateway通信。APl Gateway为每个客户端提供特定于客户端的API,从而减少客户端和应用程序之间的往返次数。它还简化了客户端代码。


弊端

API Gateway模式也有一些弊端。它是另一个必须开发、部署和管理的高可用组件,但存在成为开发瓶颈的风险。开发人员必须更新API Gateway才能对外公开服务的API。更新API Gateway 的过程尽可能轻量化是非常重要的。否则,开发人员将被迫排队等待更新API Gateway。尽管存在这些弊端,但对于大多数实际应用来说,使用APIGateway是有意义的。如有必要,你可以使用后端前置模式使团队能够独立开发和部署其API。



4、设计问题

1、性能和可扩展性

API Gateway是应用程序的入口。所有外部请求必须首先通过API Gateway。虽然大多数公司的运营规模没有每天处理数十亿个请求的Netflix那么大,但API Gateway的性能和可扩展性通常非常重要。影响性能和可扩展性的关键设计决策是API Gateway应该使用同步还是异步IO。


2、使用响应式编程抽象可维护的代码

如前所述,API组合包括调用多个后端服务。一些后端服务请求完全取决于客户端请求的参数。其他人可能依赖于其他服务请求的结果。一种方法是API端点处理程序方法按照依赖性确定的顺序调用服务。更好的方法是使用响应式方法,以声明式风格编写API组合代码,JVM的响应式抽象包括:

  • Java 8 completableFutures
  • Project Reactor Monos
  • 由Netflix创建的RxJava(用于Java的Reactive Extensions)Observable,专门用于在其API Gateway 中解决此问题
  • Scala Futures

3、处理局部异常

除了可扩展之外,API Gateway也必须可靠。实现可靠性的一种方法是在负载均衡器后面运行多个API Gateway实例。如果一个实例失败,负载均衡器会将请求路由到其他实例。

还有一种方法可以提高API Gateway的可靠性,API Gateway需要正确处理可能导致高延迟的请求。当APl Gateway调用服务时,服务总是很慢或不可用。APl Gateway可能会在很长一段时间内(可能无限期地)等待响应,这会消耗资源并堵塞向客户端发送的响应。对失败服务未完成的请求甚至可能消耗宝贵的资源(例如线程),并最终导致API Gateway无法处理任何其他请求。


4、成为应用程续架构中的好公民

使服务的客户端(如API Gateway)能够确定服务实例的网络位置,以便客户端可以调用服务。可观测性模式使开发人员能够监控应用程序的行为并解决问题。与架构中的其他服务一样,API Gateway 必须实现整个架构中选择的各种模式。



5、实现一个API Gateway

使用现成的API Gateway产品或服务:

  • 此选项几乎不需要代码开发,但灵活性最低。例如AWS API Gateway、AWS Application Load Balancer、使用产品化的API Gateway,现成的API Gateway通常不支持API组合。
  • 使用API Gateway框架或Web框架作为起点,开发属于自己的API Gateway,这是最灵活的方法,但需要进行一些开发工作。例如Netfix Zuul、Spring Cloud Gateway





三、使用GraphQL 实现API Gateway

前面提到的另一个挑战是不同的客户需要稍微不同的数据。例如,与移动应用程序不同,桌面Web应用程序需要显示用户对订单的评级。解决方案可以是,定制接口返回数据的一种方法是让客户端能够指定所需的数据。例如,接口可以支持查询参数,如expand参数,它指定要返回的相关资源,以及field参数,它指定要返回的每个资源的字段。另一种选择是定义此接口的多个版本,作为应用后端前置模式的一部分。对于API Gateway,需要实现众多API接口,这需要做很多工作。

实现支持多种客户端的REST API的API Gateway非常耗时。因此,你可能需要考虑使用基于图形的API框架,例如GraphQL,它旨在支持高效的数据提取


模式(Schema)驱动的 API技术:

两种最流行的基于图形的API技术是 GraphQL 和Netflix Falcor。

Netflix Falcor将服务器端数据建模为虚拟JSON对象图。Falcor客户端通过执行检索该JSON对象属性的查询,从Falcor服务器检索数据。客户端还可以更新属性。在Falcor 服务器中,对象图的属性映射到后端数据源,例如使用REST API 的服务。服务器通过调用一个或多个后端数据源来处理设置或获取属性的请求。

GraphQL 由Facebook开发并于2015年发布,是另一种流行的基于图形的API技术。它将服务器端数据建模为具有字段和对其他对象引用的图形,将对象图映射到后端数据源。GraphQL客户端可以执行检索创建和更新数据的查询。与 Netflix Falcor不同,后者是一种实现,而 GraphQL是一种标准。客户端和服务器可用于各种语言,包括Node.js,Java和 Scala。

Apollo GraphQL是一种流行的JavaScript/Node.js实现。它是一个包含GraphQL服务器和客户端的平台。Apollo GraphQL实现了GraphQL规范的一些强大扩展,例如将更改的数据推送到客户端的子脚本。

就是将原本流程式的后端服务端语言代码,调整为GraphQL的语法,类比为定制化的脚本语言。由配置替代代码,如下图




四、总结

  1. 应用程序的外部客户端通常利用API Gateway访问应用程序的服务。API Gateway为每个客户端提供自定义API。它负责请求路由、API组合、协议转换以及边缘功能(如身份验证)的实现。
  2. 应用程序可以具有单个API Gateway,也可以使用后端前置模式,该模式为每种类型的客户端定义API Gateway。后端前置模式的主要优点是它为客户端团队提供了更大的自主权,因为他们可以开发、部署和运维自己的API Gateway。
  3. 可以使用许多种技术来实现API Gateway,包括现成的API Gateway产品。或者,你也可以使用框架开发自己的API Gateway。
  4. Spring Cloud Gateway是一个易于使用的良好框架,用于开发API Gateway。它使用任何属性(包括方法和路径)路由请求。Spring Cloud Gateway可以将请求直接路由到后端服务或自定义处理程序方法。它采用可扩展、响应式的Spring Framework 5和Project Reactor框架构建。你可以使用,例如,Project Reactor的Mono抽象,以响应式风格编写自定义请求处理程序。
  5. GraphQL是一个提供基于图形的查询语言框架,是开发API Gateway的另一个很好的基础。你可以编写一个面向图形的模式来描述服务器端数据模型及其支持的查询。然后,通过编写检索数据的解析器,将该模式映射到你的服务。基于GraphQL的客户端对模式执行查询,该模式准确指定服务器应返回的数据。因此,基于GraphQL的API Gateway可以支持不同的客户端。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/759010.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动态规划(二) —— 打家劫舍系列问题总结

前言 除了背包系列问题,打家劫舍系列问题同样也是动态规划的经典题目。在这篇文章中荔枝将会把打家劫舍系列问题做一下总结,再仔细体会动态规划的思想,希望能帮到有需要的小伙伴~~~ 文章目录 前言 一、Leecode198.打家劫舍 1.1 分析 1.2 …

C2C、B2B、B2C、O2O电商定义区别

如今是电子商务高度发展的时代,大多数传统企业商家都开始采取转型战略帮助企业发展,商业模式的选择是转型的关键点,下面小编向你详细介绍一下B2B、B2C、C2C、O2O这些商务模式,帮助你快速理解它们。 BBusiness,即企业;…

Servlet实现文件下载的功能

download.html <% page contentType"text/html;charsetUTF-8" language"java" %> <html> <head><title>文件下载</title><base href"<%request.getContextPath()"/"%>>"> </head>…

前端基本功 用 React Hooks + Antd 实现一个 Todo-List

背景 使用 React Hooks 以及组件库 Antd 来实现一个可以 增删 标记是否完成 的 todo-list 思路 要实现一个 todo-list 首先想到用 useState 维护一个状态数组来保存当前 list &#xff0c;还要用一个状态维护添加框中的内容 const [todos, setTodos] useState(initialValu…

OpenCv图像基本变换

目录 一、图像翻转 二、图像旋转 三、仿射变换之平移 四、仿射变换之获取变换矩阵 五、仿射变换之透视变换 一、图像翻转 图像翻转不等同于旋转&#xff0c;类似于一些视频的拍摄&#xff0c;拍摄后实际是左右颠倒的&#xff0c;通过图像翻转可进行还原 案例代码如下: …

第十四章:Context Encoding for Semantic Segmentation ——语义分割的上下文编码

0.摘要 近期的研究在使用全卷积网络&#xff08;FCN&#xff09;框架改善像素级标注的空间分辨率方面取得了显著进展&#xff0c;通过采用扩张/空洞卷积、利用多尺度特征和细化边界等方法。本文通过引入上下文编码模块来探索全局上下文信息对语义分割的影响&#xff0c;该模块捕…

springMVC的开发步骤-15

第一步你用到前端核心控制器&#xff0c;你应该有他&#xff0c;因此导包&#xff1a; 第二步:配servlet 第三步&#xff1a;配控制器&#xff0c;用来调用视图 结束之后我要干嘛&#xff1f;这个springMvC,我能否将这个pojo放到容器内部当中&#xff0c;能否通过bean标签进行配…

Linux 系统编程-开发环境(三)

目录 16 vim 16.1 vi简介 16.1.1 命令行模式 16.1.2 文本输入模式 16.1.3 末行模式 16.2 vim基础操作 16.3 vim分屏操作 16.4 vim打造IDE 16.4.1 简洁版IDE 17 gcc 18 toolchain 19 静态库和共享库 19.1 静态库 19.2 共享库 19.2.1 基础班使 19.2.2 就业班使用…

BiSeNetv2(pytorch)测试、训练cityscapes

1. 源码&#xff1a; github: https://github.com/CoinCheung/BiSeNet git clone https://github.com/CoinCheung/BiSeNet.git2. 预训练模型&#xff1a; 工程下载后解压&#xff0c;并在其中创建文件夹【model】用于存放预训练模型&#xff1b; 3. 运行demo conda creat…

【安装】Linux环境下的 JDK的安装 安装配置 环境变量

目录 Linux安装java环境1.检查系统中是否有JDK2.删除原有的java相关的包3.上传jdk到指定的文件夹4.解压jdk-8u371-linux-x64.tar.gz5.配置jdk的环境变量6.让配置生效 运行一个jar包运行jar包进行测试 Oracle 甲骨文中国 | 云应用和云平台 windows环境下的 JDK官网下载 & 安…

Android实现抓包 使用Fiddler抓包

Fiddler下载&#xff1a;https://pan.baidu.com/s/1QzvL0xugp6XX7gbFBFlEJg?pwdbf6u 提取码&#xff1a;bf6u 1.Fiddler配置 如果用不到https可以不开启https抓包 电脑打开fiddler&#xff0c;手机电脑同一网段。fiddler打开https抓包(Tools->Options->HTTPS)&a…

re学习(17)Bugku-re-Tworld(使用DFS解决迷宫问题)

下载地址&#xff1a; 跳转提示 参考视频&#xff1a; 【Bugku/CTF/Re/WP】使用DFS解决迷宫问题CTF "Tworld"_哔哩哔哩_bilibili 载入IDA后发现有UPX壳&#xff0c;先用工具进行脱壳&#xff0c;然后载入IDA进行分析。 编写脚本&#xff1a; #全部代码 import…

【电路原理学习笔记】第3章:欧姆定律:3.3 电压的计算

第3章&#xff1a;欧姆定律 3.3 电压的计算 电压相关欧姆定律公式&#xff1a; V I R VIR VIR 【例3-11】在图3-10所示的电路中&#xff0c;产生5A电流需要多大电压&#xff1f; 【答】 V I R 5 A 100 Ω 500 V VIR5\rm A\times 100Ω500 V VIR5A100Ω500V 【同步练习…

N天爆肝数据库——MySQL(5)

本文主要对索引进行了讲解 这里写目录标题 本文主要对索引进行了讲解索引概述介绍优缺点索引结构二叉树红黑树B-Tree(多路平衡查找树)BTreeBTree与B-Tree区别: HashHash索引特点 为什么InnoDB存储引擎选择使用BTree索引结构&#xff1f;索引分类在InnoDB存储引擎中&#xff0c;…

详解JS的四种异步解决方案!

目录 同步&异步的概念 js中异步的应用场景 实现异步的四种方法 1、 回调函数 2、Promise 3、Generator 4、 async/await 「异步编程」是前端工程师日常开发中经常会用到的技术&#xff0c;也是校招面试过程中常考的一个知识点。 通过掌握「异步编程」的四种方式&…

redis 和mongodb基础操作练习

目录 redis作业 string、list、hash 数据类型 举例说明list和hash的应用场景&#xff0c;每个至少一个场景 mongodb作业 1. 创建一个数据库 名字grade 2. 数据库中创建一个集合名字 class 3. 集合中插入若干数据 文档格式如下 4. 查找 5. 增加、更新、删除、统计 re…

【电路原理学习笔记】第3章:欧姆定律:3.1 电压、电流与电阻的关系

第3章&#xff1a;欧姆定律 3.1 电压、电流与电阻的关系 欧姆定律指出&#xff1a;电流与电压成正比&#xff0c;与电阻成反比。即 I V R I\frac{V}{R} IRV​ 3.1.1 电压与电流之间的线性关系 数学上&#xff0c;线性指的是变量之间的关系在图形上是一条直线。线性方程所对…

数据结构与算法——希尔排序(引例、希尔增量序列、原始希尔排序、代码、时间复杂度、Hibbard增量序列、Sedgewick增量序列)

目录 引例 希尔增量序列 原始希尔排序 代码&#xff08;C语言&#xff09; 时间复杂度 更多增量序列 Hibbard增量序列 Sedgewick增量序列 希尔排序&#xff08;by Donald Shell&#xff09; 引例 给以下序列进行排序&#xff1a; 先以5的间隔进行插入排序&#xff1a…

自学数据结构和算法(5)

二叉树的遍历 分为先序、中序、和后序遍历。 这三种遍历都可以由递归序来得到&#xff1a; &#xff08;1&#xff09;先序遍历&#xff08;也是二叉树的深度优先遍历&#xff09;是第一次到某个结点才打印&#xff1b; &#xff08;2&#xff09;中序遍历是第二次到某个结…

【ACM】—蓝桥杯大一暑期集训Day3

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前正在学习C/C、Java、算法等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&#xff…