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

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

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

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

DGS 框架的主要功能包括:

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

  • 用于將查詢測(cè)試編寫(xiě)為單元測(cè)試的測(cè)試框架

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

  • 與 GraphQLFederation 輕松集成

  • 與 Spring Security 相集成

  • GraphQL 訂閱 (WebSockets 與 SSE)

  • 文件上傳

  • 錯(cuò)誤處理

  • 自動(dòng)支持 interface/union 類(lèi)型

  • 提供面向 Java 的 GraphQL 客戶端

  • 可插拔 Instrumentation

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

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

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

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

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

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

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

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

  1. Schema 設(shè)計(jì)是開(kāi)發(fā)者體驗(yàn)中的重中之重。

  2. 能夠?yàn)楣ぞ咛峁┮环N更簡(jiǎn)便的 schema 使用方法。

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

盡管使用代碼生成 schema 一般更有速度優(yōu)勢(shì),但我們?cè)敢馔度敫鄷r(shí)間來(lái)建立起易于理解的 schema 協(xié)作模式設(shè)計(jì),希望借此建立更出色的 API。

3框架實(shí)操

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

讓我們先從簡(jiǎn)單的 schema 開(kāi)始。

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

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

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

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

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

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

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

關(guān)于這套框架的完整說(shuō)明文檔,請(qǐng)參見(jiàn) DGS框架 GitHub repo。

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

4對(duì)接 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)行查詢測(cè)試、schema 管理、代碼生成等。在使用 JVM 構(gòu)建 GraphQL 服務(wù)器時(shí),生態(tài)系統(tǒng)也為我們提供大量 schema 優(yōu)先庫(kù)與代碼優(yōu)先庫(kù)選項(xiàng)。

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

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

5聯(lián)合

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

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

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

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

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

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

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

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

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

6框架架構(gòu)

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

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

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

包含 Netflix 與 OSS 模塊的 DGS 框架

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

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

該框架還支持 graphql-java 庫(kù)中定義的 Instrumentation 類(lèi)。通過(guò)實(shí)現(xiàn) Instrumentation 接口并通過(guò) @Component 進(jìn)行注釋?zhuān)丝蚣芸梢宰詣?dòng)拾取這些類(lèi)。感興趣的朋友可以參閱說(shuō)明文檔中的相關(guān)參考示例。我們也期待更多社區(qū)參與者圍繞分布式跟蹤與指標(biāo)的通用模式做出貢獻(xiàn)。

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

8立即體驗(yàn)

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

9團(tuán)隊(duì)成果

DGS 框架在 Netflix 中獲得的成功,離不開(kāi)各參與團(tuán)隊(duì)的共同努力。我們要感謝來(lái)自 BFG 團(tuán)隊(duì)的各位同事,他們與我們共同完成了這段奇妙的探索之旅。最后,我們還要感謝各位用戶給出的及時(shí)反饋與代碼貢獻(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)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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