《分享》Graphql入门与实践
最近项目用到了graphql,学习了一些并在公司做了一个小分享,希望对你有帮助
一、介绍
Graphql给前端提供一种强力的查询工具,我们可以根据自己定义(需要)的格式去拿数据,它有自己的一套类型(schema)系统,schema 是 type、interface、enum 和 union 的集合,用来构建你的 API 数据模型; 类型系统在客户端和服务端之间提供了强类型的条约;我们想要什么,它就会准确给你返回什么,无冗余;
二、对比API
优缺点对比
- API接口数量众多维护成本高:接口的数量多、颗粒度较粗;graphql单个查询即可返回需要的信息,服务端只需要对客户端暴露一个地址即可
//如,要查A的表哥的公司的老总的父亲的车子是什么,可能需要多个api组合进行查询,而graphql一步到位;
query {
user (name : “A”) {
cousin{
boss{
father{
car
}
}
}
}
}
// 一般REST API需要多个接口查询,面对当前业务,新增接口也是开发成本
接口扩展成本高, 需求更换时,涉及到多接口合并,前端会增加请求数,还需要做数据处理等;
传统API接口:后端更新接口字段,文档未及时更新,可能影响到前端;graphql直接面向数据,通过 GraphiQL或者hasura 等可视化调试引擎展现服务端能提供的所有数据,开发过程不再依赖接口文档;
基于目前大多数企业架构,GraphQL应用需要前后端统一改造,适用方案较少,风险和成本较高;推动难度较大;比较适用全栈项目;GraphQL数据库查询性能存在瓶颈,服务端那边是需要平衡接口复杂度与数据库查询语言之间的复杂度;
三、主要概念
- 定义 API Schema
Schema定义了字段的类型、数据的结构,描述了接口数据请求的规则,当我们进行一些错误的查询的时候 GraphQL 引擎会负责告诉我们哪里有问题,和详细的错误信息;
自定义类型的定义主要是在服务端完成
# src/schema.graphql
# 接口定义
interface UserInterface {
id: ID!
name: String!
age: Int
gender: Gender
}
interface BobbyInterface{
hobby: String!
}
# 枚举定义 一般声明一组取值是常量的列表,字段属性需要大写
enum Gender {
MAN
WOMAN
}
# 对象User的定义,type类似js的对象
type UserInfo implements UserInterface { // 继承
id: ID!
name: String!
age: Int!
gender: Gender
}
type UserHobby implements BobbyInterface {
id: ID!
name: String!
age: Int!
gender: Gender
hobby: String!
}
# 定义联合类型,进行字段的拓展
union User = UserInfo | UserHobby
# 定义Query入口
type Query { // 基本查询
user(id: String!): [User]
// 标量类型:GraphQL 中内置有一些标量类型 String、Int、Float、Boolean、ID(ID类型代表着一个独一无二的标识、类似主键),用户也可以定义自己的标量类型
// !符号表示该字段不可空
// []: List类型、表示某个字段返回不止一个标量类型的数据
}
# 实现query查询
query{
user(name: "范德彪") {
id
name
age
gender
}
}
# Graphql Mutation, Subscription 等特殊的根类型,用于定义 API Schema Mutation定义,实现RUD
type Mutation {
createUser(id: ID!, name: String!, email: String!, age: Int,gender: Gender): User!
updateUser(id: ID!, name: String, email: String, age: Int, gender: Gender): User!
deleteUser(id: ID!): User
}
- 解析函数 Resolver: 负责到数据库中取得数据并返回
Query {
articles {
id
author {
name
}
comments {
id
desc
author
}
}
}
第一层解析,使用articles的Resolver获取解析数据,
第二层解析
(1) id在Author类型中为标量类型,解析结束
(2) author在Author类型中为对象类型User,尝试使用User的Resolver获取数据,当前field解析完毕
(3) 之后对第二层解析的返回值,进行第三层解析,当前author还包含一个Query, name,直到它是标量类型,解析结束
- Subscription
用于监听数据变动、并靠 Websocket 等协议推送变动的消息给订阅方。
subscription {
userChanged { // 监听用户数据变动
name
id
}
}
四、应用
- React + Graphql
Apollo 是基于 GraphQL 的全栈解决方案集合;包括了 apollo-client 和 apollo-server 。
客户端:
- 创建react+apollo
// 快速创建react demo
$ npx create-react-app apollo-react-demo
$ cd apollo-react-demo
$ npm install apollo-boost @apollo/react-hooks graphql
$ npm start
- CURD
// 查询数据
{
delivery_config(where: {id: {_eq: "lmXVOrQ8RMKezj89yP9aqw3xpo1JNL"}}) {
id
type
delivery_config_extras {
id
value
key
}
}
}
// 更新数据
mutation {
update_delivery_config(where: {id: {_eq: "lmXVOrQ8RMKezj89yP9aqw3xpo1JNL"}}, _set: {foreign_type: 2}) {
affected_rows
}
}
// 插入数据
mutation {
insert_delivery_config(objects: {brand_id: "100011", foreign_type: 1, delivery_config_extras: {data: {key: "testkey", value: "test", id: 123453323, created: "1574927283661", modified: "1574927283663"}}, id: "111233", created: "1574927283666", modified: "1574927283633", type: 2}) {
returning {
brand_id
}
}
}
// 删除数据
// 先删除关联数据
mutation {
delete_delivery_config_extra(where: {id: {_eq: 123453323}}) {
affected_rows
}
}
mutation {
delete_delivery_config(where: {id: {_eq: "111233"}}) {
affected_rows
}
}
使用fetch请求graphql操作
五、总结
Graphql主要是用来解决 API 设计问题的,至于怎么优化查询并不是它的重点,我们正在进行的配送服务,它有一套传统接口,也提供graphql文档、搜索引擎等,这样可以更大程度上去释放系统的可扩展性,可满足更多前端开发的需求;目前企业很多上线运行的稳定的项目,如果考虑引入graphql,其实也会有很高的人力和学习、开发成本,推行可能会有阻碍;
其实真正使用什么样的工具,还是要根据自己项目的特点去选择合适的技术,不是看什么新就用什么。GraphQL 也有缺点,如一次性查询过多数据,提升了被 服务器被DDOS 的风险等,但是如果你的需求可以正好避开这些缺点,
或者用限流、持久化查询等方案解决问题,就可以尝试使用。
参考链接:
《分享》Graphql入门与实践的更多相关文章
- 《Python编程:从入门到实践》分享下载
书籍信息 书名:<Python编程:从入门到实践> 原作名:Python Crash Course 作者: [美] 埃里克·马瑟斯 豆瓣评分:9.1分(2534人评价) 内容简介 本书是一 ...
- Python编程:从入门到实践(选记)
本文参考< Python 编程:从入门到实践>一书,作者: [ 美 ] Eric Matthes 第1章 起步 1.1 搭建python环境 在不同的操作系统中, Python 存 ...
- 《Python编程从入门到实践》_第十章_文件和异常
读取整个文件 文件pi_digits.txt #文件pi_digits.txt 3.1415926535 8979323846 2643383279 下面的程序打开并读取整个文件,再将其内容显示到屏幕 ...
- React Native入门——布局实践:开发京东client首页(一)
有了一些对React Native开发的简单了解,让我们从实战出发.一起来构建一个简单的京东client. 这个client是仿照之前版本号的京东client开发的Android版应用,来源于CSDN ...
- 初探Electron,从入门到实践
本文由葡萄城技术团队于博客园原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 在开始之前,我想您一定会有这样的困惑:标题里的Electron ...
- Python数据分析入门与实践 ✌✌
Python数据分析入门与实践 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 这是一个数据驱动的时代,想要从事机器学习.人工智能.数据挖掘等前沿技术,都离不开 ...
- [转帖]从入门到实践:创作一个自己的 Helm Chart
从入门到实践:创作一个自己的 Helm Chart https://www.cnblogs.com/alisystemsoftware/p/11436469.html 自己已经搭建好了 helm 和t ...
- GraphQL入门有这一篇就足够了
GraphQL入门有这一篇就足够了:https://blog.csdn.net/qq_41882147/article/details/82966783 版权声明:本文为博主原创文章,遵循 CC 4. ...
- Python3数据科学入门与实践✍✍✍
Python3数据科学入门与实践 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看的时候可 ...
随机推荐
- 「HAOI2015树上染色」「树形DP」
其实我还不大会树形DP 此题就当练手叭,缕一下思路就好 题目链接 BZOJ4033 题目大意就是给一棵树,对一部分点染成黑色,剩下的为白色,问所有同色点距离之和....... 简明扼要的题意,然额我不 ...
- MyBatis源码分析(一)
MyBatis故事: 官方网站:http://www.mybatis.org 官方文档:http://www.mybatis.org/mybatis-3/ GitHub:https://github. ...
- 简单了解一下 Swagger
一.Swagger 1.什么是 Swagger ? Swagger 是一个规范和完整的框架,用于生成.描述.调用以及可视化的 Restful 风格的 Web 服务. 简单的理解:是一款 REST AP ...
- Newbe.Claptrap 框架入门,第一步 —— 创建项目,实现简易购物车
让我们来实现一个简单的 “电商购物车” 需求来了解一下如何使用 Newbe.Claptrap 进行开发. 业务需求 实现一个简单的 “电商购物车” 需求,这里实现几个简单的业务: 获取当前购物车中的商 ...
- 记Centos7和RHEL连接不上网络
一 .前言 我是把Linux系统安装在虚拟机中的,用的是VMware. 在终端工具和操作界面中. VMware里面采用的网络适配器是NAT技术. 标题中的Centos和RHEL区别就不多说了,自行百度 ...
- flask 源码专题(十):flash源码研究
flash源码 def flash(message, category="message"): flashes = session.get("_flashes" ...
- 对掌机游戏Pokemon的一部分系统的拆解流程图
整体系统拆解 POKEMON系统拆解 属性.技能.进化形态 属性提升系统 种族值说明: 所有Pokemon都拥有自己的种族的种族值,且固定(例如:小火龙:309, 皮卡丘: 320) 种族值是各项属性 ...
- Java图片验证码生成工具
直接把以下代码拷贝使用: import javax.imageio.ImageIO;import java.awt.*;import java.awt.image.BufferedImage;impo ...
- git分支管理的策略和冲突问题
目录 备注: 知识点 关于分支中的冲突 分支管理的策略 分支策略 备注: 本文参考于廖雪峰老师的博客Git教程.依照其博客进行学习和记录,感谢其无私分享,也欢迎各位查看原文. 知识点 git log ...
- cas-server-3.5.2-release.zip 及cas-client-3.2.1-release.zip下载
cas-client-3.2.1-release.zip===> https://github.com/apereo/cas/releases/download/v3.5.2/cas-serve ...