首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

架构师该如何为应用选择合适的API

让我们研究一下GraphQL的设计原则。 查询是分层结构的,具有分层和嵌套字段,查询与响应数据一对一匹配。查询和响应的形状像树,可以查询每个项目的其他嵌套字段。...带有GraphQL的服务器结构必须是自包含的,或者可由GraphQL本身查询。...强类型的GraphQL模式使得代码可预测,并及早发现错误。 当然,GraphQL也不是没有缺点: 使用GraphQL,如果您需要查找有关列表或记录集合的信息,则处理起来会很棘手。...例如,如果您想获取包含其地址的用户列表的详细信息,则它将执行n + 1个查询。一个用于用户列表,然后n查询每个用户的地址。现在它会严重影响性能,因此必须非常小心地处理它。...在下图的微服务架构中,对外的服务采用了REST或者GraphQL的API,而内部微服务之间使用的是gRPC。 5.总结 好了,看了这么的API选择之后,我们做一个小结。

1.6K20

Coursera 的 GraphQL 之旅

我还记得当 Facebook 首次推出 GraphQL ,我们团队都兴奋不已——我们当即意识到 GraphQL 可以解决我们的很多问题,让我们可以在单次的请求中获取所有数据,并为我们的 API 提供结构化文档...幸运的是(或许还带有一点远见),我们的 REST 框架能给我们建立自动化层所需的一切: 我们架构中的每项服务均能够动态地为我们提供其运行的 REST 资源列表 对于单个资源,我们可以内省端点列表和参数...但是,我们最初的方案仅提供了 REST API 返回的模型与 GraphQL 返回的模型之间的一对一映射。...这样并没有将我们的资源真正地链接在一起,我们仍然会使用尽可能GraphQL 查询来获取数据,就像使用 REST API 一样。...schema 就会开始合并在一起——它们并非是能通过 GraphQL 获取的块小数据,而是由所有 Coursera 的数据和资源组成的网络。

1.2K40
您找到你想要的搜索结果了吗?
是的
没有找到

GraphQL到底怎么使?看看智联前端团队技术沉淀

这里的服务端不仅指网络服务,用 GraphQL 作为中间层数据引擎提供本地数据的获取也是可行的,GraphQL 规范并没有对数据源和获取方式加以限制。...而在研究 GraphQL 发生的的误解在于: 规范、教程提到 query(查询,无法确认是指客户端侧客户端发出的 Query Document 整个操作还是,Document 中的 query 操作...调用合并:经常提到的与 RESTful 相比较优的一点是,当需要获取多个关联数据,RESTful 接口往往需要多次调用(并发或串行),而基于 GraphQL 的接口调用则可以将调用顺序体现在结构化的查询中...强类型(字段校验):由于 JS 语言特性,强类型只能称为字段强类型校验(包括入参类型和返回结果),当数据源返回了比 Schema 或少的字段,并不会引发错误,而就算采用了 TypeScript 由于没有运行时校验...版本控制:客户端结构化的查询方式可以让服务追踪到字段的使用情况。且在增加字段,根据结构化查询按需查询的特点,不会影响旧的调用(虽然 JavaScript 对多了个字段的事情不在意)。

2.3K20

30分钟理解GraphQL核心概念

GraphQL实现文件上传接口,需要声明一个Upload标量来代表要上传的文件 总之,我们只需要记住,标量是GraphQL类型系统中最小的颗粒,关于它在GraphQL解析查询结果,我们还会再提及它。...总之,我们通过对象模型来构建GraphQL中关于一个数据模型的形状,同时还可以声明各个模型之间的内在关联(一对一对一或)。...的位置),它们的含义分别为: 列表本身为必填项,但其内部元素可以为空 列表本身可以为空,但是其内部元素为必填 列表本身和内部元素均为必填 我们进一步来更改上面的例子,假如我们又声明了一个新的Comment...我们按照字面意思来理解它们就好,如下: query(查询):当获取数据,应当选取Query类型 mutation(更改):当尝试修改数据,应当使用mutation类型 subscription(订阅...同时,还需要了解一些额外的查询概念,比如分页查询中涉及的Connection、Edge等。 大概就这么,如有错误,还望指正。

2K40

30分钟理解GraphQL核心概念

GraphQL实现文件上传接口,需要声明一个Upload标量来代表要上传的文件 总之,我们只需要记住,标量是GraphQL类型系统中最小的颗粒,关于它在GraphQL解析查询结果,我们还会再提及它。...总之,我们通过对象模型来构建GraphQL中关于一个数据模型的形状,同时还可以声明各个模型之间的内在关联(一对一对一或)。...的位置),它们的含义分别为: 列表本身为必填项,但其内部元素可以为空 列表本身可以为空,但是其内部元素为必填 列表本身和内部元素均为必填 我们进一步来更改上面的例子,假如我们又声明了一个新的Comment...我们按照字面意思来理解它们就好,如下: query(查询):当获取数据,应当选取Query类型 mutation(更改):当尝试修改数据,应当使用mutation类型 subscription(订阅...同时,还需要了解一些额外的查询概念,比如分页查询中涉及的Connection、Edge等。 大概就这么,如有错误,还望指正。

96720

GraphQL详解

如果没有那么成本来支撑改造,那么就不需要改造! 只有当原有需求发生变化,需要对原功能进行修改时,就可以换成GraphQL了。...GraphQL特点总结 声明式数据获取(可以对API进行查询): 声明式的数据查询带来了接口的精确返回,服务器会按数据查询的格式返回同样结构的 JSON 数据、真正照顾了客户端的灵活性。...Part 2 Schema & Type GraphQL支持的数据操作 GraphQL对数据支持的操作有: 查询(Query):获取数据的基本查询。...通过对象模型来构建GraphQL中关于一个数据模型的形状,同时还可以声明各个模型之间的内在关联(一对一对一或)。 对象类型的定义可以参考下图: 对象模型引入关联关系 是不是很方便呢?...比如: 列表:Type 非空:Type! 列表非空:Type! 非空列表列表内容类型非空:Type!! 在描述数据模型(模式Schema),就可以对字段施加限制条件。

2.5K00

我为什么要放弃RESTful,选择拥抱GraphQL

如果没有那么成本来支撑改造,那么就不需要改造! 只有当原有需求发生变化,需要对原功能进行修改时,就可以换成GraphQL了。...GraphQL特点总结 声明式数据获取(可以对API进行查询): 声明式的数据查询带来了接口的精确返回,服务器会按数据查询的格式返回同样结构的 JSON 数据、真正照顾了客户端的灵活性。...---- Part 2 Schema & Type GraphQL支持的数据操作 GraphQL对数据支持的操作有: 查询(Query):获取数据的基本查询。...通过对象模型来构建GraphQL中关于一个数据模型的形状,同时还可以声明各个模型之间的内在关联(一对一对一或)。 对象类型的定义可以参考下图: 对象模型引入关联关系 是不是很方便呢?...比如: 列表:[Type] 非空:Type! 列表非空:[Type]! 非空列表列表内容类型非空:[Type!]! 在描述数据模型(模式Schema),就可以对字段施加限制条件。

2.3K40

GraphQL

如果没有那么成本来支撑改造,那么就不需要改造! 只有当原有需求发生变化,需要对原功能进行修改时,就可以换成GraphQL了。...GraphQL特点总结 声明式数据获取(可以对API进行查询): 声明式的数据查询带来了接口的精确返回,服务器会按数据查询的格式返回同样结构的 JSON 数据、真正照顾了客户端的灵活性。...Part 2 Schema & Type GraphQL支持的数据操作 GraphQL对数据支持的操作有: 查询(Query):获取数据的基本查询。...通过对象模型来构建GraphQL中关于一个数据模型的形状,同时还可以声明各个模型之间的内在关联(一对一对一或)。 对象类型的定义可以参考下图: 对象模型引入关联关系 是不是很方便呢?...比如: 列表:Type 非空:Type! 列表非空:Type! 非空列表列表内容类型非空:Type!! 在描述数据模型(模式Schema),就可以对字段施加限制条件。

2.6K65

为什么我劝你放弃了Restful API?

如果没有那么成本来支撑改造,那么就不需要改造! 只有当原有需求发生变化,需要对原功能进行修改时,就可以换成GraphQL了。...GraphQL特点总结 声明式数据获取(可以对API进行查询): 声明式的数据查询带来了接口的精确返回,服务器会按数据查询的格式返回同样结构的 JSON 数据、真正照顾了客户端的灵活性。...GraphQL支持的数据操作 GraphQL对数据支持的操作有: 查询(Query):获取数据的基本查询。 变更(Mutation):支持对数据的增删改等操作。...通过对象模型来构建GraphQL中关于一个数据模型的形状,同时还可以声明各个模型之间的内在关联(一对一对一或)。 对象类型的定义可以参考下图: 是不是很方便呢?...比如: 列表:[Type] 非空:Type! 列表非空:[Type]! 非空列表列表内容类型非空:[Type!]! 在描述数据模型(模式Schema),就可以对字段施加限制条件。

2.7K20

GraphQL-BFF:微服务背景下的前后端数据交互方案

前言 随着终端、平台、业务形态、技术选型等各方面的发展,前后端的数据交互,日益复杂。 同一份数据,可能以多种不同的形态和结构,在多种场景下被消费。...之前有多少 RESTful 服务,重构后就有多少 GraphQL 服务。它是一个简单的一对一关系。 默认情况下,面向两个 GraphQL 服务发起的查询是两次请求,而不是一次。...举个例子: 前端需要产品数据,从之前调用产品相关的 RESTful API,变成查询产品相关的 GraphQL。不过,需要订单相关的数据,可能要查询另一个 GraphQL 服务。...如此,既避免了前端需要一对的问题,也解决了 API Gateway GraphQL 需要请求 RESTful 全量数据接口的内部冗余问题。让服务到服务之间的数据调用,也可以做到更精确。...在开发 GraphQL-BFF ,我们的 GraphQL-Service 跟后端基于领域模型的 Service,具有总体上的一一对应关系。

3.6K72

干货 | 万字长文全面解析GraphQL,携程微服务背景下的前后端数据交互方案

前言 随着终端、平台、业务形态、技术选型等各方面的发展,前后端的数据交互,日益复杂。 同一份数据,可能以多种不同的形态和结构,在多种场景下被消费。...它是一个简单的一对一关系。 默认情况下,面向两个 GraphQL 服务发起的查询是两次请求,而不是一次。...举个例子: 前端需要产品数据,从之前调用产品相关的 RESTful API,变成查询产品相关的 GraphQL。不过,需要订单相关的数据,可能要查询另一个 GraphQL 服务。...如此,既避免了前端需要一对的问题,也解决了 API Gateway GraphQL 需要请求 RESTful 全量数据接口的内部冗余问题。让服务到服务之间的数据调用,也可以做到更精确。...在开发 GraphQL-BFF ,我们的 GraphQL-Service 跟后端基于领域模型的 Service,具有总体上的一一对应关系。

3.5K21

GraphQL-BFF:微服务背景下的前后端数据交互方案

前言 随着终端、平台、业务形态、技术选型等各方面的发展,前后端的数据交互,日益复杂。 同一份数据,可能以多种不同的形态和结构,在多种场景下被消费。...之前有多少 RESTful 服务,重构后就有多少 GraphQL 服务。它是一个简单的一对一关系。 默认情况下,面向两个 GraphQL 服务发起的查询是两次请求,而不是一次。...举个例子: 前端需要产品数据,从之前调用产品相关的 RESTful API,变成查询产品相关的 GraphQL。不过,需要订单相关的数据,可能要查询另一个 GraphQL 服务。...如此,既避免了前端需要一对的问题,也解决了 API Gateway GraphQL 需要请求 RESTful 全量数据接口的内部冗余问题。让服务到服务之间的数据调用,也可以做到更精确。...在开发 GraphQL-BFF ,我们的 GraphQL-Service 跟后端基于领域模型的 Service,具有总体上的一一对应关系。

1.5K20

使用ASP.NET Core开发GraphQL服务器 -- 预备知识(上)

GraphQL 既是一种用于 API 的查询语言也是一个满足你数据查询的运行时。...官网地址:https://graphql.org/ 中文网址(感觉不是官方的,HTTPS都不是):http://graphql.cn/ GraphQL来自Facebook,它于2012年开始开发,2015...获取不足:使用REST,我想获取部门和部门的人员,通常我需要先请求查询部门列表;然后遍历返回的部门列表,再次发出请求查询每个部门下的人员,所以是N+1查询。...这个查询结果也和文档里的一致,我就不贴图了。 别名 当我使用不同的参数来查询两个同样的字段的时候,会报错的: ? 就应该使用别名了。添加别名只需要在字段前边加上别名和冒号即可: ?...在查询里使用fragment需要用三个点"...",它的作用相当于js里的展开操作符,把fragment里面的字段展开到相应的查询里。 fragment在GraphQL里使用的非常。 今天先到这。

1.7K40

人脸识别种族偏见:黑黄错误率比白人高100倍 | 美官方机构横评189种算法

(可戳量子位之前的文章:为了不把黑人兄弟认作大猩猩,谷歌的算法真的大猩猩都不认识了) 检测结果 1、在一对一匹配中,相较于白人,亚裔和非裔的人脸识别错误率要高10到100倍。...“偏见”还有长尾影响 根据人脸识别的使用场景和功能,检测分为一对一匹配和一对匹配: 一对一匹配一般用于手机人脸解锁或护照检查。...一对匹配用于确定某张照片是否在一个数据库中有匹配项,经常用于警察搜索嫌疑人。 一对一匹配出现错误可能会导致人脸无法解锁,给生活带来麻烦。...但是一对匹配的错误可能后果更严重,就会让警察把无辜的人列入嫌疑名单。 这份报告的主要作者Patrick Grother表示, 我们研究的大多数面部识别算法中都存在人口统计学差异的证据。...我们生活在一个充满偏见的世界,而新技术的到来,会放大现实世界的偏见吗?

83210

Python 爬虫进阶必备 | 某壁纸网站请求头参数与用户指纹 sign 加密逻辑分析

timezoneOffset: 返回从当前区域设置(主机系统设置)到UTC的时区差异(以分钟为单位)链接 timezone:时区 sessionStorage: 是否支持sessionStorage,不支持返回错误...或以编程方式删除 openDatabase: 返回是否支持Web SQL cpuClass:返回浏览器系统的 CPU 等级,一般无法获取 * platform: 返回表示浏览器平台的字符串,该规范允许浏览器始终返回空字符串...plugins:返回浏览器安装的插件列表。 canvas: 如果浏览器支持canvas则返回生成baes64数据。...webgl:返回浏览器对webgl绘图协议的支持情况汇总 webglVendorAndRenderer: 会显卡型号相关信息 adBlock:返回是否安装去广告插件。...有知有行[ 完 ]对了,看完记得一键四,这个对我真的很重要。

1.4K20

GraphQL 在微服务架构中的实践

它的类型系统也非常丰富,除了标量、枚举、列表和对象等类型之外,还支持接口和联合类型等高级特性。 ?...edge { cursor node { title } } } } } Relay 通过抽象出的『连接模型』为一对的关系提供了分片和分页的支持...N + 1 问题 在传统的后端服务中,N + 1 查询的问题就非常明显,由于数据库中一对的关系非常常见,再加上目前大多服务都使用 ORM 取代了数据层,所以在很多时候相关问题都不会暴露出来,只有真正出现性能问题或者慢查询才会发现...edge { cursor node { title } } } } } Relay 通过抽象出的『连接模型』为一对的关系提供了分片和分页的支持...N + 1 问题 在传统的后端服务中,N + 1 查询的问题就非常明显,由于数据库中一对的关系非常常见,再加上目前大多服务都使用 ORM 取代了数据层,所以在很多时候相关问题都不会暴露出来,只有真正出现性能问题或者慢查询才会发现

2.6K20

GraphQL 在微服务架构中的实践

它的类型系统也非常丰富,除了标量、枚举、列表和对象等类型之外,还支持接口和联合类型等高级特性。 ?...Relay 通过抽象出的『连接模型』为一对的关系提供了分片和分页的支持,在 Relay 看来,当我们获取某一个 User 对应的多个 Post ,其实是得到了一个 PostConnection,也就是一个连接...N + 1 问题 在传统的后端服务中,N + 1 查询的问题就非常明显,由于数据库中一对的关系非常常见,再加上目前大多服务都使用 ORM 取代了数据层,所以在很多时候相关问题都不会暴露出来,只有真正出现性能问题或者慢查询才会发现...微服务架构 微服务架构在当下已经成为了遇到业务异常复杂、团队人数增加以及高并发等需求或者问题时会使用的常见解决方案,当微服务架构遇到 GraphQL 就会出现很多理论上的碰撞,会出现非常的使用方法和解决方案...Schema Stitching 其实是解决服务共同对外暴露 Schema 比较好的方法,这种粘合 Schema 的方法其实是 GraphQL 官方推荐的做法,同时它们也为使用者提供了 JavaScript

1.5K10

使用NestJs、GraphQL、TypeORM搭建后端服务

TypeGraphQL是基于GraphQL重写的TypeScript版本,GraphQL的全称是:Graph Query Langue 图形化查询语言,是一个可由调用端定义API返回数据结构语言。...通过他我们可以定义一些Entity(实体),每个实体的数据字段,每个字段包含了数据类型,甚至是数据关系(一对对一)。这些实体将映射到真实数据库中,创建真正的数据表。...数据库连接host port:数据库连接port username:数据库管理员名称 password:数据库管理员密码 database:数据库名称 synchronize:指示是否在每次应用程序启动自动创建数据库架构...这两个方法即是我们之前提到的创建以及查询一个列表代码如下: import { Injectable } from '@nestjs/common' import { InjectRepository }...结语 其实总体来说,整个NestJs应用的开发体验还是蛮好的,相关的生态也发展的比较成熟,本项目仅是对相关技术的一个整体尝试,实际在开发过程中遇到的还有很多别的问题,比如GraphQL的N+1查询问题,

6.5K10

N天爆肝数据库——MySQL(3)

外键名称 FOREING KEY (外键名称)REFERNCES 主表名(主表名段名)ON UPDATE CASCADE ON DELETE CASCADE; 多表关系 概述 各个表结构之间相互存在联系有:一对...,一对一对对一) 实现:在的一方建立外键,指向一的一方的主键 举例:员工和部门 实现:建立第三张中间表,中间表至少包含两个外键,费别关联两方的主键 案例:学生于课程 一对一...实现:在任意一方加入外键,关联另外一方的主键,并且设置外键为唯一的(UNIQUE) 案例:用户与用户详细信息的关系 多表查询 概述:指从多张表中查询数据 笛卡尔积:在多表查询,需要消除无效的笛卡尔积...,自连接必须使用表别名 子查询 多表查询-内连接 隐式内连接 SELECT 字段列表 FROM 表1,表2 WHERE 条件...; 显示内连接 SELECT 字段列表 FROM 表1[INNER]JOIN...表2 ON连接条件...; 注意 内连接查询两张表交集的部分 多表查询-外连接 左外连接 SELECT 字段列表 FROM 表1 LEFT [OUTER]JOIN表2 ON条件...; 相当于查找表

16920
领券