GraphQL—构建多服务架构的数据层

简介

作为 Facebook 在 2015 年推出的查询语言,GraphQL 能够对 API 中的数据提供一套易于理解的完整描述,使得客户端能够更加准确的获得它需要的数据

现在的web系统大多是基于restful的,我们知道,REST强调以资源来划分系统,通过URL规范来操作相应的资源:

  • 一个系统中的资源有关联关系,通过URL规范就不太好定义一个很好的url接口

  • 每个操作都需要对应一个url接口

  • 前端在获取资源组合的数据展示时,需要请求好几个接口,然后自行组装数据

GraphQL则不同,它具有强大的表达能力,这主要还是来自于它完备的类型系统,它将整个 Web 服务中的全部资源看成一个有连接的图,而不是一个个资源孤岛,在访问任何资源时都可以通过资源之间的连接访问其它的资源。
GraphQL对外只提供一个接口,通过这个接口的body查询字段来灵活的获取各种数据。

Relay规范

GraphQL有自己的规范定义,用于制定一些通用的规则,称为Relay:

  • 提供能够重新获取对象的机制;

  • 提供对如何对连接进行分页的描述;

  • 标准化 mutation 请求,使它们变得更加可预测;

这些规范用来指导GraphQL服务器的实现

Schema

Schema 是任何 GraphQL 服务器实现的核心。它描述了连接到它的客户端应用程序可用的功能。我们可以使用任何编程语言来创建 GraphQL Schema 并围绕它构建一个接口。

GraphQL 运行时定义了一个通用的基于图的模式来发布它所代表的数据服务的功能。客户端应用程序可以在其能力范围内查询Schema。这种方法将客户端与服务器分离,并允许两者独立发展和扩展。

另外,在微服务架构下,多个微服务提供 Schema 时,我们需要通过一种机制将多个服务的 Schema 整合起来,这种整合 Schema 的思路最重要的就是需要解决服务之间的重复资源和冲突字段问题,如果多个服务需要同时提供同一个类型的基础资源

示例

下面我们通过这个在线网站来试用下GraphQL:https://swapi-graphql.netlify.app/?query=%7B%0A%20%20person(personID%3A%201)%20%7B%0A%20%20%20%20name%0A%20%20%7D%0A%7D

查询 personID 为 1 的 Person 并且只获取 name,gender 字段
查询条件:

{person(personID: 1) {name,gender}
}

结果输出:

{"data": {"person": {"name": "Luke Skywalker","gender": "male"}}
}

从上面查询案例中其实就可以发现,我只需要在 person 中写上想要获取的字段,GraphQL 便会返回带有该字段的数据。避免了返回结果中不必要的数据字段。

{person{ # 写上想获取的字段 }
}

如果想要其他其他的数据,不用像 Restful API 那样请求多条接口,依旧请求/graphql:
输入条件:

{person(personID: 1) {id,name,gender},planet(planetID:2) {id,name}
}

结果输出: 

{"data": {"person": {"id": "cGVvcGxlOjE=","name": "Luke Skywalker","gender": "male"},"planet": {"id": "cGxhbmV0czoy","name": "Alderaan"}}
}

从上面可以看出,GraphQL的查询语句有几个特性:

  • 按需取字段,不需要的字段可以不查询,类似于 SQL 里的 select

  • 在类型定义的基础上,可以关联查询多个类型的数据,类似于 SQL 里的 join(但不完全一样)

  • 可以递归的对某些字段进行理论上无限深度的查询

注意

把 GraphQL 当做一个网关来处理,负责对接底层的微服务。在一些 GraphQL 应用的场景里,随着接入的业务越来越多,GraphQL 的服务会逐步的变成一个非常庞大的单体应用,维护起来会越来越困难。另外所有的业务都聚合到这一个 GraphQL 的出口,可能光 Schema 定义就需要上万行。这样不论是维护还是使用上都很难进行下去,而且与现在主流的微服务架构体系相矛盾

业界目前最主流的解决方案是 Apollo GraphQL 提供的 GraphQL Federation 功能,并且 Netflix 在此基础上构建了一套 DGS (Domain GraphQL Service) 的架构来进行治理的

Golang实践

这里就不具体描述了,可以参考如下两个链接:
https://www.apollographql.com/blog/graphql/golang/using-graphql-with-golang/
https://github.com/graphql-go/graphql/tree/master

https://zhuanlan.zhihu.com/p/460593348
https://draveness.me/graphql-microservice/

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

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

相关文章

老HIS面临的问题总结

在从业的10余年时间,从事pb开发和教学多年,应朋友的要求,写一篇关于老his的问题,今天终于得空书写。老his自1995年立项至今已走过20余年,目前仍有上千家医院在使用,可以说它在医疗信息化水平的提升和行业人…

Python基础入门例程64-NP64 输出前三同学的成绩(元组)

最近的博文: Python基础入门例程63-NP63 修改报名名单(元组)-CSDN博客 Python基础入门例程62-NP62 运动会双人项目(元组)-CSDN博客 Python基础入门例程61-NP61 牛牛的矩阵相加(循环语句)-CSDN博客 目录 最近的博文: 描述

lvm 扩容根分区失败记录

lvm 扩容根分区失败记录 1、问题描述2、错误描述3、解决方法重启系统进入grub界面,选择kernel 2.x 启动系统。然后同样的resize2fs命令扩容成功。 1、问题描述 根分区不足。 系统有2个内核版本,一个是kernel 2.x,另一个是kernel 4.x。 这次l…

C语言剔除相关数(ZZULIOJ1204:剔除相关数)

题目描述 一个数与另一个数如果含有相同数字和个数的字符&#xff0c;则称两数相关。现有一堆乱七八糟的整数&#xff0c;里面可能充满了彼此相关的数&#xff0c;请你用一下手段&#xff0c;自动地将其剔除。 输入&#xff1a;多实例测试。每组数据包含一个n(n<1000)&#…

知行之桥EDI系统HTTP签名验证

本文简要概述如何在知行之桥EDI系统中使用 HTTP 签名身份验证&#xff0c;并将使用 CyberSource 作为该集成的示例。 API 概述 首字母缩略词 API 代表“应用程序编程接口”。这听起来可能很复杂&#xff0c;但真正归结为 API 是一种允许两个不同实体相互通信的软件。自开发以…

CSS 属性列表

CSS属性列表 序号 属性类别 属性 描述 1 动画属性 keyframes 定义一个动画,keyframes定义的动画名称用来被animation-name所使用。 2 animation 复合属性。检索或设置对象所应用的动画特效。 3 animation-name 检索或设置对象所应用的动画名称 ,必须与规则keyfra…

2023.11.25-电商项目建设业务学习1-指标,业务流程,核销

目录 1.指标分类(原子指标,派生指标,衍生指标) 2.一些业务名词 3.四大业务流程-销售需求 3.1-线上线下销售 3.2线上线下退款 4.四大业务流程-会员业务 5.四大业务流程-供应链业务 6.四大业务流程-商城业务 7.核销主题需求分析 1.指标分类(原子指标,派生指标,衍生指标) 原…

JVM类加载的过程和JVM垃圾回收机制

文章目录 一、JVM类加载的过程1.1类加载的基本流程1.1.1加载1.1.2验证1.1.3准备1.1.4解析1.1.5初始化 1.2双亲委派模型 二、JVM垃圾回收机制2.1找到垃圾2.1.1引用计数(比如Python&#xff0c;PHP中用到)2.1.2可达性分析(比如Java中用到) 2.2释放垃圾2.2.1标记清除2.2.2复制算法…

Nginx配置文件中的关键字是什么?详细解释来了

点击上方蓝字关注我 Nginx 是一款高性能的 Web 服务器软件&#xff0c;同时也是一款反向代理服务器软件。Nginx 的配置文件通常是 /etc/nginx/nginx.conf&#xff0c;以下是一个典型的配置文件&#xff0c;并对其中的关键字进行详细解释。 1. 配置文件 perlCopy codeuser ngin…

计算机编程零基础编程学什么语言,中文编程工具构件简介软件下载

计算机编程零基础编程学什么语言&#xff0c;中文编程工具构件简介软件下载 给大家分享一款中文编程工具&#xff0c;零基础轻松学编程&#xff0c;不需英语基础&#xff0c;编程工具可下载。 这款工具不但可以连接部分硬件&#xff0c;而且可以开发大型的软件&#xff0c;象如…

Redis集群(新)

1.什么是集群 Redis集群实现了对Redis的水平扩容&#xff0c;可实现并发写操作&#xff0c;启动n个redis节点&#xff0c;将数据分别存储在不同的节点中&#xff0c;每块节点负责不同区域的插槽&#xff0c;所以Redis集群通过分区来提供一定程度的可用性。 Redis集群现采用的是…

Oracle查询数据库中当前用户每个表的数据条数

Oracle查询数据库中当前用户每个表的数据条数 select t.table_name,t.num_rows from user_tables t一般情况下这条语句就可查出想要结果 如果不行 请执行以下脚本 create or replace function count_rows(table_name in varchar2,owner in varchar2 default null)return…

phonopy快速安装教程

Phonopy 是一个由 python编译实现的的晶体声子分析程序&#xff0c;是一款基于第一性原理进行声子计算的免费软件。它提供了 VASP 的 Wien2k 接口用来计算原子受力。它的主要功能有&#xff1a;计算声子色散谱&#xff1b;计算声子态密度&#xff0c;包括分立态密度&#xff1b…

EFAK-v3.0.1版部署与使用

一、前言 EFAK&#xff08;(Eagle For Apache Kafka&#xff0c;以前称为Kafka Eagle&#xff09;用于在使用 Topic 的情况下监控 Kafka 集群。包含Offset 的产生、Lag的变化、Partition的分布、Owner、Topic的创建以及修改的时间等信息。 二、环境&安装包 官方下载连接E…

php类中self、$this、static用法异同

self self 是一个指向当前类的静态引用&#xff0c;主要用于访问类的静态方法和属性。它不需要实例化类就可以使用&#xff0c;并且不能用于引用非静态成员。 class TestClass {public static $value "Hello, world!";public static function sayHello() {echo se…

Spring Boot 整合MyBatis-Plus 详解

MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 全新的 MyBatis-Plus 3.0 版本基于 JDK8&#xff0c;提供了 lambda 形…

积分球吸收光谱测量的领域有哪些?

积分球吸收光谱测量是一种常用的吸收光谱测量方法&#xff0c;它通过将样品放置在积分球的入口处&#xff0c;球内的光线经过多次反射后形成均匀的照度分布&#xff0c;然后使用光度计或光谱仪对光线进行测量&#xff0c;可以获得样品的相关参数。 在积分球吸收光谱测量中&…

ERROR: Could not find a version that satisfies the requirement torch

在windows 上安装pip install torch torchvision torchaudio 报错&#xff1a; ERROR: Could not find a version that satisfies the requirement torch (from versions: none) ERROR: No matching distribution found for torch 解决办法&#xff1a; 将python版本降到3.11…

十大排序之选择排序(详解)

文章目录 &#x1f412;个人主页&#x1f3c5;算法思维框架&#x1f4d6;前言&#xff1a; &#x1f380;选择排序 时间复杂度O(n^2)&#x1f387;1. 算法步骤思想&#x1f387;2.动画实现&#x1f387; 3.代码实现 &#x1f412;个人主页 &#x1f3c5;算法思维框架 &#x1f…

Qt文件读写详解

Qt 中的文件读写涉及到多个类和概念&#xff0c;以下是一些你需要掌握的关键知识点&#xff1a; 1. 文件路径和文件名&#xff1a; 了解文件路径的表示方式&#xff08;绝对路径和相对路径&#xff09;&#xff0c;以及文件名的命名规则&#xff08;特殊字符、长度限制等&…