简单介绍下GraphQL:

GraphQL是一种基于api的查询语言,它提供了一种更高效、强大和灵活的数据提供方式。它是由Facebook开发和开源,目前由来自世界各地的大公司和个人维护。

据说已经在FB内部大量使用了,所以在工程界大家不用担心成为小白鼠了,但是用好相信也是个漫长的过程,需要结合自己业务特点和系统特点慢慢来。

其实一提到QL,你就可以知道他是某种DSL类似的领域语言,本身肯定存在一定的切换成本。

GraphQL在业界主要解决的对手就是Rest API,我们知道Rest API需要遵循一定的设计原则,比如:

https://localhost:8080/person
https://localhost:8080/person/{id}

针对于具体的业务场景设计对应的endpoint。

这种使用方案带来的最大挑战在于,大前端的业态下,随着客户端需求的快速迭代,功能也越来越复杂,需要提供的接口也越来越多。如何优雅的维护接口的稳定性,设计扩展性满足将来一定的业务需求变更,一直是从事服务端接口开发工程师需要不断思考的问题。

而客户端最可怕的一点,因为代码固化到用户手机上,只要有老版本APP在使用某个接口,你后端这个接口就不能下掉,代码就需要一直在,时间久了,屋子里面堆满了脏袜子,充斥着代码的臭味道,每次都需要捏着鼻子写代码。

业务的不断发展,带来了接口维护成本,一个原因在于这里API接口的设计承担了数据表示的职责:为前端的UI/UX提供展现所需要的数据。比如APP上的个人中心页面,UI/UX需要展现昵称,头像,性别的数据,这是一个来自UI/UX对数据接口返回的需求。

有没有可能将来自UI/UX的需求尽量控制在UI/UX的实现端(客户端)从而减少UI展示层的逻辑变化的复杂度对后端接口的影响呢?

答案是使用GraphQL。

Facebook在接入层添加了一层GraphQL的查询语言。

使用GraphQL,我们可以按需获取数据。同时由于QL语言可以迭代,这样很多需求可以基于原有接口上进行升级,这种升级体现在修改QL上,而不是需要后端修改追加新需求参数。

所以GraphQL专注于在客户端进行数据建模。

Rest VS GraphQL:

GraphQL可以通过一个统一的HTTP API接口来传递数据:

通过文本描述数据请求需求,接口返回匹配需求的数据。

如图,行1~8为客户端请求的GraphQL形式的需求描述,该请求查询id为1的作者的名字,以及要求返回其关联的id为5的一本书的标题;行10~21为对应的匹配客户端数据需求的返回。在这里我们可以看到,客户端有了表达自身数据需求的灵活性。类似的GraphQL中也定义了对数据进行修改的语法。

在项目中使用GraphQL有两种方式,一种是API方式,一种是资源文件方式。

我个人喜欢使用第二种,首先遵循我个人软件设计方法论中的“分离原则”,符合“分离原则”中的“配置与运行分离”。

Demo如下:

想在原有Controller上使用GraphQL,也比较简单,只需要继承GraphQLQueryResolver接口就可以了:

通过GraphQL解决原有Rest API升级不友好,维护不友好的问题之后。其实我们整个API在管理上还存在另一个挑战,就是API泛滥。

API泛滥之后,我们就很难知道哪些接口提供了哪些能力,甚至是哪些字段。常见的管理方式是类似于wiki的管理,但是wiki在哪?怎么找到又是另一个问题。

所以API文档管理不仅仅是“写死”在文档上,而是如何让API“动”起来。

什么意思呢?就是说一个API落地之后,是否可以按照后续迭代的过程不断去进行相应的API维护,让整个生命周期“动”起来。

关于如何处理这个“动”,其实有两种方案,一种是靠人,一种是靠工具。

对于我这种信奉工具与自动化的人来说,肯定是靠工具了。

那么如何通过工具将API接口“动”起来呢?

方式就有很多了,比如编译期,部署期,流量期等不同生命周期进行控制。

其实再往后想一想,客户端哪个View联动哪个API这个应该怎么搞呢?

当然是主动下发+被动上报了,这样我们可以将API管理进行流量闭环,从而完成对于API的生命周期管理,以及实现API“动”起来的目标了。

我们准备在网关中支持GrahpQL了相关推荐

  1. BlueTooth: 嵌入式蓝牙网关中蓝牙驱动层研究与实现

    0.引言 随着智能终端设备的不断增多,用来连接各种笔记本.PDA.台式电脑等设备的电缆布线会越来越复杂,它不 仅影响了美观性,还增加了安装.维护的费用和难度,蓝牙技术是解决上述问题的有效途径之一,家庭 ...

  2. Nacos 在 Apache APISIX API 网关中的服务发现实践

    Apache APISIX 是一个动态.实时.高性能的 API 网关,提供负载均衡.动态上游.灰度发布.服务熔断.身份认证.可观测性等丰富的流量管理功能.它不仅拥有众多实用的插件,而且支持插件动态变更 ...

  3. 如何在gateway网关中聚合swagger

    前言 由于项目原因,需要将网关从zuul升级到gateway网关,由于 gateway网关底层是基于webflux的,导致原先在网关中集成的swagger不可用. 那么如何在gateway网关中整合s ...

  4. SpreadJS 在 Angular2 中支持绑定哪些属性?

    SpreadJS 纯前端表格控件是基于 HTML5 的 JavaScript 电子表格和网格功能控件,提供了完备的公式引擎.排序.过滤.输入控件.数据可视化.Excel 导入/导出等功能,适用于 .N ...

  5. [转]使用 .NET Framework 2.0 在您的应用程序中支持证书

    NET 安全 使用 .NET Framework 2.0 在您的应用程序中支持证书 Dominick Baier 本文讨论: Windows 证书存储区 .NET 中的证书类 验证.SSL.Web 服 ...

  6. 在PHPStorm中支持ThinkPHP代码提示

    在phpstorm中开发ThinkPHP应用程序时,没有代码提示,困扰了很长时间,后来参考网上一些关于在phpstorm中支持YII框架代码提示的相关帖子,尝试在ThinkPHP中进行测试,目前测试成 ...

  7. 服务化改造实践 | 如何在 Dubbo 中支持 REST

    什么是 REST REST 是 Roy Thomas Fielding [[1]](#fn1) 在 2000 年他的博士论文 [[2]](#fn2) "架构风格以及基于网络的软件架构设计&q ...

  8. Golang中支持可变参数

    Golang中支持可变参数 (如果你希望函数带有可变数量的参数) package main import "fmt" //定义一个函数,函数的参数为:可变参数 ... 参数的数量可 ...

  9. 服务化改造实践 | 如何在 Dubbo 中支持 REST 1

    什么是 REST REST 是 Roy Thomas Fielding [[1]](#fn1) 在 2000 年他的博士论文 [[2]](#fn2) "架构风格以及基于网络的软件架构设计&q ...

最新文章

  1. proc除了能用于oracle开发_能不能用于mysql开发_Oracle数据库开发(二).Linux下配置使用ProC...
  2. ASP.NET中App_Code,App_Data等文件夹的作用转
  3. 条款七 为多态基类声明virtual析构函数
  4. 在JAVA中如何检查字符串日期的合法性
  5. 玩Weld-Probe –一站式查看CDI的所有方面
  6. 分布式搜索elasticsearch
  7. 使用补丁修改DSDT/SSDT [DSDT/SSDT综合教程]
  8. node2vec的一些理解
  9. Meterpreter命令详解
  10. 华为vlan简单配置
  11. PS 渐变工具(锥形【线性渐变】和圆形【径向渐变】)
  12. 禁止搜索引擎收录网站内容,百度,谷歌,所有等...
  13. python怎么打e,python e怎么表示
  14. 高通625系列-MSM8953 (Cortex-A53架构)
  15. org.dom4j.DocumentException: 1 字节的 UTF-8 序列的字节 1 无效。
  16. 怎么求最大公因数和最小公倍数
  17. 实现计算机联网的最大好处是,职.称计算机考试多项选择题考试卷模拟考试题...
  18. python降低图片分辨率怎么调_使用PIL调整图片分辨率
  19. 单链表的头尾插法详解
  20. 解决maven项目-Dmaven.multiModuleProjectDirectory报错

热门文章

  1. linux端口找进程,Linux查看端口、进程情况及kill进程的方法
  2. C#里XML(JSON)序列化时,自动隐藏值为Null的成员的输出
  3. Java数据结构与算法(一) 数组
  4. Node.js + Express 4.x + MongoDB 构建登录注册-简易用户管理(四)
  5. javaweb学习总结——Filter高级开发
  6. 提高性能:用RequireJS优化Wijmo Web页面
  7. 关于DSP的GPIO的输入输出设置
  8. css3弹性盒子模型之box-flex(--)
  9. Struts-Logic 标签库
  10. GirdView的文本属性对象省略溢出标记设置