2016-06-28 17 views
69

私は、MicroSQLアーキテクチャでGraphQLが最も適している場所を理解しようとしています。GraphQLとマイクロサービスアーキテクチャ

APIゲートウェイとして機能するGraphQLスキーマが1つしかないと、対象となるマイクロサービスへの要求をプロキシしてその応答を強制するという議論がいくつかあります。マイクロサービスは依然としてコミュニケーション思考のためにREST/Thriftプロトコルを使用します。

もう1つのアプローチは、マイクロサービスごとに複数のGraphQLスキーマを用意することです。要求のすべての情報+ GraphQLクエリを使用して、対象のマイクロサービスに要求をルーティングする、より小さいAPIゲートウェイサーバを有する。 APIとして

第一アプローチ1 GraphQLスキーマを持つ

ゲートウェイは、あなたのmicroservice契約入力/出力を変更するたびに、我々はAPI Gatewayのサイドに応じGraphQLスキーマを変更する必要が欠点を持っています。

2アプローチ

microservicesあたり複数GraphQLスキーマを使用している場合GraphQLはスキーマ定義を適用し、そして消費者がmicroserviceから与えられた入力/出力を尊重する必要があるため、方法で意味をなします。

質問

  • どこGraphQLにmicroserviceアーキテクチャを設計するための右の適合を見つけるのですか?

  • 可能なGraphQL実装でAPIゲートウェイをどのように設計しますか?

答えて

119

確実にアプローチ#1。

クライアントが複数のGraphQLサービス(アプローチ#2のように)を話すことは、まず最初に、のアプリケーションデータ全体にスキーマを提供してGraphQLを使用する目的を完全に破ります。シングルラウンドトリップ。

シェアード・ナッシングアーキテクチャはmicroservicesの観点から合理的に思えるかもしれない持っていますが、あなたのmicroservicesの1つを変更するたびに、あなたがのすべてを更新する必要があるため、クライアント側のコードのためには、絶対的な悪夢でありますあなたのクライアント。あなたは間違いなくそれを後悔します。

GraphQLとマイクロサービスは、クライアントからのマイクロサービスアーキテクチャがあるという事実を隠しているため、完璧です。バックエンドの観点からは、すべてをマイクロサービスに分割する必要がありますが、フロントエンドの観点からは、すべてのデータを単一のAPIから取得したいと考えています。 GraphQLを使用することが私が知っている最良の方法です。両方を行うことができます。これにより、バックエンドをマイクロサービスに分割しながら、すべてのアプリケーションに単一のAPIを提供し、異なるサービスからのデータを結合することができます。

マイクロサービスにRESTを使用したくない場合は、それぞれ独自のGraphQL APIを持つことができますが、APIゲートウェイは残しておく必要があります。人々がAPIゲートウェイを使用する理由は、マイクロサービスパターンにうまく適合するためではなく、クライアントアプリケーションからマイクロサービスをより管理しやすくするためです。

+3

+1私は私が代わりに応答、GraphQLと経験を持っていませんでしたその私のポストに免責事項を入れている必要がありますその質問に答えるための研究中の非常に短い読み物に基づいています。私はこの答えがOPの質問をよりよく扱うと思う。 –

+1

@helfer:これは本当に感謝します:)ありがとう。私はこの豪華な答えの上にいくつか質問があります。 - GraphQLをAPIゲートウェイとして使用する必要がありますか? - 私は** Order ** Microserviceを持っているとしましょう。これは、RESTまたはGraphQLエンドポイントのいずれかを公開します。私がそれを終了したら、メインのGraphQLスキーマを更新して、マイクロサービスが公開するデータと全く同じデータを反映させる必要があります。独立した展開が必要なマイクロサービス文化から重複して移動したり離れることはありませんか?マイクロサービスへの変更は、メインのGraphQLスキーマに反映/複製する必要がありますか? – Fabrizio

+5

@Fabrizio GraphQLの素晴らしい点は、RESTサービスが以前に公開したデータを取得する方法がある限り、バックエンドのREST APIが変更されても、GraphQLスキーマは変わりません。より多くのデータを公開する場合、これを処理する標準的な方法は、既存のスキーマに新しいフィールド/タイプを追加することです。 GraphQLを作成したFacebookの人々は、4年間でスキーマを一変させたことはないと私に語った。彼らが行ったすべての変更は相加的でした。つまり、新しいクライアントは新しい機能を使用でき、古いクライアントは引き続き機能します。 – helfer

-1

マイクロサービスの詳細については、Graphlessもサーバーレスアーキテクチャでも機能すると思います。私はGraphQLを使用しませんが、my own similar projectがあります。私はaggregatorとしてそれを使用し、多くの関数を呼び出して単一の結果に集中させます。 GraphQLにも同じパターンを適用できると思います。

1

アプローチ#2では、迷惑なAPIゲートウェイを手動で維持するよりもずっと簡単なので、実際にはそれを選択します。このようにして、独自にサービスを開発することができます。人生をはるかに簡単にする:P

スキーマを1つにまとめるための素晴らしいツールがいくつかあります。 graphql-weaverとアポロのgraphql-toolsは、私はgraphql-weaverを使用しています。使いやすく、うまく動作します。

0

マイクロサービスアーキテクチャには適切な定義がないため、このスタイルの具体的なモデルはありませんが、ほとんどの特徴はほとんどありません。マイクロサービスアーキテクチャの場合、各サービスは個々の小さなコンポーネントこれは、アプリケーションの整合性に影響を与えずに個々に調整して展開することができます。これは、アプリケーションの再デプロイメントを行わずにカスタムのmicroservices app developmentを実行するだけで、いくつかのサービスを簡単に変更できることを意味します。

関連する問題