Netflix釋出用於Spring Boot的GraphQL的開源服務框架DGS

banq發表於2021-02-04

Netflix已經開發開源了 Domain Graph Service (DGS) framework。DGS框架簡化了針對獨立和聯合GraphQL服務的GraphQL的實現。
透過開源專案,希望為Java和GraphQL社群做出貢獻,並向每個將使用該框架使之變得更好的人學習並與之合作。
DGS框架的主要功能包括:
  • 基於註釋的Spring Boot程式設計模型
  • 用於將查詢測試編寫為單元測試的測試框架
  • Gradle程式碼生成外掛,可從GraphQL模式建立Java / Kotlin型別
  • 與GraphQL Federation輕鬆整合
  • 與Spring Security整合
  • GraphQL訂閱(WebSocket和SSE)
  • 檔案上傳
  • 錯誤處理
  • 自動支援介面/工會型別
  • Java的GraphQL客戶端
  • 可插拔儀器

 

為什麼Netflix需要DGS框架
我們在Spring Boot之上建立了我們的框架,它利用了graphql-java庫。該框架最初僅旨在內部使用,著重於與Netflix生態系統整合以進行跟蹤,日誌記錄,指標等。但是,始終將框架適當模組化始終是首要任務。很明顯,我們構建的許多框架實際上並不是特定於Netflix的。該框架主要只是構建GraphQL服務(獨立和聯合)的一種簡便方法。
 

模式schema優先於開發
GraphQL模式schema根據查詢和突變操作以及相關的型別和欄位來描述API。API使用者可以精確指定要在查詢中檢索的欄位,從而使GraphQL API非常靈活。模式使GraphQL如此強大並與REST不同。
GraphQL開發有兩種不同的方法:模式優先和程式碼優先的開發。透過進行模式架構優先的開發,您可以使用GraphQL架構語言手動定義API的架構。服務中的程式碼僅實現此架構。
使用程式碼優先開發,您沒有架構檔案。而是在執行時根據程式碼中的定義生成模式。
我們的框架支援模式優先和程式碼優先這兩種方法。在Netflix,我們強烈希望採用架構優先的開發方式,因為:

  1. 模式schema架構設計是開發人員體驗的重中之重。
  2. 它為工具使用模式提供了一種簡便的方法。
  3. 模式差異使向後不相容的更改更加明顯。在聯邦GraphQL架構中工作時,向後相容性甚至更為重要。

儘管從程式碼中生成模式可能會稍快一些,但花時間以易於理解的協作方式來設計模式是值得的,以爭取更好的API。
 

框架的核心
框架的核心圍繞Spring Boot開發人員所熟悉的基於註釋的程式設計模型進行。
讓我們來看一個示例,以向您展示使用此框架有多麼容易。
讓我們從一個簡單的模式schema開始。

type Query {
    shows(titleFilter: String): [Show]
}

type Show {
    title: String
    releaseYear: Int
}


要實現此API,我們需要編寫一個資料提取程式。

@DgsComponent
public class ShowsDatafetcher {
    
    private final List<Show> shows = 
      List.of(
         new Show("Stranger Things", 2016),
         new Show("Ozark", 2017)
     );
    
    @DgsData(parentType = "Query", field = "shows")
    public List<Show> shows(@InputArgument("titleFilter") String titleFilter) {
        if(titleFilter == null) {
            return shows;
        }
      
        return shows.stream()
            .filter(s -> s.getTitle().contains(titleFilter))
            .collect(Collectors.toList());
    }
}

Show型別是一個簡單的POJO,通常使用Gradle的DGS程式碼生成外掛生成 。用@DgsData註釋的方法為欄位實現資料獲取程式。請注意,我們不需要每個欄位都需要資料獲取程式,我們可以返回Java物件,框架將處理其餘的工作。框架還具有許多便利,例如本示例中使用的@InputArgument批註。
此程式碼足以使GraphQL端點執行。只需啟動Spring Boot應用程式,即可使用/ graphql端點。
另一個關鍵功能是支援輕量級查詢測試。這些測試使您無需使用HTTP端點即可執行查詢。這些測試看起來和感覺像普通的JUnit測試。

@SpringBootTest(classes = {DgsAutoConfiguration.class, ShowsDatafetcher.class})
class ShowsDatafetcherTest {
    @Autowired
    DgsQueryExecutor dgsQueryExecutor;
   
    @Test
    void shows() {
        List<String> titles = dgsQueryExecutor.executeAndExtractJsonPath(
             " { shows { title releaseYear }}",
             "data.shows<li>.title");
      
        assertThat(titles).contains("Ozark");
    }
}

有關該框架的完整文件,請參見DGS框架github儲存庫
 

適應GraphQL伺服器生態系統
那麼DGS框架如何完全適合現有的GraphQL生態系統?當前的生態系統包括伺服器,客戶端,聯合閘道器和工具,以幫助進行查詢測試,模式管理,程式碼生成等。在使用JVM構建GraphQL伺服器時,既有模式優先庫又有程式碼優先庫。
流行的程式碼優先庫是針對Kotlin的graphql-kotlingraphql-java在用Java實現模式優先的GraphQL API方面最受歡迎,但被設計為低階庫。
無論您使用Java還是Kotlin,我們的框架都提供了一種在Spring Boot中構建GraphQL服務的簡便方法。它可以用於構建獨立服務,也可以用於聯合GraphQL。
 
DGS框架提供了一種方便的方法來實現具有聯盟的GraphQL服務。聯合允許服務共享閘道器公開的統一圖。通常,服務使用Apollo的聯邦規範定義的@extends指令共享和擴充套件在統一模式中定義的型別。這是在微服務之間劃分大型整體GraphQL模式所有權的有效方法。
 
請在GitHub上檢視DGS框架專案。我們還有一個Gradle程式碼生成外掛,用於從GraphQL模式生成Java和Kotlin型別。

 

相關文章