越来越臃肿的web应用
随着Web应用变得越来越复杂,特别是像一些toB的web应用(例如财务软件,ERP等企业级软件),传统的前后端REST架构交互方案在极大的限制了软件的开发效率,提高维护的成本,不仅是前端,后端的开发和维护成本也是越来越高。
对于REST架构来说,主要的问题是以下几点:
- 过度获取数据,例如,有的时候前端为了满足在web和移动端的业务需求,可能会在同一接口是获取相同的数据,但是有的数据在两端上并不是必须的。
- 前端业务数据可能要通过多个接口请求去获得,而想chrome这样的浏览器允许的请求的最大的并发数是六个,在一定程度上会有体验方面的问题。
- 有一些REST接口并不十分规范,比如一些查询接口的数据字段过多就会被定义成POST接口。
- 前端需要知道每个接口服务的地址,才能去获得对应的资源数据。
- 如果后端API发生了更改,那么可能会导致另外一个或者多个API奔溃,前端数据可能会受到破坏,哪怕只是一个简单的数据结构调整,这对于前端来说很可能是致命的,大概率会跟着调整。
- 当有新的功能需要开发时,后台需要去聚合多个微服务的数据提供给前端使用。
由于REST架构让前后端产生了一定的耦合,除了以上的技术问题之外,前后端可能还会面临技术之外的问题,毕竟前后端看待问题的角度有所不一样,REST接口可能会在逻辑一定程度上影响彼此的情绪。
针对以上的这些问题,我们可以通过GraphQL构建一个BFF层来提升前后端的开发效率和降低维护成本。
什么是GraphQL?
在介绍GraphQL可以做什么之前,我们先了解一下GraphQL的概念及基础组成。从官网的介绍,GraphQL是用于API的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。
一个基础的Graphql服务核心由Query,Mutations和Schema组成,下面简单介绍一下这几个概念。
- 查询(Query),通过字段、参数、别名、片段、操作名称、变量和指令组成的查询Graphql的详细信息,一个简单的GraphQL查询语句如下图所示:
- 变更(Mutations)GraphQL数据平台用来修改服务端数据的方法,一个Mutations可以修改多个服务器数据,但是与查询不同的是查询字段是并行执行,而变更字段是是线性执行,也就是一个接着一个的来进行执行。一个简单的Graphql变更语句和变更结果如下图所示:
- Schema,通过独立类型系统(可以与任何的语言来进行通信,例如Javascript, Golang和Java等等)描述如何查询数据,Schema定义GraphQL的查询结构,其返回值结构与查询结构非常相似。一下是一个简单的Schema定义:
enum Gender {
Man
Woman
}
type User {
name: String!
age: Int!
gender: Gender
}
Graphql可以做什么?
- 让接口具有类型
因为GraphQL具有严格的类型系统,它是由GraphQL Schema Definition Language(SDL编写的,Scheme定义的Query或Mutations都是具有类型的,解决了REST接口没有类型的问题,通过类型匹配让你尽早发现接口中存在的错误,让你的数据更加安全。 - 提高客户端效率
在一些业务场景况下,前端需要通过组合多个REST接口才能获得业务所需的数据,并且还极大可能存在一些冗余数据,GraphQL通过减少网络往返,缩小请求次数以及数据传输量,在一定程度上提高了客户全的请求效率。 - 可读性强,代码即文档
可以比较直接的通过很多GraphQL查询工具,例如GraphiQL,可以直观的理解Query或Mutations数据的结构和数据类型。 - 不用知道API接口的地址即可便捷修改数据
前端通过REST接口修改服务器数据,得去定义URI,且要去定义异步请求的Http方法,GraphQL省去了这些步骤,通过Mutations可以快速的对数据进行增删改。
GraphQL的一些问题
GraphQl的确会为前后端交互解决很多问题,但是不可忽视的是,GraphQL在一些场景里面,也是存在一些问题的。
- 前端要比较舒服的使用GraphQL,在已有的服务架构下,服务端极大可能要改写数据暴露的方式,需要大量的重构,才能搭建复合GraphQL规范的接口,并且风险和成本都很高。
- GraphQL Query做缓存比较困难,虽然可以通过给Query实例一个ID实现缓存,但是真实场景里面这样的实现方式繁复困难,在性能方面存在一些问题。
我的总结
虽然在一些场景下,GraphQL存在诸多问题,已有的前后端交互方式改造成本和风险巨大,也不建议去重构已有的复杂的服务架构。但是新的业务场景下,以及不断强大的GraphQL生态工具链会让GraphQL解决很多意想不到的问题,生态链是促成GraphQL不断提高市场占有率的重要因素,也是GraphQL成为新一代重要技术的原因。
最后,有一个挺棒的GraphQL在线体验地址,大家可以去实际体验一下通过GraphQL对数据的操作。