前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >从API迭代中解放!GraphQL的优缺点与团队价值

从API迭代中解放!GraphQL的优缺点与团队价值

原创
作者头像
味笼
修改于 2023-02-20 02:21:00
修改于 2023-02-20 02:21:00
3.6K0
举报

facebook推出的GraphQL,是一个特点非常鲜明的API查询语言。与SQL类似,GraphQL是一套规范,具体实现有很多框架。对前端而言,可以想使用SQL一样(比SQL简单且安全)可以直接获取自己所需要的数据,对于后端而言,节省了接口升级的开发成本,非常适用于快速迭代,或者多页面接口的业务。

本文会详细论述GraphQL的优缺点以及使用边界,以及对开发团队带来的价值。

1. 核心价值点介绍

1.1 核心特点

GraphQL的核心如下:

  1. 自由增减字段
  2. 一个请求可以保护多个资源

如图所示,左边的调用,只请求了hero的name字段。如果需要请求hero的height和mass字段,只需要简单添加就好。

从调用方的角度,可以非常方便且自由地增加查询字段。

从左边的调用图来看,请求了hero的friends成员,里面包含多个对象。如右图所示,可以很方便地聚合返回

1.2. 核心理念:所取即所得

所取即所得,展开来讲就是:『一次』请求,『只得』所需

首先来看 『一次请求』代表的含义:

如图,一次请求的含义有2点:

  1. 单一入口:后端聚合请求,减少网络带宽
  2. 数据聚合:前端避免组装数据

其次来看『只得所需』的含义:

如图所示,请求方参数自由增减,GraphQL控制不重不漏。

2. 团队价值

2.1 开发价值——前端

对于前端开发人员,主要有以下3个价值:

  1. 避免多请求组装数据
  2. 避免过度获取数据
  3. 易于独立mock测试

举个例子来说明:

对于一个博客的用户主页, 只展示如下数据:

  1. 用户昵称
  2. 用户文章列表 (仅标题)
  3. 用户follower列表 (仅昵称)

传统的REST流程如下图,需要请求3次,得到不同的数据,还需要筛选组装成最终展示的数据。

而使用GraphQL,则只需要1次请求就可以实现这个功能:

对前端同学是不是非常友好?除此之外,因为只需要关注自己需要的数据,对于前端同学而言,非常方便mock,无需依赖后端开发提供接口。

2.2 开发价值——后端

对应后端开发同学而言,也有如下的价值:

  1. 减少针对性API设计
  2. 业务迭代时,修改方便
  3. 便捷文档(Code As Doc)

减少针对性API设计这点,主要体现在,比如针对『不同前端展示的字段不同』这类需求,传统做法是,用如下不同的URL来区分

代码语言:txt
AI代码解释
复制
-  api/app
-  api/miniapp

而使用GraphQL,后端不需要改变/新增接口,前端可以通过自定义请求参数来控制返回的数据。

同时,在业务迭代时,修改起来非常方便。

传统做法是使用如下方式做区分。

代码语言:txt
AI代码解释
复制
- api/app
- apiv2/app

如果使用GraphQL,后端无需变更协议,只需要在原来的接口增加字段就好,前端只需要请求新字段就好,不请求无效的字段就能实现接口更新。

GraphQL的开发形式,跟方便后端实现便捷的文档(Code As Doc),如图,只需要注释就可以描述此接口的功能:

在新业务快速开发时,文档总是落后版本。GraphQL实现了数据聚合,从而做到接口即文档。

2.3 业务价值

对于业务的价值如下:

  1. 两端接口定义更方便理解
  2. 前端扩张数据控制权
  3. 后端从接口适配中解放

GraphQL的灵活性,决定了前端无需与后台对齐接口,就可以开发。后台只需要在确定好的接口上提供数据就好,减少沟通成本。

基于上述的灵活性,前端对数据的控制权得到了增强,由原本的被动拼接,到GraphQL的主动定义,便于前端更理解业务,以及快速实现想法。

这种灵活性也是利好后端的,可以让后端不必频繁变更接口,也节省了Mock和粘合数据的时间,从而有更多时间关注底层涉及。

3. 缺点与挑战

  1. 业务重构困难
  2. 性能瓶颈
  3. 通用框架缺乏

把业务重构成GraphQL模式比较困难,因为要改造整个接口,所以不建议旧服务强行改造。

同时,因为全部通过 GraphQL Server 请求,也容易存在性能瓶颈。

由于GraphQL是单入口,现有的常用的组件框架不一定适配。如果团队要使用GraphQL的话,也需要为其配备专门的鉴权、缓存等组件框架,目前这方面生态只能说勉强够用,在内部使用比较方便,如果对外商用的话,可能需要重新设计一套标准。

4. 使用边界

评估业务是否需要使用GraphQL,首先最好有以下需求:

  1. 为团队赋能
  2. 多端展示
    • 后端提供所有数据字段的CUDR
    • 每个终端根据自己的需求请求对应的数据字段
  3. 业务迭代快
    • GraphQL可以很好地解决Web端的版本迭代问题
    • 对于移动端,GraphQL的版本控制不足
      • 新旧业务不分离时,除非强迫客户端升级,否则只能无限期支持废弃字段

同时团队也要有如下条件:

  1. 足够的辅助框架建设水平
  2. 数据结构适配GraphQL

数据结构适配GraphQL主要是一下几点:

  1. 不支持直接传输文件、视频等数据
  2. 数据量过大导致的性能瓶颈
  3. 业务的数据需适配GraphQL的『图』,避免出现递归查询
    • 数据库的设计
    • 依赖服务的设计
    • 可能存在的字段重复和冲突
复杂的数据结构
复杂的数据结构

参考

GraphQL party

大会PPT

GraphQL 聚合层解放前后端

面对极度复杂的前后端业务场景,使用 GraphQL 正确的姿势

一位前端专家构建GraphQL工程的心路历程

宋小菜技术的领域驱动设计(DDD)实践分享

GraphQL 为何没有火起来?

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
Kotlin---协程的使用
在使用协程之前,需要保证Kotlin-Gradle-Plugin的版本高于1.3。目前最高的版本为1.3.11。否则编译会报错
None_Ling
2019/02/25
1.4K0
Coroutine(协程)(一)
Coroutine是kotlin官方文档上推荐的,个人理解,其实就是一个轻量级的线程库。当然,协程并不是线程.简单来说,线程(thread)的调度是由操作系统负责,线程的睡眠、等待、唤醒的时机是由操作系统控制,开发者无法决定。使用协程,开发者可以自行控制切换的时机,可以在一个函数执行到一半的时候中断执行,让出CPU,在需要的时候再回到中断点继续执行。因为切换的时机是由开发者来决定的,就可以结合业务的需求来实现一些高级的特性。
提莫队长
2021/03/04
8840
Kotlin语言基础入门到熟悉:Kotlin协程基础
delay是非阻塞的,Thread.sleep是阻塞的。显式使用 runBlocking 协程构建器来阻塞。
Android_anzi
2022/02/22
8350
Kotlin 并发编程之"协程"
Kotlin, as a language, provides only minimal low-level APIs in its standard library to enable various other libraries to utilize coroutines. Unlike many other languages with similar capabilities, async and await are not keywords in Kotlin and are not even part of its standard library. Moreover, Kotlin's concept of suspending function provides a safer and less error-prone abstraction for asynchronous operations than futures and promises.
一个会写诗的程序员
2019/07/14
9430
《Kotin 极简教程》第9章 轻量级线程:协程(1)
在常用的并发模型中,多进程、多线程、分布式是最普遍的,不过近些年来逐渐有一些语言以first-class或者library的形式提供对基于协程的并发模型的支持。其中比较典型的有Scheme、Lua、Python、Perl、Go等以first-class的方式提供对协程的支持。
一个会写诗的程序员
2018/08/17
1.2K0
Kotlin协程-协程派发和调度框架
一个coroutine创建好之后,就交给协程框架去调度了。这篇主要讲从launch{...}开始,到最终得到执行的时候,所涉及到的协程框架内部概念。
PhoenixZheng
2021/04/26
1.1K0
Kotlin中的协程及在Android中的应用
Kotlin的一个协程可以理解为是运行在线程上的一个执行任务并且该任务可以在不同的线程间切换,一个线程可以同时运行多个协程。
码客说
2024/03/29
3960
Kotlin协程-特殊的阻塞协程
阻塞协程是种特殊的协程启动方式,一般是用 runBlocking{} 扩起来一段协程。
PhoenixZheng
2021/05/17
2.5K0
Kotlin 协程之Practice
Kotlin 练习参考https://www.kotlincn.net/docs/reference/
Yif
2019/12/26
1.2K0
Kotlin 协程的上下文和调度器介绍-Dispatchers
协程的上下文通常是CoroutineContext类型为代表。这个类型是被定义在Kotlin的标准库中。
zinyan.com
2023/07/13
5090
Kotlin 协程的上下文和调度器介绍-Dispatchers
Kotlin | 协程使用手册(不间断更新)
在概念上,async 就类似于 launch。它启动了一个单独的协程,这是一个轻量级的线程并与其它所有的协程一起并发的工作。不同之处在于 launch 返回一个 Job 并且不附带任何结果值,而 async 返回一个 Deferred —— 一个轻量级的非阻塞 future, 这代表了一个将会在稍后提供结果的 promise。你可以使用 .await() 在一个延期的值上得到它的最终结果, 但是 Deferred 也是一个 Job,所以如果需要的话,你可以取消它。
Petterp
2022/02/09
2.5K0
Kotlin | 协程使用手册(不间断更新)
Kotlin 协程-暂停与取消
我们在进行开发的过程中。往往会由于各种需求会需要控制后台协程的细粒度。比如,界面关闭了。那么在这个界面中启动的协程已经不需要再执行了。
zinyan.com
2023/07/14
9410
Kotlin 协程-暂停与取消
kotlin--协程的启动和取消
launch:我们之前已经使用过了GlobalScope的launch来启动协程,它返回一个Job async:返回一个Deferred,它也是一个Job,但是可以使用await函数获得运行的结果 除了之前结构化并发中介绍的几种指定CoroutineScope的API外,我们还可以使用runBlocking函数来指定CoroutineScope,他会使用主线程来转换成协程 launch和async内如果有子协程,那么该协程会等待子协程执行结束
aruba
2021/12/06
1.1K0
kotlin--协程的启动和取消
android之GlobalScope(协程)使用介绍
协程(Coroutines)是一种比线程更加轻量级的存在,正如一个进程可以拥有多个线程一样,一个线程可以拥有多个协程。
李小白是一只喵
2021/01/21
2.6K0
Kotlin协程-一个协程的生命周期
在安卓或者kotlin平台上使用协程是很简单的一件事情。举一个最简单的例子,不依赖安卓平台的协程代码,
PhoenixZheng
2021/04/26
1K0
Kotlin协程-一个协程的生命周期
Coroutine(协程)和retrofit
Coroutine是kotlin官方文档上推荐的,个人理解,其实就是一个轻量级的线程库 使用前加依赖
提莫队长
2020/06/02
1.4K0
kotlin 协程入门教程
链接:https://juejin.cn/post/7370994785655767067
Rouse
2024/05/28
2480
kotlin 协程入门教程
6个Android Kotlin协程相关面试题
解答: runBlocking是一个协程构建器,它会立即启动协程并在当前线程阻塞,直到协程执行完成。这通常用于主函数或测试中,以同步方式执行异步代码。然而,runBlocking在Android中可能会导致主线程阻塞,从而影响UI的响应性,因此应谨慎使用。
AntDream
2024/11/19
4750
6个Android Kotlin协程相关面试题
Kotlin---使用协程的异步
协程与协程间不能直接通过变量来访问数据,会导致数据原子性的问题,所以协程提供了一套Channel机制来在协程间传递数据。
None_Ling
2019/02/25
2.9K0
kotlin--协程上下文、异常处理
当我们在a协程延迟函数100ms之前开启一个子协程b,b做了200ms的事情,如果不考虑调度消耗的时间,那么a协程的生命也会延长成200ms
aruba
2021/12/06
9770
kotlin--协程上下文、异常处理
推荐阅读
相关推荐
Kotlin---协程的使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档