Apollo
流れ
だいたいこんな感じ、のようにみえる。Apollo CLI を通してスキーマやクライアントの Operation を Apollo Engine に push できる。Server は API キーで認証されて Apollo Engine とやりとりして、Tracing やアクセス制御を行う。
https://gyazo.com/f0369dbf9739584e33ef0a2be4c6edfe
Apollo Platform
https://www.apollographql.com/docs/img/platform-diagram.png
OSS
Apollo Server JavaScript 製の GraphQL サーバー。プラグインで拡張しライフサイクルにフックして動作させることも可能。Lambda 等のサーバレス環境もサポートしている
Apollo Client アプリケーションのデータ, 状態管理を担う GraphQL クライアント。JS 製で React, React Native, Vue, Angular 等と連携が可能なものと、iOS/Android サポートのものがある
Apollo CLI Apollo Cloud Service へのアクセスを可能にする CLI
Apollo VSCode Extension エディタプラグイン
Cloud Services
Apollo Engine クラウドサービスのインタフェース
Schema Registry GraphQL スキーマ source of truth となるレジストリ。フィールドレベルの利用統計も含んでいる
Operation Registry GraphQL スキーマ操作のレジストリ
Trace Warehouse Apollo Server (Apollo trace API を実装したサーバ) の操作履歴を保持するデータのパイプライン/保持層
Gateway
Apollo Gateway
その他
graphql-tools Apollo のプラットフォームの1つではないが、Apollo 製の GraphQL.js 拡張として有名
クライアントの識別
識別方法
Apollo Platform では、クライアントは 名前 と バージョン の2つで識別される。これらはヘッダー情報に付加する。
code:クライアント.js
import { ApolloClient } from 'apollo-client';
import { HttpLink } from 'apollo-link-http';
const client = new ApolloClient({
link: new HttpLink({
uri: 'http://localhost:4000/graphql',
}),
name: 'insert your client name',
version: 'insert your client version',
});
サーバー側は、Apollo Engine にメトリクスを送信するために generateClientInfo を利用する。
code:サーバー.js
const { ApolloServer } = require('apollo-server');
const server = new ApolloServer({
typeDefs,
resolvers,
engine: {
apiKey: 'YOUR API KEY HERE',
generateClientInfo: ({
request
}) => {
const headers = request.headers;
return {
clientName: headers && headers'client-name' || 'Unknown Client',
clientVersion: headers && headers'client-version' || 'Unversioned',
};
},
},
});
server.listen().then(({ url }) => {
console.log(🚀 Server ready at ${url});
});
ユースケース
クライアントの識別
問題のあるクライアント (高コストなクエリを投げていたり、deprecated なフィールドを利用していたり) の追跡
どのフィールドがどのクライアントにどれくらい使われているかは、パッとわかるようになっている
https://www.apollographql.com/docs/img/client-awareness/field-usage.png
https://www.apollographql.com/docs/platform/client-awareness.html