相关历史文章(阅读本文之前,您可能需要先看下之前的系列)
国内最全的Spring Boot系列之三
Docker优雅的关闭SpringBoot - 第310篇
「字节码插桩」统计方法耗时(第一篇:初出茅庐)- 第311篇
「字节码插桩」统计方法耗时(第二篇:崭露头角)- 第311篇
「字节码插桩」统计方法耗时(第三篇:叱咤风云)- 第313篇
2020上半年发文汇总「值得收藏」
师傅:徒儿,这几个星期,你找个技术点自我研究学习下。
悟纤:师傅,你这是抛弃徒儿了嘛?┭┮﹏┭┮
师傅:你又想哪里去了,这是训练下你自我学习能力,再说了师傅也不能一直陪在你身边呀,你总的学会自我成长呢。
悟纤:看来师傅是用心良苦呐,徒儿错怪师傅了。师傅,徒儿这就去找个技术点研究下。
说明
在接下来的文章主要介绍:
(1)GraphQL是什么?
(2)GraphQL在SpringBoot中如何集成?
一、GraphQL的官方介绍
我们进入GraphQL的官方文档:https://graphql.cn ,可以看到一段话:
是不是看着感觉不知所云呐?那听我慢慢道来。
二、GraphQL的探索之路
2.1 GraphQL的定义
GraphQL 是一种 API 查询语言, 用于服务器端执行按已定义类型系统的查询. GraphQL 不与任何特定的数据库或存储引擎进行绑定, 而是由您的代码和数据支持.(官方描述)。
上面这句话不好理解,看看下面这个解释:
GraphQL 是一种针对 Graph(图状数据)进行查询特别有优势的 Query Language(查询语言),所以叫做 GraphQL。
说白了就是想要什么, 就传入什么字段, 也就会返回什么字段, 具体字段处理是服务器所提供, 而 graphql 并不会关心服务器怎么处理。
举例说明:
传统的rest api:
/user/{id} return { id, name, age } 是一成不变的,
graphql:
findUser(id: xx) return { id, name } (注: 传输参数id, 指定返回字段 id, name, 当然也可以写{ name, age },完全取决于前端需求 )
是不是还不懂,没有关系,先接着往下看。
2.2 GraphQL的小历史
早在2012年,Facebook认为人们只有在离开PC的时候才会用智能手机,很快他们就发现这个认识是多么的错误!于是Facebook把注意力从Web移到了智能终端上。在那个时候,他们严重的依赖于RESTful API。大量的并发请求和对补充数据的二次请求给他们造成了很大的麻烦,尤其是响应时间。一个解决方案是设计足够多的资源来满足单次的请求。但是,这造成了服务端的扩展和维护困难。
在寻找更好的解决方案的过程中,Facebook的工程师发现开发人员不应该先入为主的把数据看成RESTful一样的集合。如何更好地存储和获取数据不应该是他们要主要考虑的内容。他们应该更多的考虑数据的关系,网状的关系。
在这个情况下GraphQL应运而生。
2.3 GraphQL工作机制
一个GraphQL查询可以包含一个或者多个操作(operation),类似于一个RESTful API。操作(operation)可以使两种类型:查询(Query)或者修改(mutation)。我们看一个例子:
query {
findById(id: 1) {
id
name
}
}
你的第一印象:“这个不是JSON?”。还真不是!就如我们之前说的,GraphQL设计的中心是为客户端服务。GraphQL的设计者希望可以写一个和期待的返回数据schema差不多的查询。
注意上面的例子有三个不同的部分组成:
(1)findById是查询的operation(这是一个Query)
(2)(id: 1) 包含了传入给Query的参数(多个参数,使用逗号隔开,比如:(id:1,name:”张三”) )
(3)查询包含id和name字段,这些字段也是我们希望查询可以返回的。(这里就是GraphQL的特性,能够指定要返回的字段,如果只指定了id,那么返回结果就只返回id。)
到这里是不是有点理解了GraphQL了,以前如果要返回不同的数据的话,需要编写多个接口,或者编写一个接口干脆什么字段都给返回给你,前端你自己就看着办吧,要显示哪些你就显示哪些,不要显示的,你就不要管了,4G时代,还什么流量问题,不用考虑。
我们看看server会给这个查询返回什么:
{
"data": {
"findById": {
"id": "1",
"name": "悟纤"
}
}
}
就如我们期望的,server会返回一个JSON串。这个JSON的schema和查询的基本一致。
从以上的例子里你可以看出来GraphQL允许客户端明确指定它要的是什么,避免了数据后去的冗余或者不足。和RESTful API对比一下,每一个客户端都会对应很多个RESTful API或者一个API要服务很多个客户端。所以说GraphQL是很好的查询语言。所有的operation、参数和所有可以查询的字段都需要在GraphQL server上定义、实现。
悟纤小结
悟纤:今天咱们就先探索到这里,知识需要慢慢消化,一口气不能吃个胖子。
(1)GraphQL(Grapha Query Language):主要是作用于数据接口,比如前端后端交互,给客户端筛选自由获取服务端事先定义好的数据,提高了交互接口的灵活性。
(2)GraphQL官方说:GraphQL一种为你的API而生的查询语言。
(3)API:应用编程接口,全称是Application Programming Interface。
(4)GraphQL简单理解:在请求API的时候,允许我们指定要返回的字段。
(5)GraphQL主要有两种操作(Operation):查询(Query)或者修改(mutation)。
到此你是不是还是有点小蒙圈,没事,下节课我们会使用个小栗子来助你理解GraphQL。
学习完本文之后,记住以下这句话就足以了:
GraphQL解决了接口对查询字段差异性的要求。
我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。
学院中有Spring Boot相关的课程:
à悟空学院:https://t.cn/Rg3fKJD
SpringBoot视频:http://t.cn/A6ZagYTi
Spring Cloud视频:http://t.cn/A6ZagxSR
SpringBoot Shiro视频:http://t.cn/A6Zag7IV
SpringBoot交流平台:https://t.cn/R3QDhU0
SpringData和JPA视频:http://t.cn/A6Zad1OH
SpringSecurity5.0视频:http://t.cn/A6ZadMBe
Sharding-JDBC分库分表实战:http://t.cn/A6ZarrqS
分布式事务解决方案「手写代码」:http://t.cn/A6ZaBnIr