Grapql APIゲートウェイによるマイクロサービスアーキテクチャの改善


執筆Alec Brunelle ✏️
組織が成長するにつれて、複数のAPIサービスが作成されるのが一般的です.これらのサービスと並んで、お客様の製品を使用するユーザーのさまざまなクライアントアプリケーションを提供する必要があります.最終的に、アーキテクチャは次のようになります.

すべてのクライアントアプリケーションのニーズが異なる
これが起こる理由がたくさんあります.時間とともに、チーム構造はサービス作成を指示したかもしれません、そして、その時、それは、サービス所有権にチームのウェブを持つ代わりに、一つのチームが一つのコードベースを所有するのをより簡単でした.
別の理由は、お客様の製品のさまざまな機能が異なるスケーリングの懸念を持っていた可能性があります.たとえば、あなたのAnalyticsスタックは、ユーザーのログインスタックよりも大きなニーズを持っているかもしれません.
理由が何であれ、このタイプのアーキテクチャはバックエンドサービスチームとフロントエンドクライアントチームの両方の将来の開発を遅らせるでしょう.クライアントアプリケーションは、複数のプロトコルとのインターフェイスを必要とする、さまざまな認証戦略を使用して、どのAPIのデータの種類を与える心配し、潜在的に単一のページのデータを取得するために複数のAPI呼び出しを行う.
すべてのAPIサービスをリファクタリングする代わりに、または全体のアーキテクチャを再構築-高価で危険な-API gateways この状況で助けることができます.

GraphSQL APIゲートウェイとは


APIゲートウェイは、何も新しいサービスに新しいです.私は多くの開発者がクライアントのアプリケーションの複数のソースからデータを取得するための単一のインターフェイスを提供するためにそれらを使用して見てきた.
彼らは、単一のAPIプロトコル、単一のAuthメカニズムを提供することによって以前に説明された問題を解決することができます、そして、クライアントが新しい特徴を開発するとき、クライアントだけが1つのチームに話す必要があることを確実とします.
一方、GraphSQL APIゲートウェイを使用すると、最近人気が高まっている比較的新しい概念です.これは、GraphSQLがAPIゲートウェイに美しく自分自身を貸すいくつかのプロパティを持っているためです.
GraphSQL APIゲートウェイは、多くの異なるマイクロサービス全体から単一の定義されたスキーマとソースデータを持つことができます.したがって、クライアントはデータがどこから来ているかを知らずにフィールドの組み合わせを問い合わせることができます.
この機能を使用すると、データを取得する方法を発見するのは誰と話をするの質問ではなく、どこに住んでいるGraphQL schema .

開発に役立つJavaScriptパッケージがたくさんあります.いくつかは、GraphSQL APIゲートウェイを実装するための抽象化の層を提供します.

GraphSQLゲートウェイによるスキーマのステッチ


我々は今、オペレーションを受信して、新しいレガシーサービスからデータを返すことに責任があるAPIゲートウェイサービスを必要とします.この方法は2つの方法で行うことができます.schema stitching or federation .
時間のために、我々はより密接にスキーマ縫い目を見ますGraphQL federation in this article .
JavaScriptパッケージを使用するには、独自のカスタムノードを書くことができます.のようなJSのグラフィカルなサーバーApollo Server or Mercurius , クライアントから来ているGraphSQL操作を解釈するコードを記述する場合、クライアントに期待するものにマップされたデータを返します.
このアプローチは、時間が集中的ですが、あなたの状況に応じて意味があります.利点は、それがあなたの組織とベストプラクティスに具体的に調整することができるということです.

GraphSQLメッシュをGraphSQL APIゲートウェイとして使用する


ライブラリのようなGraphQL Mesh , 一方、自動的に1つの単一のGraphSQL APIに複数のデータソースをステッチします.これは開発時間を節約することができます、しかし、あなたのために多くをするライブラリのように、あなたはカスタムオーバーライドを提供する必要があるかもしれません.
GraphSQLメッシュは、私たちのGraphSQL APIゲートウェイだけでなく、データマッパーとしても動作します.これはOpenAPI/Swaggerの残りのAPI、GRPC API、データベース、Graphql(明らかに)などのさまざまなデータソースをサポートしています.それはこれらのデータソースを取り、それらをgraphql APIに変えて、そして、一緒にステッチします.
このようなライブラリの電源を発揮するには、シンプルなSpaceXフライトジャーナルAPIを作成します.我々のアプリは、我々は長年にわたって出席すべての宇宙船を起動します.ここではGitHub repo このプロジェクトのために.
私たちのアプリは2つのデータソースを使用します.
GraphSQLのSpaceX APIは、プロキシ(すべての操作名は同じです)を介して私たちに利用可能になりますが、GraphSQLメッシュは私たちのMongoDBのデータベース接続のための新しい操作を与える.それは我々がユーザーを作成し、我々が参加した起動をマークさせます.
まず、ライブラリをインストールします
npm install @graphql-mesh/cli @graphql-mesh/graphql @graphql-mesh/mongoose graphql mongoose
さて、MongoDBスキーマを記述する基本的なマングースモデルを作成します.
// ./src/models.js
const { model, Schema } = require("mongoose");
const UserSchema = new Schema(
  {
    name: {
      type: String,
    },
  },
  {
    collection: "users",
  }
);
const User = model("User", UserSchema);
const LaunchesAttendedSchema = new Schema(
  {
    spacexLaunchID: {
      type: String,
    },
    userId: { type: "ObjectId", ref: "User" },
  },
  {
    collection: "launches_attended",
  }
);
const LaunchesAttended = model("LaunchesAttended", LaunchesAttendedSchema);
module.exports = {
  User,
  LaunchesAttended,
};
次に、GraphSQLメッシュ設定ファイルを作成します..meshrc.yaml :
// .meshrc.yml
sources:
  - name: SpaceX
    handler:
      graphql:
        endpoint: https://api.spacex.land/graphql/
        method: POST
  - name: Mongoose
    handler:
      mongoose:
        connectionString: mongodb://admin:password@localhost:27017/test?authSource=admin&readPreference=primary&appname=MongoDB%20Compass&directConnection=true&ssl=false
        models:
          - name: User
            path: ./src/models.js#User
          - name: LaunchesAttended
            path: ./src/models.js#LaunchesAttended
Dockerの作成によるMongoDBデータベースの作成example docker-compose.yml here ):
docker-compose up mongo
そして、それ!以下のように新しいGraphSQLサーバを提供します.
./node_modules/.bin/graphql-mesh serve
これにより、GraphSQLインスタンスが表示されます.これは、GraphSQLサーバーを問い合わせるための素晴らしいインターフェイスです.Docのサイドバーをクリックし、利用可能なオプションを調べます.あなたは、我々は過去の起動を参照する方法があることに気づくでしょう.

我々の新しい能力をテストするために、我々は過去の発射のために質問することができますid リストから、SpaceX起動リファレンスへのユーザーのMongoDBデータベースの行を作成します.
まず、ユーザを作成します
mutation CreateUser($input: CreateOneUserInput!) {
  userCreateOne(record: $input) {
    recordId
  }
}
さて、過去の起動を取得します.
query PastLaunches {
  launchesPast(limit: 10) {
    mission_name
    id
    launch_date_local
  }
}
として起動をマーク:
mutation LaunchesAttendedCreateOne($input: CreateOneLaunchesAttendedInput!) {
  launchesAttendedCreateOne(record: $input) {
    recordId
  }
}
最後に、出席したすべての前の起動を参照してください
query LaunchesAttended {
  launchesAttendedFindMany {
    spacexLaunchID
    userId
  }
}

結論


短い時間(およびいくつかの設定ファイルの後)では、我々はGloql APIゲートウェイを構築し、SpaceX Graphics APIとローカルのGogoDBデータベースから生成されたGraphSQL APIを構築することができました.このユースケースは、Graphゲートウェイがクライアントの開発者経験にどのように強力であるかを示すデモでした.
このゲートウェイがなければ、クライアントは2つのAPIを別々に問い合わせる必要がありました.代わりに、Grapqlメッシュはすぐに我々は我々のアプリは、ユーザー固有の機能を持って、我々のMongoデータベース上で実行することが基本的なcrud操作を生成する助けになりました.
全体的に、APIゲートウェイを使用する多くの方法と、パフォーマンス、セキュリティ、およびマルチチーム組織のために微調整することができる分散システムを構築するのを支援するために選択するライブラリの多面的です.

失敗したGraphSQLリクエストの監視に失敗しました


GraphSQLはデバッグ要求と応答のいくつかの機能を備えていますが、GraphSQLが確実にあなたの生産アプリケーションへのリソースを提供することを確認することは、物事がより厳しくなるところです.あなたがバックエンドまたはサードパーティサービスへのネットワーク要求を確実にすることに興味があるならば、成功してください.try LogRocket .

LogRocket ウェブアプリのDVRのように、あなたのサイトで起こる文字通りのすべてを記録してください.問題が起こる理由を推測するのではなく、あなたはすぐに根本的な原因を理解するために問題のGraphql要求について集計して報告することができます.また、アポロクライアントの状態を追跡し、GraphSQLクエリのキー値ペアを検査できます.
ページのロード時間などのベースラインのパフォーマンスのタイミング、最初のバイト、低速ネットワークのリクエストにログを記録するためにあなたのアプリケーションをログ出力器、およびまた、RUDX、NGRX、およびVUEXのアクション/状態を記録します.Start monitoring for free .