常见API架构介绍

常见API架构介绍

两个服务间进行接口调用,通过调用API的形式进行交互,这是常见CS架构实现的模式,客户端通过调用API即可使用服务端提供的服务。相较于SPI这种模式,就是服务端只规定服务接口,但具体实现交由第三方或者自身来实现,API这种模式是具体的实现和API接口都是服务端来实现的。

image-20230825103535466

一、API架构介绍

1.介绍

两个服务间进行接口调用,通过调用API的形式进行交互,这是常见CS架构实现的模式,客户端通过调用API即可使用服务端提供的服务。相较于SPI这种模式,就是服务端只规定服务接口,但具体实现交由第三方或者自身来实现,API这种模式是具体的实现和API接口都是服务端来实现的。

API 使用协议或规范来定义那些通过网络传输的消息的语义和信息。这些规范构成了 API 的体系结构。API架构发展的历程:

img

2.分类

按照API的特征,一般可以将其分为一下几类:

  1. Web API:RESTful
  2. 查询 API:GraphQL
  3. RPC API :SOAPgRPC
  4. 实时通信API:websocket

在这里插入图片描述

二、4种常见API架构设计

1.SOAP

架构介绍

SOAP 协议基于XML,应用于安全性和可靠性至关重要的金融服务和支付网关,比较适合对数据安全等级较高的场景。

在这里插入图片描述

使用场景

目前,SOAP 体系结构最常用于企业内部或与其信任的合作伙伴的内部集成。由于高度安全的数据传输,SOAP 严格的消息结构,安全性和授权功能使其成为在 API 和客户端之间执行正式软件协议的最合适的选择,同时又符合 API 提供者与 API 使用者之间的法律合同。这就是为什么金融组织和其他企业用户选择适用 SOAP 的原因。

实现原理

SOAP基于XML格式,但由于XML格式的复杂性,SOAP也是最冗长的一种API架构模式。SOAP 的消息由这些部件组成:

  1. 信封标签:用于开始和结束每条消息

  2. 请求头:用于表示消息是否由某些规范或额外要求的来确认

  3. 请求体:包含请求或响应的正文

  4. 故障通知:包含了可能在请求处理过程只能够发生的任何错误

    image-20230824175938224

SOAP 支持有状态和无状态消息传递。在有状态的情况下,服务器存储接收到的信息可能非常繁琐复杂。 但这对于涉及多方和复杂交易的操作是合理的。

如果需要支持有状态的交互,可以将token信息保存在header中,后续的请求带上该token即可。

优点和缺点

优点

  1. 独立于语言和平台。内置创建 Web 服务的功能使得 SOAP 能够处理消息通信的同时发送独立于语言和平台响应。
  2. 绑定到各种协议。SOAP 在适用于多种场景的传输协议方面是十分灵活的。
  3. 内置错误处理。SOAP API 规范允许返回带有错误码及其说明的的 XML 重试消息。
  4. 一系列的安全拓展。SOAP 与 ES-Security 集成,因此 SOAP 可满足企业级事务要求。它在事务内部提供了隐私和完整性,同时允许在消息级别进行加密。

缺点

  1. 仅支持XML。SOAP 消息包含大量的元数据,并且在请求和响应时仅支持繁冗的 XML 格式。
  2. 重量级。由于 XML 文件的大小,SOAP 服务需要很大的带宽。
  3. 非常专业化的知识。构建 SOAP API 服务器需要对所有涉及到的协议以及它们及其严格的限制都有很深的了解。
  4. 乏味的消息更新。由于需要额外的工作来添加或者删除某个消息属性,这种死板的 SOAP 模式减慢了其被采用的速度。

2.RESTful

架构介绍

RESTful API在移动互联网时代中有着广泛的应用,因为它足够的轻量(基于JSON),非常灵活。REST API规定了许多标准,比如:统一接口、通讯方式、无状态、可缓存等。

使用场景

  1. 管理 API。在系统中,专注于管理对象并面向许多使用者的 API 是最常见的 API 类型。REST 帮助此类 API 具有强大的可发现性,良好的文档编制,因此 REST 非常适合此对象模型。
  2. 简单的资源驱动型应用程序。在用于连接不需要查询灵活性的资源驱动型应用时,REST 是一种非常有效的方法。

实现原理

RESTful 的定义并不像 SOAP 那样严格。RESTful 体系结构应该遵守如下六个体系结构约束:

  1. 统一接口:无论设备或应用程序类型如何,都可以采用统一的方式与给定的服务端进行交互;

  2. 无状态:请求本身包含处理该请求所需要的状态,并且服务端不存储与会话相关的任何内容

  3. 缓存

  4. 客户端-服务器体系结构:允许双方独立发展

  5. 应用程序的层级系统

  6. 服务端向客户端提供可执行代码的能力

在 REST 中,使用例如 GET、POST、PUT、DELETE、OPTIONS 可能还有 PATCH 等 HTTP 方法来完成操作。支持的方法类型和描述信息:

image-20230824180933489

  1. GET:获取资源详情或资源列表。对于collection类型的URI(比如**/customers**)就是获取资源列表,对于item类型的URI(比如**/customers/1**)就是获取一个资源。
  2. POST:创建资源,请求体是新资源的内容。往往POST是用于为集合新增资源。
  3. PUT:创建或修改资源,请求体是新资源的内容。往往PUT用于单个资源的新增或修改。实现上必须幂等。
  4. PATCH:部分修改资源,请求体是修改的那部分内容。PUT一般要求提交整个资源进行修改,而PATCH用于修改部分内容(比如某个属性)。
  5. DELETE:移除资源。和GET一样,对于collection类型的URI(比如**/customers**)就是删除所有资源,对于item类型的URI(比如**/customers/1**)就是删除一个资源。

此外还需要注意RESTful下的幂等性问题,启动POST方法不具备幂等性,多次提交会导致多次创建相同对象,需要做好幂等性控制。

优点和缺点

优点:

  1. 轻量级数据格式交互:RESTful API架构一般使用json数据格式来进行通信,相比于SOAP的XML格式根据简单和轻量级,所以非常适合web前后端的数据交换。
  2. 客户端和服务端的解耦:由于 REST 尽可能地解耦了客户端和服务端,REST 相较于 RPC 可以提供更好的抽象性。具有抽象级别的系统能够封装其实现细节,以更好的标示和维持它的属性。这使得 REST API 足够灵活,可以随着时间的推移而发展,同时保持稳定的系统。
  3. 可发现性:客户端和服务端之间的通信描述了所有内容,因此不需要外部文档即可了解如何与 REST API 进行交互。
  4. 缓存友好:REST 重用了许多 HTTP 工具,也是唯一一种可以在 HTTP 层面上缓存数据的 API 架构风格。 与其相对的是,在任何其他 API 上实现缓存都需要配置其他缓存模块。
  5. 多种格式支持:REST 拥有支持多种格式用于存储和交换数据的能力,这是它如今成为搭建公共 API 的主要选择的原因之一。

缺点:

  1. 没有标准的 REST 结构:在构建 REST API 方面,没有具体的正确方法。 如何对资源进行建模以及哪些资源需要建模取决于不同的情况。这使得 REST 在理论上很简单,但在实践中却很困难。
  2. **庞大的负载:**REST 会返回大量丰富的元数据,以便客户端可以仅从响应中了解有关应用程序状态的所有必要信息。对于具有大量带宽容量的大型网络系统来说,这种“啰嗦”的通信并不算很大的负载。但带宽容量并非总是足够的。 这也是 Facebook 在 2012 年提出 GraphQL 架构风格的关键驱动因素。
  3. 响应过度和响应不足问题。 REST 的响应包含的数据会过多或不足,通常会导致客户端需要发送另一个请求。

3.RPC

架构介绍

RPC(Remote Procedure Call) 远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的方法。由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。远程过程调用是一种允许在不同上下文中远程执行函数的规范。 RPC 扩展了本地过程调用的概念,并将其放在 HTTP API 的上下文中。

使用场景

用于内部微服务的客户特定的 API。由于是在单个提供者和单个使用者之间建立直接的集成,我们不想像 REST API 那样,花太多时间通过网络传输大量的元数据。凭借高消息速率和消息性能,gRPC 和 Twirp 成为了用于微服务的可靠用例。通过在底层使用 HTTP 2,gRPC 能优化网络层,使其非常高效地在不同服务之间每天传送大量信息。然而,如果你并不是要着眼于提高网络性能,而是要在发布高度独立的微服务团队之间建立一个稳定的 API 联系。REST 就能做到。

实现原理

RPC客户端调用一个远程的过程,将参数和附加信息序列化为消息,然后将消息发送到服务端。服务端在接受到消息后,将信息的内容反序列化,执行所请求的操作,然后将结果发送回客户端。客户端和服务端各自负责参数的序列化和反序列化。

img

gRPC是PRC的一种非常流程的实现框架,gRPC 是Google 2016年创建的开源远程过程调用框架,它重写了他们过年的内部RPC基础设施并开源出来。gRPC 是 RPC 的一种流行实现,许多组织已采用 gPRC 作为首选的 RPC 实现方案。还有Openfeign、Dubbo这种框架也可以作为 RPC 的实现方案。
gRPC生态系统的核心是使用 Protocal Buffers (协议缓冲区)作为其数据交换格式。它是一种和语言及平台无关的机制,用于编码结构化数据。之所以 gRPC 具有超高的性能,Protocol Buffers 的通讯方案是重点。它是一种非常高效的二进制编码格式,比 JSON 快得多。

在这里插入图片描述

另一个高效率的原因是,gRPC 构建在HTTP/2 之上,以提供大规模的高性能基础。gRPC使用 HTTP/2 Stream,它允许通过单个长期的TCP连接发送多个消息流。HTTP/2 的好处有:多路复用、流优先、二进制协议、服务推送。

在这里插入图片描述

优点和缺点

优点

  1. **简单直接的交互。**RPC 使用 GET 来获取信息,使用 POST 来处理其他所有操作。服务端和客户端之间交互的机制归结为调用端点并获得响应。
  2. **易于添加新函数。**如果 API 有了新的需求,我们可以轻松地添加另一个执行这个需求的端点:1)编写一个新函数,并将其放在一个新端点之后;2)现在,客户可以访问这个端点,并获取符合其需求的信息。
  3. 高性能。轻量级的有效负载不会对网络产生压力,以此提供高性能,这对于共享服务器和在工作站网络上执行并行计算非常重要。RPC 还能够优化网络层,使得不同服务之间每天发送海量消息变得非常高效。

缺点

  1. **和底层系统紧密耦合。**API 的抽象级别有助于其可重用性。API 与基础系统的耦合越紧密,对其他系统的可重用性就越差。 RPC 与基础系统的紧密耦合不允许其在系统函数和外部 API 之间建立抽象层。这很容易引起安全问题,因为关于基础系统的细节实现很容易会泄漏到 API 中。
  2. RPC 的紧密耦合使得可伸缩性要求和松散耦合的团队难以实现。因此,客户端要么会担心调用特定端点的带来的任何可能的副作用,要么需要尝试弄清楚要调用的端点,因为客户端不了解服务器如何命名其函数。
  3. **可发现性低。**在 RPC 中,无法对 API 进行检验总结,或者发送请求来开始理解根据需求应该调用哪个函数。
  4. 函数爆炸性增长。创建新函数非常容易。因此,相较于重新编辑现有的函数,我们会倾向于创建新的功能,最终产生大量难以理解的、功能重叠的函数。

4.websocket

架构介绍

WebSocket 是实时通讯的常用手段,基于HTTP协议。关于实时、双向和持久连接的。如果只需要服务器实时推送。

使用场景

长应用在需要实时交互的场景中,比例聊天室。

实现原理

Websocket的通信方式是全双工模式,无论客户端还是服务端,都能够自主发起通信。但是WebSocket 是独立的、建立在TCP上的协议。Websocket 通过 HTTP/1.1 协议的101状态码进行握手。为了建立Websocket连接,需要通过浏览器发出请求,之后服务器进行回应,这个过程通常称为“握手”(Handshaking)。握手是通过HTTP协议完成的,但是一旦建立连接后,数据传输将使用WebSocket协议。

img

WebSocket通信的流程如下:

  1. 客户端发送一个HTTP请求,请求的目的是为了要建立一个WebSocket连接。
  2. 服务器收到请求后,给出一个HTTP响应,并升级连接到WebSocket协议。
  3. 客户端和服务器之间建立一个WebSocket连接。
  4. 客户端和服务器之间可以进行双向通信,发送文本和二进制数据。
  5. 当客户端或服务器关闭连接时,WebSocket连接也会关闭。

与 HTTP 通信不同的是,WebSocket 通信是基于TCP的,所以它是一个持久连接。它允许服务器主动发送信息给客户端,而不是等待客户端的请求。这使得 WebSocket 通信成为了实现实时应用的理想选择。

优点和缺点

优点

  1. **较少的控制开销。**在连接建立后,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较小。在不包含扩展的情况下,对于服务器到客户端的内容,此头部大小只有2至10字节(和数据包长度有关);对于客户端到服务器的内容,此头部还需要加上额外的4字节的掩码。相对于HTTP请求每次都要携带完整的头部,此项开销显著减少了。
  2. **更强的实时性。**由于协议是全双工的,所以服务器可以随时主动给客户端下发数据。相对于HTTP请求需要等待客户端发起请求服务端才能响应,延迟明显更少;即使是和Comet等类似的长轮询比较,其也能在短时间内更多次地传递数据。
  3. **保持连接状态。**与HTTP不同的是,Websocket需要先建立连接,这就使得其成为一种有状态的协议,之后通信时可以省略部分状态信息。而HTTP请求可能需要在每个请求都携带状态信息(如身份认证等)。
  4. **更好的二进制支持。**Websocket定义了二进制帧,相对HTTP,可以更轻松地处理二进制内容。
  5. **可以支持扩展。**Websocket定义了扩展,用户可以扩展协议、实现部分自定义的子协议。如部分浏览器支持压缩等。
  6. **更好的压缩效果。**相对于HTTP压缩,Websocket在适当的扩展支持下,可以沿用之前内容的上下文,在传递类似的数据时,可以显著地提高压缩率。

缺点

  1. 服务端需要维护一套WebSocket的组件,由于WebSocket是需要长连接的,这导致对服务端的技术要求高。所以对于服务端来说,WebSocket的组件可能会很复杂,耦合性会很高。
  2. 这也是因为Http发展的久用的人多,有很多可复用的组件,而WebSocket只用于特定的场景,所以研究出来的组件比较少。既然后端要做WebSocket的长连接, 那么前端也要做,虽然前端难度没有后端那么大,也需要前端人员有一定的数据驱动能力。
  3. 维护WebSocket的连接需要服务端资源消耗,并且还需要在服务端保存你WebSocket session通信,同时需要自己实现一套保活策略。
  4. 有些Web浏览器不支持WebSocket,比如较低版本的IE不兼容。

三、总结

1.不同架构的对比

  1. 选择RPC场景:服务内部通信,需要高性能;
  2. 选择RESTful场景:提供公共web api服务
  3. SOAP:特定业务,需要高安全保障的领域
  4. websocket:实时交互领域

img

2.API架构选型一般考虑

RPC面向过程,一般使用在微服务内部通信;REST面向资源,一般使用在为外部提供web api服务场景;websocket面向实时交互,是http单工通信的有力补充;SOAP适合特定业务领域内部,具有较高安全属性的业务;GraphQL就是面向数据查询,适合和客户端交互时候使用。

3.API架构优化策略

  1. 使用缓存,可以采用类似 Redis 这种工具,将数据进行缓存以提供高效率的通讯。
  2. 连接池,使用多路复用技术,用来减少对数据库的访问。
  3. 避免 N+1 查询,当一个接口需要采用多个 SQL 语句的时候,尝试组合使用一个。
  4. 使用分页,减少数据通讯的代价,换取更快的加载速度。
  5. 采用 JSON,轻量级的 JSON 通讯可以在服务端与客户端中保持平衡。
  6. 压缩,可以用 Brotli 算法对数据进行压缩,许多CDN(内容分发网络)也可以支持压缩。
  7. 异步日志记录,当高并发的时候,这类工作可以分发到别的微服务中进行。

参考资料

  1. 4 种主流的 API 架构风格对比:https://www.infoq.cn/article/ov7prhrtinw6jjhelmh6
  2. 一杯茶的时间,搞懂 RESTful API:https://apifox.com/blog/a-cup-of-tea-time-to-understand-restful-api/
  3. API 接口选择那个?RESTful、GraphQL、gRPC、WebSocket、Webhook:https://blog.csdn.net/u012558210/article/details/132420532?utm_source=miniapp_weixin
  4. 浅谈三种API设计风格RPC、REST、GraphQL:https://zhuanlan.zhihu.com/p/56955812
  5. 浅谈API设计风格:https://developer.aliyun.com/article/978885
  6. Comparing API Architectural Styles: SOAP vs REST vs GraphQL vs RPC:https://levelup.gitconnected.com/comparing-api-architectural-styles-soap-vs-rest-vs-graphql-vs-rpc-84a3720adefa

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

https 的ssl证书过期处理解决方案(lighthttpd)

更换证书:lighthttpd 配置文件位置:/opt/vmware/etc/lighttpd/lighttpd.conf (配置文件的最底部 G快速来到底部) 方案一:阿里云申请免费的证书 这里公司内网环境没有配置域名,可以创建一个临时域名&…

【JS真好玩】自动打字机效果

目录 一、前言二、布局分析三、总体样式四、中间部分五、底部5.1 div5.2 label5.3 input 六、JS让它动起来6.1定时器6.2 字符串处理6.2.1 slice6.2.2 splice6.3.3 split 七、总结 一、前言 大家好,今天实现一个自动打字机效果,旨在实现一些网上很小的de…

uniapp国际化npm install vue-i18n报错

npm install vue-i18n //npmyarn add vue-i18n //yarn在vue2环境下,默认安装 npm install vue-i18n 的版本是 vue-i18n9.1.9,所以报错。 npm view vue-i18n versions --json 用以上命令查看版本: vue2建议5.0版本 npm install vue-i1…

python可视化matplotlib——绘制正弦和余弦

这是一个使用matplotlib库绘制正弦和余弦函数曲线的代码示例。代码中导入了需要的库,并设置了x轴和y轴的标签字体为华文楷体。然后,使用numpy生成一组x轴上的值t,并使用正弦函数生成对应的y轴值s,再使用余弦函数生成对应的y轴值z。…

【LeetCode-中等题】24. 两两交换链表中的节点

文章目录 题目方法一:递归方法二:三指针迭代 题目 方法一:递归 图解: 详细版 public ListNode swapPairs(ListNode head) {/*递归法:宗旨就是紧紧抓住原来的函数究竟返回的是什么?作用是什么即可其余的细枝末节不要细究,编译器…

docker高级(redis集群三主三从)

1. 新建6个docker容器redis实例 docker run -d --name redis-node-1 --net host --privilegedtrue -v /redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381docker run -d --name redis-node-2 --net host --privilegedtrue -v /…

Docker安装MySQL、Redis如何自启?

1、问题: Docker自启:http://t.csdn.cn/L2v55 重新启动虚拟机,Docker自动启动之后,发现MySQL、Redis都没有启动。 docker ps 没查到有启动的容器。 docker ps -a 查看所有的容器。 2、先使用 su root 命令,切换到root…

【通用消息通知服务】0x3 - 发送我们第一条消息(Websocket)

【通用消息通知服务】0x3 - 发送我们第一条消息 项目地址: A generic message notification system[Github] 实现接收/发送Websocket消息 Websocket Connection Pool import asyncio from asyncio.queues import Queue from asyncio.queues import QueueEmpty from contextli…

Java 版 spring cloud 工程系统管理 工程项目管理系统源码 工程项目各模块及其功能点清单

工程项目各模块及其功能点清单 一、系统管理 1、数据字典:实现对数据字典标签的增删改查操作 2、编码管理:实现对系统编码的增删改查操作 3、用户管理:管理和查看用户角色 4、菜单管理:实现对系统菜单的增删改查操…

C++ IO流

文章目录 一.C语言的输入与输出二.流是什么三.CIO流1.C标准IO流2.C文件IO流&#xff08;1&#xff09;文件操作步骤&#xff08;2&#xff09;以二进制的形式操作文件&#xff08;3&#xff09;以文本的形式操作文件&#xff08;4&#xff09;使用>>和<<对文件进行…

get请求报错400 非法参数

get请求报错400 非法参数 背景&#xff1a;get请求数据&#xff0c;SpringBoot提供接口&#xff0c;返回400&#xff0c;报错非法参数此种情况排除接口本身错误之外&#xff0c;检查参数中有没有特殊字符 " < > [ \ ] ^ { | } 我这边就是因为其中一个参数中有中括…

Spring MVC 四:Context层级

这一节我们来回答上篇文章中避而不谈的有关什么是RootApplicationContext的问题。 这就需要引入Spring MVC的有关Context Hierarchy的问题。Context Hierarchy意思就是Context层级&#xff0c;既然说到Context层级&#xff0c;说明在Spring MVC项目中&#xff0c;可能存在不止…

怎么建设ITIIL运维管理体系?

市场上大多数ITIL解决方案都过于复杂&#xff0c;让我们举一个客户希望实施ITIL方案的例子。首先&#xff0c;客户要通过ITIL咨询来定义ITIL流程&#xff0c;并使其与业务目标保持一致。接下来就是购买ITIL软件&#xff1b;大多数ITIL解决方案将事件、问题和变更管理作为不同的…

STM32CubeMX配置STM32G0 Standby模式停止IWDG(HAL库开发)

1.打开STM32CubeMX选择好对应的芯片&#xff0c;打开IWDG 2.打开串口1进行调试 3.配置好时钟 4.写好项目名称&#xff0c;选好开发环境&#xff0c;最后获取代码。 5.打开工程&#xff0c;点击魔术棒&#xff0c;勾选Use Micro LIB 6.修改main.c #include "main.h"…

【InsCode】InsCode打造的JavaSE与Linux命令互融的伪Linux文件系统小项目

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;Ja…

浅谈 Linux 下 vim 的使用

Vim 是从 vi 发展出来的一个文本编辑器&#xff0c;其代码补全、编译及错误跳转等方便编程的功能特别丰富&#xff0c;在程序员中被广泛使用。 Vi 是老式的字处理器&#xff0c;功能虽然已经很齐全了&#xff0c;但还有可以进步的地方。Vim 可以说是程序开发者的一项很好用的工…

Redis三种特殊数据类型

Redis三种特殊数据类型 geospatial 地理位置 Redis 地理空间数据类型简介 Redis 地理空间索引允许您存储坐标并搜索它们。 此数据结构可用于查找给定半径或边界框内的邻近点。 基本命令 GEOADD 将位置添加到给定的地理空间索引&#xff08;请注意&#xff0c;使用此命令&a…

开始MySQL之路—— DDL语法、DML语法、DQL语法基本操作详解

DDL语法 DDL&#xff08;Data Definition Language&#xff09; 数据定义语言&#xff0c;该语言部分包括以下内容。 对数据库的常用操作 对表结构的常用操作 修改表结构 对数据库的常用操作 1: 查看当前所有的数据库 show databases; 2&#xff1a;创建数据库 create dat…

【项目实战典型案例】05.前后端分离的好处(发送调查问卷)

目录 一、背景二、思路三、过程1、主要的业务逻辑2、解决问题的思路 四、总结五、面向对象的好处 一、背景 以下流程图是给用户发送调查问的整体流程&#xff0c;将不必要的业务逻辑放到前端进行处理。这样导致逻辑混乱难以维护。前后端分离的其中一个目的是将功能的样式放在了…

数据结构 - 线性表的顺序存储

一、顺序存储定义&#xff1a; 把逻辑上相邻的数据元素存储在物理上相邻的存储单元中。简言之&#xff0c;逻辑上相邻&#xff0c;物理上也相邻顺序表中&#xff0c;任一元素可以随机存取&#xff08;优点&#xff09; 二、顺序表中元素存储位置的计算 三、顺序表在算法中的实…