为什么 GraphQL 是构建微服务的更好选择

关于使用REST还是GraphQL来构建微服务哪个更好,一直存在争论。这两种技术都有其支持者和批评者,但当涉及微服务架构的特定需求时,GraphQL 成为明显的领先者。原因如下。

了解 RESTful 的关注点

虽然 REST 多年来一直是首选 API 风格,因其简单性和普遍适用性而受到赞誉,但它的局限性在微服务环境中变得非常明显。这些限制包括:

  • 过度获取数据
  • 对相关数据的多个 HTTP 请求
  • 复杂的版本控制策略

此类问题可能会阻碍微服务架构的性能和可扩展性。

过度获取数据: REST API 旨在返回一组固定的数据,这通常会导致过度获取。这种冗余在移动网络中尤其成问题,其中每个额外的数据字节都可能导致应用程序变慢并降低用户体验。

例如,假设我们有一个 REST API 端点/api/user/{userId},它为用户返回以下数据:

在移动应用程序仅需要特定用户详细信息(例如姓名和电子邮件)来进行个人资料概述的情况下,获取全面的用户数据意味着过度获取。

对于数据计划有限的用户来说,过多的数据使用可能会带来高昂的成本,并导致应用程序性能变慢和用户体验下降。

延迟和 N+1 问题:微服务通常需要将数据分布在多个服务中。

假设您有一个电子商务应用程序,其中订单域处理产品、客户、订单和退货实体,库存域管理产品、库存、仓库和交货实体。常见的操作可能是显示订单详细信息以及每种产品的当前库存状态。

假设我们有一个订单微服务和一个股票微服务来处理订单和股票。

在我们的场景中,客户下了三个订单 (N=3),每个订单包含四种不同的产品。为了显示订单详细信息以及每种产品的库存状态,应用程序首先发出一个获取订单的请求。然后,对于每个订单中的每个产品,它向库存微服务发出额外的请求以检索库存信息。这会产生一个初始请求,加上 12 个后续请求(三个订单乘以每个订单四个产品),总共 13 个 API 调用。由于多次往返时间 (RTT) 以及网络和服务器负载的增加,请求的成倍增加会导致更高的延迟,体现了 N+1 问题。

版本控制挑战:随着时间的推移维护 REST API 涉及复杂的版本控制策略,例如引入新端点或在 API 路径中嵌入版本号。这可能会导致臃肿和混乱,使 API 开发和使用变得复杂。

GraphQL 的优势

GraphQL解决了许多 REST 弱点。

领域驱动设计:微服务依靠领域驱动设计蓬勃发展,其中每项服务都是围绕特定业务功能构建的。 GraphQL 以模式为中心的方法与此完美契合,为微服务提供了更有组织、更连贯的结构。

统一模式:在微服务架构中,每个服务可能都有自己的模式,代表业务领域的一部分。 GraphQL 的突出之处在于允许将这些模式组合或缝合在一起,为客户端提供统一的界面。这意味着客户端可以在单个请求中从多个服务查询数据,从而大大降低网络调用的复杂性和数量。

解决N+1问题: GraphQL能够通过单个请求获取数据,无论需要调用多少个底层服务,直接解决了REST架构固有的N+1问题。这不仅提高了性能,还简化了客户端数据获取逻辑。

对于前面描述的N+1问题,如果服务支持GraphQL,则可以使用它在单个查询中获取嵌套数据,有效解决N+1问题。

效率和性能:通过允许客户端准确指定他们需要的数据,GraphQL 消除了 REST API 中常见的过度获取和获取不足的问题。这将带来更高效的数据检索、更少的带宽使用以及更快的应用程序,在移动环境中尤其明显。

在早期的场景中,移动应用程序仅需要特定的用户详细信息(例如姓名和电子邮件)来进行个人资料概述,客户可以仅请求姓名和电子邮件。

简化版本控制:与 REST 不同,GraphQL 允许将新字段和类型添加到架构中而不影响现有查询,从而减少了版本控制的需求。这种向前兼容性意味着客户端和服务器可以随着时间的推移更加平滑地发展。如今,GraphQL 已成为一项成熟的技术,可满足传统 REST API 无法完全满足的现代 Web 开发中的特定需求。其设计提高了效率、灵活性和开发人员的生产力。

展望未来,GraphQL 的未来是光明的,社区驱动的努力专注于解决其当前的局限性,特别是在安全性、性能和标准化方面。随着这些努力取得成果,GraphQL 的采用范围预计将扩大,巩固其作为 API 领域关键技术的地位。

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

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

相关文章

蓝桥杯 历届真题 时间显示【第十二届】【省赛】【C组】

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s #include<bits/stdc.h> #define int long long using namespace std; const int N 1e510; int n,m,t,d; int a[2][N],b[N]; //…

数据库关系模式三元及以上分解无损连接判断(表格法)

例题 1.首先构造初始表&#xff0c;如下表所示。 A B C D E ABC a1 a2 a3 b14 b15 CD b21 b22 a3 a4 b15 DE b31 b32 b33 a4 a5 2.遍历函数依赖&#xff0c;对AB→C&#xff0c;因各元组的第一、二列没有相同的分量&#xff0c;所以表不改变。 3.由C→D…

chabot项目介绍

项目介绍 整体的目录如下所示&#xff1a; 上述的项目结构中出了model是必须的外&#xff0c;其他的都可以根据训练的代码参数传入进行调整&#xff0c;有些不需要一定存在data train.pkl:对原始训练语料进行tokenize之后的文件,存储一个list对象&#xff0c;list的每条数据表…

javaWeb物流信息网的设计与实现

摘要 本文讲述了基于JSP物流信息网的设计与实现。该系统使用java语言开发&#xff0c;使系统具有更好的平台性和可扩展性。 该系统实现了用户登录、注册、查询快递信息、快递公司注册成为合作伙伴以及系统管理员对信息进行管理等功能。系统的主要界面会将所有的服务排列好&…

【java基础-高级篇十】、注解

自定义目录 一、什么是注解二、常见的注解示例三、自定义 annotation四、JDK 中的元注解五、利用反射获取注解信息六、jdk8之后注解的新特性1、可重复注解2、类型注解 一、什么是注解 加在包,类, 构造器, 方法, 成员变量, 参数, 局部变量声明上面的特殊标记就称为注解未来的开…

力扣2- 两数相加

给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数都不会以 0 …

vmware和ubuntu的问题与解决

1.问题与对策 最近使用vmware安装ubuntu16和ubuntu20&#xff0c;遇到了挺多的问题&#xff0c;如下 ubuntu在用过多次后&#xff0c;重启后登录用户名后会出现花屏的现象。 解决方案如下 在键盘上同时按键&#xff1a;Ctrl Alt F4&#xff0c;进入命令行模式&#xff0c;…

基于深度学习的电动自行车头盔佩戴检测系统

文章目录 1. 文档说明2. 运行环境说明2.1 硬件配置2.2 软件配置2.3 程序依赖库 3. 基本环境配置3.1 软件安装3.1.1 集成开发环境安装与配置3.1.2 数据库安装与配置3.1.3 编程语言安装3.1.4 CUDA和cuDNN安装与配置3.1.5 机器学习库安装 3.2 依赖库安装 4. 运行程序资源下载地 1.…

Binder通信模型

Binder是Android最主要的进程间通信方式&#xff0c;下面简单认识一下它的通信模型&#xff0c;如下图所示 服务管理进程启动时会变成上下文管理者&#xff0c;在驱动层创建一个全局的binder_node对象binder_context_mgr_node记录进程信息&#xff0c;BpServiceManager中BpBind…

HarmonyOS实战开发-如何实现跨应用数据共享实例。

介绍 本示例实现了一个跨应用数据共享实例&#xff0c;分为联系人&#xff08;数据提供方&#xff09;和联系人助手&#xff08;数据使用方&#xff09;两部分&#xff1a;联系人支持联系人数据的增、删、改、查等功能&#xff1b;联系人助手支持同步联系人数据&#xff0c;当…

血细胞检测数据集 | 用于血细胞计数+检测的小规模数据集_已经整理成VOC格式_总共410张图

项目应用场景 面向血细胞检测计数数据集&#xff0c;已经整理成 VOC 格式&#xff0c;可以直接用于目标检测算法的训练&#xff0c;如 YOLO 等目标检测算法的训练。血细胞检测数据集图片质量好&#xff0c;可直接训练出一个血细胞检测模型&#xff0c;或者作为血细胞检测数据集…

AI智能分析盒子在工地的应用,提高工地管理效率和安全性

工地ai智能分析盒子是一种基于人工智能视觉分析技术的人工智能盒子&#xff0c;旨在提升工地作业区域的管理效率和保障作业人员的安全。通过最前沿的AI视觉算法、大数据&#xff0c;能够实时监控工地现场视频流画面&#xff0c;对施工工地人员的工作着装及日常作业行为进行规范…

1.C++编译过程

1.Linux 如何安装 C 编译环境 &#xff08;1&#xff09;安装 gcc 下载&#xff1a;sudo apt install gcc g 安装&#xff1a;gcc/g -v/--version其中 gcc 用于编译 C &#xff0c;g 用于编译 C 版本要 >4.8.5 这样才能使用 C11 的特性 &#xff08;2&#xff09; 使用…

【QT学习】4.对话框学习,浮动窗口,模态对话框,非模态对话框,消息框,文件对话框

1.浮动窗口 代码&#xff1a; //制作核心控件&#xff1a;文本编辑框QTextEdit* pTextEditnew QTextEdit;//制作浮动控件connect(pMenu1,&QMenu::triggered,[](QAction* pAction){qDebug()<<pAction->text()<<endl;if(pAction->text()"浮动控件&quo…

Vulnhub:DEVCONTAINER: 1

目录 信息收集 arp nmap nikto whatweb WEB 信息收集 dirmap 文件上传 提权 系统信息收集 横向提权 信息泄露 get root 信息收集 arp ┌──(root㉿ru)-[~/kali/vulnhub] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:50:56:2f:dd…

YUM仓库和编译安装

目录 一.YUM仓库搭建 1.简介&#xff1a; 2.搭建思路&#xff1a; 3.实验&#xff1a;单机yum的创建 二.编译安装 1.简介 2.安装过程 3.实验&#xff1a;编译安装nginx 一.YUM仓库搭建 1.简介&#xff1a; yum是一个基于RPM包&#xff08;是Red-Hat Package Manager红…

超级agent的端语言模型Octopus v2: On-device language model for super agent

大型语言模型&#xff08;LLMs&#xff09;在函数调用方面展现出卓越的应用潜力&#xff0c;特别是针对Android API的定制应用。与那些需要详尽描述潜在函数参数、有时甚至涉及数万个输入标记的检索增强生成&#xff08;RAG&#xff09;方法相比&#xff0c;Octopus-V2-2B在训练…

fastlio2 保存每帧的点云和每帧的里程计为单独的文件做后端回环优化和手动回环优化

为了 提供数据做后端回环优化和手动回环优化,需要保存每帧的点云和每帧的里程计为单独的文件,并且需要保存的名字为ros时间戳。 效果很好,比我自己写的手动回环模块好用 // This is an advanced implementation of the algorithm described in the // following paper: /…

ZLMediaKit ubantu 下编译

1、获取代码 #国内用户推荐从同步镜像网站gitee下载 git clone --depth 1 https://gitee.com/xia-chu/ZLMediaKit cd ZLMediaKit #千万不要忘记执行这句命令 git submodule update --init二、依赖库 Debian系(包括ubuntu&#xff09;系统下安装依赖的方法&#xff1a; #除了…

如何修改电脑用户名user后的名字

更改电脑用户名&#xff08;C:\Users\用户名&#xff09; 直接上步骤 1.WinR打开运行窗口&#xff0c;输入regedit&#xff0c;打开注册表&#xff0c;CtrlF搜索&#xff0c;找到ProfileList,这里会出现几个S-1-5开头的文件。 这里有一处注意的&#xff1a; 图片中的这个位置要…