我為什么要放棄RESTful,選擇擁抱GraphQL?


濫用REST接口,導(dǎo)致大量相似度很高(具有重復(fù)性)的API越來越冗余。 對于前端而言:REST API粒度較粗,難以一次性符合前端的數(shù)據(jù)要求,前端需要分多次請求接口數(shù)據(jù)。增加了前端人員的工作量。 對于后端而言:前端需要的數(shù)據(jù)往往在不同的地方具有相似性,但卻又不同,比如針對同樣的用戶信息,有的地方只需要用戶簡要信息(比如頭像、昵稱),有些地方需要詳細(xì)的信息,這就需要開發(fā)不同的接口來滿足這些需求。當(dāng)這樣的相似但又不同的地方多的時候,就需要開發(fā)更多的接口來滿足前端的需要。增加了后端開發(fā)人員的工作量和重復(fù)度。
做加法:產(chǎn)品需求增加,頁面需要增加功能,數(shù)據(jù)也就相應(yīng)的要增加顯示,那么REST接口也需要做增加,這種無可厚非。 做減法:產(chǎn)品需求減少,頁面需要減少功能,或者減少某些信息顯示,那么數(shù)據(jù)就要做減法。


GraphQL是一種新的API標(biāo)準(zhǔn),它提供了一種比REST更有效、更強大和更靈活的替代方案。
它是由Facebook開發(fā)并開源的,現(xiàn)在由來自世界各地的公司和個人組成的大型社區(qū)維護(hù)。
GraphQL本質(zhì)上是一種基于API的查詢語言,現(xiàn)在大多數(shù)應(yīng)用程序都需要從服務(wù)器中獲取數(shù)據(jù),這些數(shù)據(jù)存儲可能存儲在數(shù)據(jù)庫中,API的職責(zé)是提供與應(yīng)用程序需求相匹配的存儲數(shù)據(jù)的接口。
它是數(shù)據(jù)庫無關(guān)的,而且可以在使用API的任何環(huán)境中有效使用,我們可以理解為GraphQL是基于API之上的一層封裝,目的是為了更好,更靈活的適用于業(yè)務(wù)的需求變化。










首先要設(shè)計數(shù)據(jù)模型,用來描述數(shù)據(jù)對象,它的作用可以看做是VO,用于告知GraphQL如何來描述定義的數(shù)據(jù),為下一步查詢返回做準(zhǔn)備;
前端使用模式查詢語言(Schema)來描述需要請求的數(shù)據(jù)對象類型和具體需要的字段(稱之為聲明式數(shù)據(jù)獲取);
后端GraphQL通過前端傳過來的請求,根據(jù)需要,自動組裝數(shù)據(jù)字段,返回給前端。


使用了GraphQL就要完全拋棄REST了嗎?
GraphQL需要直接對接數(shù)據(jù)庫嗎?
使用GraphQL需要對現(xiàn)有的后端服務(wù)進(jìn)行大刀闊斧的修改嗎?




聲明式數(shù)據(jù)獲取(可以對API進(jìn)行查詢): 聲明式的數(shù)據(jù)查詢帶來了接口的精確返回,服務(wù)器會按數(shù)據(jù)查詢的格式返回同樣結(jié)構(gòu)的JSON數(shù)據(jù)、真正照顧了客戶端的靈活性。
一個微服務(wù)僅暴露一個GraphQL層:一個微服務(wù)只需暴露一個GraphQL endpoint,客戶端請求相應(yīng)數(shù)據(jù)只通過該端點按需獲取,不需要再額外定義其他接口。
傳輸層無關(guān)、數(shù)據(jù)庫技術(shù)無關(guān):帶來了更靈活的技術(shù)棧選擇,比如我們可以選擇對移動設(shè)備友好的協(xié)議,將網(wǎng)絡(luò)傳輸數(shù)據(jù)量最小化,實現(xiàn)在網(wǎng)絡(luò)協(xié)議層面優(yōu)化應(yīng)用。

查詢(Query):獲取數(shù)據(jù)的基本查詢。
變更(Mutation):支持對數(shù)據(jù)的增刪改等操作。
訂閱(Subscription):用于監(jiān)聽數(shù)據(jù)變動、并靠websocket等協(xié)議推送變動的消息給對方。


對于數(shù)據(jù)模型的抽象是通過類型(Type)來描述的,每一個類型有若干字段(Field)組成,每個字段又分別指向某個類型(Type)。這很像Java、C#中的類(Class)。
GraphQL的Type簡單可以分為兩種,一種叫做Scalar Type(標(biāo)量類型),另一種叫做Object Type(對象類型)。
String
Int
Float
Boolean
Enum
ID



列表:[Type]
非空:Type!
列表非空:[Type]!
非空列表,列表內(nèi)容類型非空:[Type!]!














C#/.NET
Clojure
Elixir
Erlang
Go
Groovy
Java
JavaScript
Julia
Kotlin
Perl
PHP
Python
R
Ruby
Rust
Scala
Swift

C#/.NET
ClojureScript
Elm
Flutter
Go
Java/Android
JavaScript
Julia
Swift/Objective-C iOS
Python
R

Apollo Engine:一個用于監(jiān)視GraphQL后端的性能和使用的服務(wù)。
Graphcool:一個BaaS(后端即服務(wù)),它為你的應(yīng)用程序提供了一個GraphQL后端,且具有用于管理數(shù)據(jù)庫和存儲數(shù)據(jù)的強大的web ui。
Tipe:一個SaaS(軟件即服務(wù))內(nèi)容管理系統(tǒng),允許你使用強大的編輯工具創(chuàng)建你的內(nèi)容,并通過GraphQL或REST API從任何地方訪問它。
AWS AppSync:完全托管的GraphQL服務(wù),包含實時訂閱、離線編程和同步、企業(yè)級安全特性以及細(xì)粒度的授權(quán)控制。
Hasura:一個BaaS(后端即服務(wù)),允許你在Postgres上創(chuàng)建數(shù)據(jù)表、定義權(quán)限并使用GraphQL接口查詢和操作。

GraphiQL:一個交互式的運行于瀏覽器中的GraphQL IDE。
GraphQL Language Service:一個用于構(gòu)建IDE的GraphQL語言服務(wù)(診斷、自動完成等)的接口。
QuickType:在TypeScript、Swift、Golang、C#、C 等語言中為GraphQL查詢生成類型。
