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

news2024/11/27 5:26:43

关于使用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.coloradmin.cn/o/1578250.html

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

相关文章

牛顿:Archetype AI 的开创性模型,实时解读真实世界的新宠儿

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

表格比对作业指导书 使用access对excel表格数据进行比对

初级代码游戏的专栏介绍与文章目录-CSDN博客 (注:这是以前给秘书写的作业指导书,用来处理两个表格中哪些人存在、哪些人不存在。看起来当时使用的access版本是2016。access是微软office套件中的一个软件,存在于家庭版&#xff0c…

CSS变换

CSS变换 根据 CSS 的变换的功能特性,它可以分为位移、旋转、缩放、倾斜和透视: 也可以分成2D变换和3D变换,2D变换是二维平面上进行的,即 X 轴和 Y 轴。这些变换不涉及 Z 轴。3D 变换允许元素在三维空间中进行操作,这些…

系统架构评估_3.ATAM方法

架构权衡分析方法(Architecture Tradeoff Analysis Method,ATAM)是在SAAM的基础发展起来的,主要针对性能、实用性、安全性和可修改性,在系统开发之前,对这些质量属性进行评价和折中。 (1&#x…

K8s学习十(高级调度)

高级调度 CronJob计划任务 在 k8s 中周期性运行计划任务,与 linux 中的 crontab 相同注意点:CronJob 执行的时间是 controller-manager 的时间,所以一定要确保 controller-manager 时间是准确的cron表达式如下: 配置如下&#x…

提高网站安全性,漏洞扫描能带来什么帮助

随着互联网的蓬勃发展,网站已经成为人们获取信息、交流思想、开展业务的重要平台。然而,与之伴随的是日益严重的网络安全问题,包括恶意攻击、数据泄露、隐私侵犯等。 为了保障网站的安全性,提前做好网站的安全检测非常有必要&…

基于Springboot+Vue实现前后端分离酒店管理系统

一、🚀选题背景介绍 📚推荐理由: 近几年来,随着各行各业计算机智能化管理的转型,以及人们经济实力的提升,人们对于酒店住宿的需求不断的提升,用户的增多导致酒店管理信息的不断增多,…

[计算机网络] 当输入网址到网页

HTTP 首先,对URL进行解析,URL包含了Web服务器和对应的文件(文件路径) URL是请求服务器中的文件资源 通过Web服务器和对应文件来生产HTTP包(超文本传输协议) DNS 根据域名查询对应的IP地址 域名的层级 根…

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

文章目录 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.…

vue vue3 日期选择的组件,封装组件

一、背景 基于element日期选择组件,自行封装了一个组件。 以下是达到的效果: 1.选择年,日期选择组件默认填充是:当时的年; 2.选择月,日期选择组件默认填充的是:当时的年月; 3.选择日…

从人机界面设计黄金三法则视角看 ChatGPT 的界面设计的“好”与“坏”

热门文章推荐: (1)《为什么很多人工作 3 年 却只有 1 年经验?》(2)《一文掌握大模型提示词技巧:从战略到战术巧》(3)《AI 时代,程序员的出路在何方&#xff1…

window安装c环境(window安装GCC)

1.下载mingw 地址:MinGW - Minimalist GNU for Windows - Browse Files at SourceForge.net 2.安装mingw-get-setup.exe文件: 安装完成之后显示: 3.勾选需要安装的内容,然后进行安装或按第5步使用命令安装,推荐使用5步…

华为USG6000v

1、安全区域 一个及或多个接口的集合 默认的安全区域 Trust --- 优先级85,一般连接内网 Untrust --- 优先级5, 一般连接外网 Dmz --- 优先级50,一般连接服务器、 Local --- 优先级100,防火墙接口所在区的区域 2…

在Ubuntu系统下连接远程Ubuntu服务器

本篇文章介绍,如何在Ubuntu系统下连接远程Ubuntu系统并传输文件。 一. 连接远程Ubuntu服务器。 1. 打开命令行,输入 : sudo apt-get update , 对系统进行更新。 2. 安装 OpenSSH Server,输入 : sudo apt-get insta…

mysql 运算符 语句 字符集 校队集

mysql 运算符 使用select语句可以输出运算的结果 mysql标识符不区分大小写 算数运算符 1./除法 得到的结果是一个小数 %是整数,省略小数 2、除以0不会报错,得到的结果是 null 3.数宇和字符串做加法运算,并不会拼接 比较运算符 1.mysql里面的=是比较运算符,而不是赋值运算…

深入解析template,掌握C++模板的精髓!

掌握C模板(template)的优雅之道! 一、什么是模板?二、模板如何工作?三、C 中的模板类型3.1、 类模板3.2、 函数模板 四、模板参数推导4.1、模板参数推导示例4.2、函数模板参数推导4.3、类模板参数推导(C17 …

《C语言深度解剖》(4):深入理解一维数组和二维数组

🤡博客主页:醉竺 🥰本文专栏:《C语言深度解剖》 😻欢迎关注:感谢大家的点赞评论关注,祝您学有所成! ✨✨💜💛想要学习更多数据结构与算法点击专栏链接查看&am…

Blender怎么样启动默认移动和Cavity效果

在使用Blender的过程中,有一些特殊的技巧很重要。 比如默认地设置blender打开时,就是移动物体,这样怎么样设置的呢? 需要在界面里打开下面的菜单: 这样就找到默认设置的地方,把下面的移动勾选起来,这样点…

IEEE Robotics and Automation Letters(RAL)论文模板及投稿须知

一、背景 IEEE Robotics and Automation Letters(RAL)期刊自2015年6月1日创刊以来,得到了机器人领域许多学术大牛的青睐,因其周期短,论文质量高,许多优秀的成果都会选择发表在RAL期刊上。下面介绍一下RAL论…

如何从零基础进入IT行业

目录 前言1 确定适合的方向1.1 前端开发1.2 后端开发1.3 数据分析1.4 软件测试1.5 产品管理1.6 网络与系统管理 2 制定学习计划2.1 学习基础知识2.2 选择合适的学习资源2.3 参加课程或培训2.4 制定学习计划和目标 3 实践项目和参与社区3.1 构建个人项目3.2 参与开源社区3.3 寻找…