日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁(yè) > > 架構(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 編程模型

  • 用于將查詢(xún)測(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 客戶(hù)端

  • 可插拔 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ù)查詢(xún)及變異操作,配合相關(guān)類(lèi)型與字段以描述 API。API 用戶(hù)可以精確指定希望在查詢(xún)中檢索的字段,借此極大提高 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ì)象,由框架完成其余工作。這套框架還具有多種其他便捷性?xún)?yōu)勢(shì),例如本示例中使用的 @InputArgument 注釋。

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

本框架的另一大關(guān)鍵,在于支持輕量級(jí)查詢(xún)測(cè)試。通過(guò)測(cè)試流程,您無(wú)需使用 HTTP 端點(diǎn)即可執(zhí)行查詢(xún)。測(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ù)器、客戶(hù)端、聯(lián)合網(wǎng)關(guān)以及工具,可幫助您進(jìn)行查詢(xú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ì)于傳入的查詢(xún),聯(lián)合網(wǎng)關(guān)能夠構(gòu)建查詢(xún)計(jì)劃以調(diào)用所需的服務(wù),借此完成查詢(xún)操作。每項(xiàng)服務(wù)又需要能夠響應(yīng) _entities 查詢(xún),以便在一定程度上完成對(duì)所擁有數(shù)據(jù)的查詢(xún)。

下面以 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)合查詢(xún)加以測(cè)試,借此為基于 schema 的服務(wù)生成 _entities 查詢(xún)。

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)。我們將這套體系稱(chēng)為 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ì)的各位同事,他們與我們共同完成了這段奇妙的探索之旅。最后,我們還要感謝各位用戶(hù)給出的及時(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è)人觀(guān)點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!

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

LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動(dòng)電源

在工業(yè)自動(dòng)化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動(dòng)力設(shè)備,其驅(qū)動(dòng)電源的性能直接關(guān)系到整個(gè)系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動(dòng)勢(shì)抑制與過(guò)流保護(hù)是驅(qū)動(dòng)電源設(shè)計(jì)中至關(guān)重要的兩個(gè)環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動(dòng)性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動(dòng)電源

LED 驅(qū)動(dòng)電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個(gè)照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動(dòng)電源易損壞的問(wèn)題卻十分常見(jiàn),不僅增加了維護(hù)成本,還影響了用戶(hù)體驗(yàn)。要解決這一問(wèn)題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動(dòng)電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動(dòng)電源的公式,電感內(nèi)電流波動(dòng)大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動(dòng)電源

電動(dòng)汽車(chē)(EV)作為新能源汽車(chē)的重要代表,正逐漸成為全球汽車(chē)產(chǎn)業(yè)的重要發(fā)展方向。電動(dòng)汽車(chē)的核心技術(shù)之一是電機(jī)驅(qū)動(dòng)控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動(dòng)系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動(dòng)汽車(chē)的動(dòng)力性能和...

關(guān)鍵字: 電動(dòng)汽車(chē) 新能源 驅(qū)動(dòng)電源

在現(xiàn)代城市建設(shè)中,街道及停車(chē)場(chǎng)照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢(shì)逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動(dòng)電源 LED

LED通用照明設(shè)計(jì)工程師會(huì)遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動(dòng)電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動(dòng)電源的電磁干擾(EMI)問(wèn)題成為了一個(gè)不可忽視的挑戰(zhàn)。電磁干擾不僅會(huì)影響LED燈具的正常工作,還可能對(duì)周?chē)娮釉O(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來(lái)解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動(dòng)電源

開(kāi)關(guān)電源具有效率高的特性,而且開(kāi)關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動(dòng)電源

關(guān)鍵字: LED 驅(qū)動(dòng)電源 開(kāi)關(guān)電源

LED驅(qū)動(dòng)電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動(dòng)LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動(dòng)電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動(dòng)電源
關(guān)閉