當(dāng)前位置:首頁 > 公眾號精選 > 架構(gòu)師社區(qū)
[導(dǎo)讀]Netflix 公司著力開發(fā)的 Domain Graph Service(DGS)框架現(xiàn)已正式成為開源項目。

作者 | Netflix 技術(shù)博客,策劃 | 田曉旭 文章來源: 架構(gòu)頭條

Netflix 公司著力開發(fā)的 Domain Graph Service(DGS)框架現(xiàn)已正式成為開源項目。DGS 框架簡化了針對獨立與聯(lián)合 GraphQL 服務(wù)的 GraphQL 實現(xiàn)。而在高強(qiáng)度的現(xiàn)實錘煉之后,這套框架也變得愈發(fā)穩(wěn)定強(qiáng)健。

通過將項目開源,我們希望為 Java 及 GraphQL 社區(qū)做出貢獻(xiàn),同時與各位使用框架、增強(qiáng)框架的參與者們攜手合作。

DGS 框架的主要功能包括:

  • 基于注釋的 Spring Boot 編程模型

  • 用于將查詢測試編寫為單元測試的測試框架

  • Gradle 代碼生成插件,可通過 GraphQLschema 創(chuàng)建 Java/Kotlin 類型

  • 與 GraphQLFederation 輕松集成

  • 與 Spring Security 相集成

  • GraphQL 訂閱 (WebSockets 與 SSE)

  • 文件上傳

  • 錯誤處理

  • 自動支持 interface/union 類型

  • 提供面向 Java 的 GraphQL 客戶端

  • 可插拔 Instrumentation

1我們?yōu)楹涡枰?DGS 框架

2019 年春季,Netflix 公司開啟了這段偉大的聯(lián)合 GraphQL 架構(gòu)探索之旅。向這種新型聯(lián)合架構(gòu)的過渡,意味著我們的眾多后端團(tuán)隊需要在 Java 生態(tài)系統(tǒng)中使用 GraphQL。之前我們曾發(fā)表博文,提到 Netflix 已經(jīng)在 Spring Boot 上實現(xiàn)了后端開發(fā)標(biāo)準(zhǔn)化。因此,要讓這套聯(lián)合架構(gòu)取得成功,我們需要在 Spring Boot 中為 GraphQL 提供良好的開發(fā)者體驗。

為此,我們在 Spring Boot 上創(chuàng)建起自有框架,其中用到 graphql-java 庫。這套框架最初只供內(nèi)部使用,主要強(qiáng)調(diào)與 Netflix 生態(tài)系統(tǒng)相集成以實現(xiàn)跟蹤、日志記錄及指標(biāo)整理等。但在此期間,我們也一直強(qiáng)調(diào)應(yīng)該將框架進(jìn)行適當(dāng)模塊化。很明顯,我們構(gòu)建的大多數(shù)框架并不特定于 Netflix,主要用于提供一種更簡便的 GraphQL 服務(wù)(獨立與聯(lián)合)構(gòu)建方法。

2Schema 優(yōu)行開發(fā)

Schema 代表的是 GraphQLAPI。正是 schema 的存在,讓 GraphQL 如何強(qiáng)大、又與 REST 有所不同。GraphQL 模式會根據(jù)查詢及變異操作,配合相關(guān)類型與字段以描述 API。API 用戶可以精確指定希望在查詢中檢索的字段,借此極大提高 GraphQLAPI 的靈活性。

GraphQL 分為兩種不同方法:schema 優(yōu)先與代碼優(yōu)先。通過選擇 schema 優(yōu)先開發(fā)方法,您可以使用 GraphQLSchema 語言手動定義 API 的 schema。服務(wù)中的代碼將僅用于實現(xiàn)此 schema。

使用代碼優(yōu)先開發(fā),您無需使用任何 schema 文件。相反,由運(yùn)行時根據(jù)代碼中的定義生成 schema。

我們的框架同時支持 schema 優(yōu)先與代碼優(yōu)先這兩種方法。在 Netflix,我們明確傾向使用 schema 優(yōu)化的開發(fā)方式,理由包括:

  1. Schema 設(shè)計是開發(fā)者體驗中的重中之重。

  2. 能夠為工具提供一種更簡便的 schema 使用方法。

  3. 由 schema 差異能夠讓變更引發(fā)的向下不兼容性更明顯。在聯(lián)合 GraphQL 架構(gòu)下,向下兼容性無疑至關(guān)重要。

盡管使用代碼生成 schema 一般更有速度優(yōu)勢,但我們愿意投入更多時間來建立起易于理解的 schema 協(xié)作模式設(shè)計,希望借此建立更出色的 API。

3框架實操

此框架的核心圍繞 Spring Boot 開發(fā)者所熟悉的、基于注釋的編程模型進(jìn)行。項目網(wǎng)站上提供全面的說明文檔,下面我們將通過一項示例,向大家展示如何輕松使用這套框架。

讓我們先從簡單的 schema 開始。

Netflix 開源用于 Spring Boot的 GraphQL 服務(wù)框架DGS

要實現(xiàn)此 API,我們需要編寫一個數(shù)據(jù)提取程序。

Netflix 開源用于 Spring Boot的 GraphQL 服務(wù)框架DGS

其中的 Show 類型是一個簡單 POJO,通常由 Gradle 的 DGS 代碼生成插件所生成。使用 @DgsData 注釋方法,即可為字段實現(xiàn)數(shù)據(jù)獲取程序。請注意,我們不需要為每個字段獲取數(shù)據(jù);這里可以直接返回 Java 對象,由框架完成其余工作。這套框架還具有多種其他便捷性優(yōu)勢,例如本示例中使用的 @InputArgument 注釋。

此代碼足以讓 GraphQL 端點保持運(yùn)行。接下來,只需要啟動 Spring Boot 應(yīng)用程序,即可使用 /graphql 端點以及 /graphiql 上開箱即用的 GraphiQL 查詢編輯器。示例中的代碼簡單明了,而且即使是使用聯(lián)合類型,使用 @Secured 或者使用擴(kuò)展點添加指標(biāo)與跟蹤,代碼內(nèi)容也不會有太大區(qū)別??傊?,框架本身將負(fù)責(zé)解決所有繁重的工作內(nèi)容。

本框架的另一大關(guān)鍵,在于支持輕量級查詢測試。通過測試流程,您無需使用 HTTP 端點即可執(zhí)行查詢。測試本身的使用感受與普通 Junit 測試基本一致。

Netflix 開源用于 Spring Boot的 GraphQL 服務(wù)框架DGS

關(guān)于這套框架的完整說明文檔,請參見 DGS框架 GitHub repo。

https://netflix.github.io/dgs/

4對接 GraphQL 服務(wù)器生態(tài)系統(tǒng)

那么,DGS 框架要如何全面適應(yīng)現(xiàn)有 GraphQL 生態(tài)系統(tǒng)?當(dāng)前生態(tài)系統(tǒng)涵蓋服務(wù)器、客戶端、聯(lián)合網(wǎng)關(guān)以及工具,可幫助您進(jìn)行查詢測試、schema 管理、代碼生成等。在使用 JVM 構(gòu)建 GraphQL 服務(wù)器時,生態(tài)系統(tǒng)也為我們提供大量 schema 優(yōu)先庫與代碼優(yōu)先庫選項。

graphql-kotlin 是一套面向 Kotlin 語言的高人氣代碼優(yōu)先庫。graphql-java 則是在 Java 當(dāng)中實現(xiàn) schema 優(yōu)先 GraphQLAPI 的首選方案,但在設(shè)計上屬于低級庫。graphql-java-kickstart 入門程序由一組用于實現(xiàn) GraphQL 服務(wù)的庫組成,并在 graphql-java 的基礎(chǔ)之上提供 graphql-java-tools 與 graphql-java-servlet。

無論您使用 Java 還是 Kotlin,我們的框架都能提供在 Spring Boot 中構(gòu)建 GraphQL 服務(wù)的簡便方法。此框架還可分別用于構(gòu)建獨立服務(wù)與聯(lián)合 GraphQL。

5聯(lián)合

DGS 框架能夠以便捷的方法實現(xiàn)聯(lián)合 GraphQL 服務(wù)。聯(lián)合機(jī)制,意味著各服務(wù)能夠共享網(wǎng)關(guān)所公開的統(tǒng)一圖。通常,服務(wù)使用由 Apollo 聯(lián)合規(guī)范所定義的 @extends 指令,借此在統(tǒng)一 schema 中實現(xiàn)服務(wù)共享與類型擴(kuò)展。這也是一種將大規(guī)模單體 GraphQLschema 拆分成多個微服務(wù)的有效方法。

對于傳入的查詢,聯(lián)合網(wǎng)關(guān)能夠構(gòu)建查詢計劃以調(diào)用所需的服務(wù),借此完成查詢操作。每項服務(wù)又需要能夠響應(yīng) _entities 查詢,以便在一定程度上完成對所擁有數(shù)據(jù)的查詢。

下面以 Reviews(評論)服務(wù)為例,了解如何在 reviews 字段擴(kuò)展之前定義的 Show 類型:

Netflix 開源用于 Spring Boot的 GraphQL 服務(wù)框架DGS

Netflix 開源用于 Spring Boot的 GraphQL 服務(wù)框架DGS

帶有 Shows 與 Reviews DGS 的聯(lián)合 GraphQL 架構(gòu)

在此 schema 下,Reviews DGS 需要為聯(lián)合 Show 類型實現(xiàn)一個解析器,并在其中填充 reviews 字段。大家可以使用 @DgsEntityFetcher 注釋輕松完成此項操作,如下所示:

Netflix 開源用于 Spring Boot的 GraphQL 服務(wù)框架DGS

此框架還使您可以輕松通過代碼生成功能對聯(lián)合查詢加以測試,借此為基于 schema 的服務(wù)生成 _entities 查詢。

6框架架構(gòu)

從開發(fā)之初,我們就專注于實現(xiàn)代碼模塊化。這是一項重要的設(shè)計選擇,能夠在不影響我們內(nèi)部團(tuán)隊的前提下開源大部分框架。但我們無法使用 Java 9 中引入了模塊系統(tǒng),因為 Netflix 內(nèi)部的多數(shù)應(yīng)用程序仍在使用 java 8。但借助 Gradleapi 與 implementation 模塊,我們得以創(chuàng)建起簡單整潔的模塊結(jié)構(gòu)。在 Netflix,我們將大量 Spring Boot 擴(kuò)展與自有基礎(chǔ)設(shè)施集成起來。我們將這套體系稱為 Spring Boot Netflix。DGS 框架基于標(biāo)準(zhǔn)的開源 Spring Boot 構(gòu)建而成。最重要的是,我們也有部分模塊與特定基礎(chǔ)設(shè)施相集成,且僅使用核心框架提供的擴(kuò)展點。

下圖所示,為各模塊如何實現(xiàn)裝配集成:

Netflix 開源用于 Spring Boot的 GraphQL 服務(wù)框架DGS

包含 Netflix 與 OSS 模塊的 DGS 框架

7分布式跟蹤與指標(biāo)

在 Netflix,我們擁有一夶包含跟蹤、指標(biāo)、分布式日志記錄以及身份驗證 / 授權(quán)等功能的自定義基礎(chǔ)設(shè)施。如前所述,DGS 框架能夠與這套基礎(chǔ)設(shè)施集成起來,提供開箱即用的無縫化體驗。雖然這些功能并未開源,但仍可以輕松被添加到框架當(dāng)中。

該框架還支持 graphql-java 庫中定義的 Instrumentation 類。通過實現(xiàn) Instrumentation 接口并通過 @Component 進(jìn)行注釋,此框架可以自動拾取這些類。感興趣的朋友可以參閱說明文檔中的相關(guān)參考示例。我們也期待更多社區(qū)參與者圍繞分布式跟蹤與指標(biāo)的通用模式做出貢獻(xiàn)。

https://netflix.github.io/dgs/advanced/instrumentation/

8立即體驗

要開始使用 DGS 框架,請參閱說明文檔及教程。要為 DGS 框架做出貢獻(xiàn),請在 GitHub 上查看 DGS 框架項目。我們還擁有一款 Gradle代碼生成插件,用于根據(jù) GraphQLschema 生成 Java 與 Kotlin 類型。要參與代碼生成插件的貢獻(xiàn),請在 GitHub 上查看此項目。

9團(tuán)隊成果

DGS 框架在 Netflix 中獲得的成功,離不開各參與團(tuán)隊的共同努力。我們要感謝來自 BFG 團(tuán)隊的各位同事,他們與我們共同完成了這段奇妙的探索之旅。最后,我們還要感謝各位用戶給出的及時反饋與代碼貢獻(xiàn)。

原文鏈接:https://netflixtechblog.com/open-sourcing-the-netflix-domain-graph-service-framework-graphql-for-spring-boot-92b9dcecda18?gi=978ff7b803d3



免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉