API 的架构详解
API 架构基础概念
(一)什么是 API
API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数、协议和工具,用于不同软件系统之间的通信和交互,它允许不同的应用程序或组件在不需要了解对方内部实现细节的情况下进行数据交换和功能调用,浏览器通过 HTTP API 与 Web 服务器进行通信,获取网页内容;移动应用通过操作系统提供的 API 访问设备的硬件功能,如摄像头、地理位置等。
(二)API 在软件架构中的位置
API 处于软件系统的边界层,连接着不同的软件模块、应用程序或服务,它将底层的复杂逻辑封装起来,向上提供简单、统一的调用接口,使得开发者可以专注于业务逻辑的实现,而不必关心底层的技术细节,在分层架构中,API 通常位于表现层与业务逻辑层之间,或者在不同服务之间作为通信桥梁。
API 架构的常见类型
(一)RESTful 架构
特点 | 描述 |
---|---|
基于资源 | 以资源为中心,每个资源都有唯一的标识符(URI),/users/123 表示用户 ID 为 123 的资源。 |
无状态 | 服务器不存储客户端的状态信息,每个请求都是独立的,这使得服务器能够轻松地扩展和处理大量并发请求。 |
使用 HTTP 方法 | 利用 HTTP 协议中的常用方法(GET、POST、PUT、DELETE 等)来操作资源,GET 用于获取资源,POST 用于创建新资源。 |
数据格式灵活 | 支持多种数据格式,如 JSON、XML 等,JSON 由于其简洁性和易解析性,在 Web API 中广泛应用。 |
示例:一个博客系统的 RESTful API,可能有以下端点:
GET /posts
:获取所有博客文章列表。POST /posts
:创建一篇新的博客文章,请求体中包含文章的标题、内容等信息。GET /posts/{id}
:获取指定 ID 的博客文章详情。PUT /posts/{id}
:更新指定 ID 的博客文章。DELETE /posts/{id}
:删除指定 ID 的博客文章。
(二)RPC 架构(Remote Procedure Call,远程过程调用)
特点 | 描述 |
---|---|
像调用本地函数一样调用远程服务 | 开发者无需关心网络通信细节,就像在本地调用函数一样调用远程的服务方法,在 Java 中使用 RMI(Remote Method Invocation)技术,可以通过接口直接调用远程对象的方法。 |
高效传输 | 通常采用二进制协议进行数据传输,相比文本协议(如 HTTP + JSON),在数据传输效率和性能上有一定优势,尤其适用于对性能要求较高的场景。 |
紧密耦合 | 客户端和服务端需要事先约定好接口定义和数据结构,任何一方的接口变更都可能影响到另一方,因此适合在相对稳定的企业内部系统或特定领域的应用中使用。 |
示例:在一个分布式计算系统中,计算节点 A 需要调用计算节点 B 上的某个复杂计算函数,通过 RPC 架构,A 可以直接调用 B 提供的远程接口,传入参数并获取计算结果,就像在本地调用函数一样方便。
(三)GraphQL 架构
特点 | 描述 |
---|---|
按需获取数据 | 客户端可以在一次请求中指定需要获取的数据字段,避免了传统 RESTful API 中可能出现的数据冗余或不足的问题,客户端只需要用户的姓名和邮箱,就不需要像 RESTful API 那样获取包含所有用户信息的整个资源。 |
强大的查询能力 | 支持复杂的查询操作,包括嵌套查询、过滤、排序等,能够满足各种个性化的数据需求。 |
自描述性 | API 接口本身包含了数据类型的定义和查询规则,使得客户端和服务器之间的交互更加清晰和易于理解。 |
示例:在一个社交网络应用中,客户端想要获取某个用户的基本信息以及该用户的好友列表中的前 10 个好友的姓名和头像,通过 GraphQL API,客户端可以发送如下查询请求:
{ user(id: "123") { name email friends(first: 10) { name avatarUrl } } }
服务器将根据请求返回相应的数据,避免了不必要的数据传输。
API 架构的核心组成部分
(一)API 网关
组件 | 功能 |
---|---|
请求路由 | 根据请求的 URL、HTTP 方法等信息,将请求路由到对应的后端服务,将 /api/user 的请求路由到用户服务,将 /api/order 的请求路由到订单服务。 |
负载均衡 | 在多个后端服务实例之间分配请求,以提高系统的可用性和性能,可以采用轮询、加权轮询、IP 哈希等负载均衡算法。 |
安全认证与授权 | 对请求进行身份验证和权限检查,确保只有合法的用户才能访问相应的 API,使用 OAuth 2.0 协议进行用户认证和授权管理。 |
流量控制 | 限制请求的流量,防止后端服务被过载,可以设置每秒请求数(QPS)限制、并发连接数限制等。 |
(二)资源服务器
组件 | 功能 |
---|---|
数据处理与存储 | 负责处理业务逻辑,对数据进行增删改查等操作,并将数据存储到数据库或其他存储介质中,用户服务负责处理用户注册、登录、信息修改等业务,并将用户数据存储到关系型数据库或 NoSQL 数据库中。 |
业务逻辑实现 | 实现具体的业务功能,如订单服务中的订单创建、支付处理、订单状态更新等逻辑。 |
数据持久化 | 确保数据在服务器重启或故障恢复后依然存在,通过与数据库的交互实现数据的持久化存储。 |
(三)数据库
类型 | 特点 | 适用场景 |
---|---|---|
关系型数据库(如 MySQL、PostgreSQL) | 具有严格的数据结构定义,支持事务处理和复杂的查询操作,数据一致性高。 | 适用于对数据完整性和一致性要求较高的应用场景,如金融系统、企业资源管理系统等。 |
NoSQL 数据库(如 MongoDB、Redis) | 数据结构灵活,可扩展性强,能够处理大量的非结构化或半结构化数据。 | 适用于互联网应用、大数据存储、实时数据分析等场景,如社交网络应用、电商商品推荐系统等。 |
(四)客户端应用
类型 | 特点 | 与 API 交互方式 |
---|---|---|
Web 应用 | 基于浏览器运行,通过 HTTP 协议与 API 进行通信,通常使用 JavaScript 框架(如 React、Vue.js)构建前端界面,通过 AJAX 或 Fetch API 调用后端 API。 | 在电商网站中,Web 应用通过 API 获取商品列表、用户订单信息等数据,并在页面上进行展示和交互。 |
移动应用(iOS、Android) | 安装在移动设备上,具有丰富的交互功能和离线缓存能力,通过移动网络或 Wi-Fi 与 API 进行通信,一般使用原生开发语言(如 Swift、Java)或跨平台框架(如 Flutter、React Native)开发。 | 社交媒体应用的移动版本通过 API 上传照片、获取好友动态等。 |
桌面应用 | 运行在个人电脑或工作站上,提供更强大的功能和用户体验,可以通过多种协议(如 HTTP、TCP/IP)与 API 进行通信,常见的开发语言包括 C++、Java、Python 等。 | 企业级的办公软件通过 API 与后端服务器进行数据同步和业务处理。 |
(五)认证授权中心
组件 | 功能 |
---|---|
用户认证 | 验证用户的身份信息,如用户名和密码、指纹识别、面部识别等,常见的认证方式包括基本认证、OAuth 2.0、JWT(JSON Web Token)等。 |
权限管理 | 根据用户的角色和权限配置,决定用户是否能够访问特定的 API 资源,管理员用户可以访问所有的 API,而普通用户只能访问部分公开的 API。 |
API 架构的设计原则
(一)简洁性原则
- 接口设计简洁:API 的接口应该尽量简单明了,避免过多的参数和复杂的请求路径,每个接口应该只完成一个明确的功能,遵循单一职责原则,不要在一个接口中同时处理用户注册和登录两个功能。
- 数据结构简洁:返回的数据结构应该清晰易懂,避免嵌套过深的 JSON 对象或数组,尽量使用通用的数据格式和字段命名规范,方便客户端解析和使用。
(二)一致性原则
- 命名规范一致:API 中的资源命名、参数命名、返回值命名等应该遵循统一的命名规范,提高代码的可读性和可维护性,所有的资源都采用复数形式命名,如
/users
、/orders
等。 - 行为一致:相同的操作在不同的 API 端点上应该具有相同的行为和返回结果,对于所有的 GET 请求,都应该返回资源的详细信息,而不是有些返回列表,有些返回单个对象。
(三)安全性原则
- 身份认证与授权:确保只有经过授权的用户才能访问 API,采用合适的认证和授权机制,如 OAuth 2.0、JWT 等,对敏感数据进行加密传输,防止数据泄露。
- 输入验证:对客户端输入的数据进行严格的验证和过滤,防止恶意输入导致的安全漏洞,如 SQL 注入、跨站脚本攻击(XSS)等。
(四)可扩展性原则
- 模块化设计:将 API 划分为多个独立的模块或服务,每个模块负责特定的功能,便于后续的扩展和维护,将用户管理、订单管理、商品管理等功能分别封装成独立的服务。
- 版本管理:随着业务的发展和需求的变化,API 可能需要进行升级和改进,通过合理的版本管理策略,如在 URL 中添加版本号(如
/api/v1/users
),可以确保新旧版本的 API 同时可用,不影响现有客户的正常使用。
(五)高性能原则
- 缓存机制:对于频繁访问的数据,可以采用缓存技术(如 Redis 缓存)来减少对数据库的访问次数,提高响应速度,将热门商品的信息缓存到内存中,当用户请求时直接从缓存中获取。
- 异步处理:对于一些耗时较长的操作,如文件上传、邮件发送等,可以采用异步处理的方式,避免阻塞主线程,提高系统的吞吐量,用户上传头像后,服务器立即返回上传成功的响应,然后在后台异步处理头像的存储和压缩操作。
API 架构的实例分析
以一个电商平台的 API 架构为例:
(一)整体架构
- API 网关:接收来自客户端(Web 应用、移动应用)的所有请求,进行请求路由、负载均衡、安全认证与授权等操作,将
/api/user
的请求路由到用户服务,将/api/product
的请求路由到商品服务。 - 用户服务:负责用户相关的业务逻辑,如用户注册、登录、个人信息修改等,通过 API 网关与客户端进行通信,同时与数据库交互存储用户数据,当用户注册时,接收客户端传来的用户名、密码等信息,进行数据验证后存储到关系型数据库中。
- 商品服务:处理商品相关的业务,包括商品上架、下架、查询商品信息等,与数据库中的商品数据表进行交互,通过 API 网关向客户端提供商品数据的接口,当客户端请求获取商品列表时,从数据库中查询商品信息并以 JSON 格式返回给客户端。
- 订单服务:管理订单的创建、支付、发货等流程,与用户服务、商品服务以及支付网关等进行交互,确保订单业务的顺利进行,当用户下单购买商品时,订单服务需要调用用户服务验证用户信息,调用商品服务检查商品库存,然后生成订单并保存到数据库中。
- 数据库:采用关系型数据库(如 MySQL)存储用户信息、商品信息、订单信息等核心数据,同时使用 NoSQL 数据库(如 Redis)进行缓存和临时数据存储,提高系统的性能。
- 认证授权中心:使用 OAuth 2.0 协议对用户进行身份认证和授权管理,用户在登录时,认证授权中心验证其用户名和密码,生成访问令牌(Access Token)并返回给客户端,客户端在后续的 API 请求中携带访问令牌,API 网关或各个服务根据令牌进行权限验证。
(二)API 接口示例
- 用户登录接口
- URL:
/api/user/login
- HTTP 方法:POST
- 请求参数:
username
:用户名password
:密码
- 返回结果:
- 成功:返回用户信息和访问令牌(Access Token)
- 失败:返回错误信息,如用户名或密码错误
- URL:
- 获取商品列表接口
- URL:
/api/product/list
- HTTP 方法:GET
- 请求参数:可选的分页参数(如 page、pageSize)和筛选条件(如 categoryId、priceRange)
- 返回结果:商品列表数据,包括商品名称、价格、图片链接等信息
- URL:
- 创建订单接口
- URL:
/api/order/create
- HTTP 方法:POST
- 请求参数:订单相关信息,如用户 ID、商品 ID 列表、收货地址等
- 返回结果:订单创建结果,包括订单 ID、订单状态等信息
- URL:
问题与解答
如何选择适合自己项目的 API 架构类型?
解答:选择 API 架构类型需要考虑多个因素,要考虑项目的需求和特点,如果项目需要简单的数据交互,对性能要求不是特别高,且数据结构相对固定,RESTful 架构可能是一个不错的选择,因为它简单易懂,易于实现和调试,一个简单的博客系统或小型电商网站后台管理系统可以采用 RESTful API,如果项目对性能要求极高,需要在分布式系统中进行高效的远程调用,并且能够承受一定的接口变更成本,RPC 架构可能更适合,比如大型互联网公司的内部服务之间通信,或者对响应时间要求苛刻的金融交易系统,而对于需要灵活获取数据、满足多样化查询需求的场景,如社交网络应用、复杂的数据分析平台等,GraphQL 架构则具有优势,它可以让客户端精确地获取所需的数据,减少数据传输量和网络请求次数,还要考虑团队的技术栈和经验,如果团队熟悉某种特定的架构和技术,那么在选择时也会倾向于使用熟悉的方案,这样可以降低开发难度和风险,提高开发效率。
API 网关在 API 架构中起到了哪些关键作用?
解答:API 网关在 API 架构中起着至关重要的作用,它实现了请求路由功能,根据请求的 URL、HTTP 方法等信息准确地将请求转发到对应的后端服务,这使得后端服务的部署和管理更加灵活,可以根据业务需求进行服务的拆分和扩展,而客户端只需知道 API 网关的地址即可访问所有的服务,API 网关提供了负载均衡功能,在多个后端服务实例之间合理地分配请求,避免某个服务实例因负载过高而出现性能问题,提高了系统的可用性和稳定性,安全认证与授权是 API 网关的重要职责之一,它可以对请求进行身份验证,确保只有合法的用户才能访问 API,同时根据用户的角色和权限配置进行授权管理,防止未经授权的访问和数据泄露,API 网关还可以进行流量控制,通过设置每秒请求数限制、并发连接数限制等参数,保护后端服务免受恶意攻击或突发的高流量冲击,确保系统的
各位小伙伴们,我刚刚为大家分享了有关“api 的架构”的知识,希望对你们有所帮助。如果您还有其他相关问题需要解决,欢迎随时提出哦!
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复