Spring GraphQL與Netflix領域圖服務框架整合

banq發表於2024-04-10


有兩個相互競爭的GraphQL框架:

  • Netflix 於 2021 年初開源了域圖服務 (DGS) 框架。此後,該框架在 Netflix 和許多其他公司中得到了廣泛採用。DGS 框架為 Java 開發人員提供了基於 Spring Boot 的程式設計模型來建立 GraphQL 服務。
  • 在Netflix 開源 DGS 框架後不久, Spring 團隊為 Spring Boot 開發 GraphQL 框架的工作。Spring GraphQL 專案當時處於早期階段,提供了與graphql-java 的較低階別的整合。在過去的一年裡,Spring GraphQL 已經成熟,並且大部分功能與 DGS 框架相當。

新使用者必須在 DGS 框架和 Spring GraphQL 之間進行選擇。

DGS 框架和 Spring GraphQL 都是在graphql-java之上設計的,graphql-java 是負責執行 GraphQL 查詢的低階庫。

  • 在 Netflix,數百個應用程式使用 DGS 框架和自定義工具與 Netflix 的指標、跟蹤、安全等生態系統整合。
  • 從 Spring Boot 的角度來看,像 REST 一樣隨時提供 GraphQL 支援是有意義的,而不需要任何第三方框架。

DGS 框架
 DGS 框架高度模組化:

  1. 核心由 DGS API 及其註釋組成,例如 @DgsComponent 和 @DgsQuery、DGS 查詢執行器和 DGS 架構提供程式。 
  2. DGS 架構提供程式負責載入架構檔案並使用graphql-java連線資料獲取器。
  3. DGS 查詢執行器透過呼叫graphql-java的執行引擎來執行查詢。 DGS 查詢執行器 API 也可以在您的測試中獨立使用來執行 GraphQL 查詢。

框架的網路層與核心完全分離:

  • WebMVC 和 WebFlux 模組接收 HTTP/Websocket 請求,解析響應,並使用 DGS 查詢執行器執行查詢。

與 Spring GraphQL 整合後,我們現在可以同時支援 DGS 和 Spring GraphQL 程式設計模型:

  • DGS Schema Provider 仍然負責連線 DGS Framework 和 Spring GraphQL 的資料獲取器。
  • DGS 查詢執行器委託給 Spring GraphQL 的執行引擎,並且仍然存在主要是為了保持測試的向後相容性。
  • 最後,WebMVC/WebFlux 請求的處理完全由 Spring GraphQL 負責,並且不再使用 DGS 實現。

效能注意點:
使用 Spring GraphQL 的 HTTP 處理程式,我們已經隱式切換到非同步請求處理。不幸的是,我們許多現有服務的程式碼沒有明確的“AsyncAware”,導致由於多次執行過濾器而產生 CPU 開銷。

為了保持當前框架的效能,我們禁用了非同步請求處理,以便於採用。
如果需要,您可以使用配置屬性啟用非同步請求處理。

整合了 Spring GraphQL 的 DGS 框架現在與我們的基準一樣具有效能!

總結
隨著DGS Framework 8.5.0的釋出,我們的使用者可以訪問與 Spring GraphQL 的整合。
然這可能是整合的第一個版本,但我們花費了大量精力測試我們的應用程式,以確保我們有傳統 DGS 的直接替代品。

透過引入新的 Spring Boot 啟動器,使用者可以選擇加入 Spring GraphQL 整合。

相關文章