Domain Graph Service (DGS) フレームワークを実装してからほんの数か月で、NetflixはJavaコミュニティにDGSをオープンソース化した。このフレームワークは、Spring BootアプリケーションのGraphQLの実装を容易にし、スタンドアロンとフェデレーションの両方のGraphQLサービスに適している。DGSは、GraphQL Federationをサポートし、さまざまなサービスで必要な特定のクエリをバックグラウンドで呼び出す1つの統合APIゲートウェイを作成する。
DGSフレームワークは、Spring Bootのアノテーションベースのモデルに基づく。ユニットテストフレームワークが提供され、Spring Securityと統合されている。監視は、メトリックおよびトレース機能を通じて利用できる。
DGSはNetflix内で使用され、さまざまな機能が徹底的にテストされている。内部的には、DGSはgraphql-java ライブラリを使用する。Netflixは、契約を定義するためにスキーマファーストの開発アプローチを推奨する。ツールでスキーマを使用できる。下位互換性が重要な特にフェデレーションGraphQLセットアップでは、さまざまなスキーマバージョンを比較することで検証できる。
RESTの代わりに、GraphQLはデータのオーバーフェッチまたはアンダーフェッチの問題を解決する。オーバーフェッチとは、エンドポイントからすべてのデータをフェッチすることだが、たとえばモバイルアプリケーションではそのデータの一部のみを使用する。これには、フィルタリングして残りのデータを未使用のままにしておく必要がある。アンダーフェッチとは、エンドポイントからすべてのデータをフェッチするが、十分なデータがないことだ。これは通常、2番目のエンドポイントへの呼び出しが必要だ。たとえば、エンドポイント /student
について考えてみる。あるユーザはすべての学生の電子メールアドレスを取得したい場合があり、別のユーザは学生が登録されているさまざまなクラスを取得したい場合がある。
スキーマファースト開発の代わりに、DGSフレームワークはコードファースト開発をサポートする。このアプローチでは、スキーマはコード内の定義に基づいて実行時に生成される。
DGSの実装は、APIを定義するスキーマを定義することから始める。GradleのDGS Code Generationプラグインを使用して、次のMovie
オブジェクトとQuery
オブジェクトに基づいてAPIを生成できる。
type Query {
movies(titleFilter: String): [Movie]
}
type Movie {
title: String
...
}
APIは、データフェッチャを使用して実装される。@DgsData
アノテーションが付けられたメソッドは、フィールドのオプションのデータフェッチャを実装する。
@DgsComponent
public class MoviesDatafetcher {
private final List<Movie> movies=
List.of(
new Movie("The Hitchhiker's Guide to the Galaxy", 2005)
);
@DgsData(parentType = "Query", field = "movies")
public List<Movie> movies(@InputArgument("titleFilter") String titleFilter) {
if(titleFilter == null) {
return movies;
}
return movies.stream()
.filter(s -> s.getTitle().contains(titleFilter))
.collect(Collectors.toList());
}
}
Spring Bootアプリケーションを起動すると、/graphql
エンドポイントが使用可能になる。GraphiQLクエリエディターは、/graphiql
エンドポイントを通して提供される。セキュリティ、メトリック、トレースなど、例を拡張するためのさまざまな機能を利用できる。
InfoQは、Netflixのシニアソフトウェアエンジニアであり、DGSのコミッタであるPaul Bakker氏と話をした。
InfoQ: Netflix内でのDGSの採用はいかがですか? ほとんどのサービスですでにそれを使用しているのでしょうか?
Paul Bakker氏: DGSフレームワークの開発は約18か月前に開始されました。約100のチームがそれを使用しており、その数はほぼ毎日増加しています。多くのDGSは「スタジオ」アプリのエコシステムをサポートするためのフェデレーショングラフの一部です。また、スタンドアロンサービスの使用も多く、コアNetflixサービスでもGraphQLの使用を実験しています。
InfoQ: DGSの最適なユースケースは何がありますか?
Bakker氏: GraphQLは、複数のクライアント/デバイスで使用できる柔軟なAPIを提供するのに非常に適しています。基本的には、これまでRESTを使用していたものなら何でも。さらに、多くのマイクロサービスの上にAPIレイヤを作成するための優れた方法であるGraphQLフェデレーションには非常に興奮しています。フェデレーションはDGSでは完全にオプションですが、うまく連携して機能することに注意してください。
Spring BootとJavaを使用している場合、DGSはGraphQLを開発するための優れた方法を提供します。
InfoQ: GraphQLやDGSの使用を勧めない場合はありますか?
Bakker氏: Netflixでは、サーバ間の通信にgRPCを主に使用しており、これを変更するつもりはありません。ただし、これは他の何よりもAPIスタイルの好みに関するもので、既存のエコシステムが非常に優れているためです。自分自身に問う最も重要な質問は、APIの対象ユーザがGraphQLを使用する準備ができているかどうかです。DGSフレームワークはSpring Boot専用に開発されているため、これが要件になります。
InfoQ: 実装するのが最も難しい機能とその理由は何ですか?
Bakker氏: このようなフレームワークの開発を開始するのは簡単ですが、さまざまなユーザやユースケースでうまく機能させるのは困難です。ユースケースとユーザとの多くの相互作用を調査するには時間がかかります。基本的に、フレームワークが現在の場所に到達するまでに18か月かかりましたが、本当に近道はありません。より技術的な観点からは、コード生成 (オプションですが、DGSにとって非常に便利です) をうまく機能させるのは困難でした。「メタコード」の作成とテストは理解することが難しく、確認すべきコーナケースは無数にあるようです。
InfoQ: これまでのコミュニティのフィードバックはいかがですか? 興味深い機能リクエストはありましたか?
Bakker氏: オープンソースのDGSを発表してからわずか1週間ですが、コミュニティの関与はすでに圧倒的であり、非常に前向きです。試している人からたくさんの質問があります。すでにこのフィードバックを使用してドキュメントをさらに改善し、進行中の議論に基づいてギャップを埋めています。新機能に関するいくつかの素晴らしいアイデアもあります。この種のエンゲージメントは、より多くのユーザから学ぶことでフレームワークをすべての人にとってより良いものにするために、オープンソースを決定した主な理由です。
InfoQ: 将来的にどのような新機能が期待できますか?
Bakker氏: WebFluxのサポートは、私たちが追加することを期待していることの1つです。現在、主にインフラストラクチャの他の部分のために、NetflixではWebFluxをまだ使用していませんが、それは変更される予定です。それ以外は、過去18か月で行ったのと同様に、さらに多くの機能と改善が追加されます。
Netflix DGSは、Apache2.0ライセンスの下でGitHubのオープンソースとして利用できます。
Netflix DGSは、Apache2.0ライセンスの下でGitHubのオープンソースとして利用できる。