これは、システム アーキテクチャ設計における特定のトピックの要点を簡単に説明する一連の記事の続きです。最初の記事はここから読めます
API アーキテクチャとは、ソフトウェア コンポーネントがどのように対話するかを決定する一連のルール、プロトコル、およびツールを指します。 API のアーキテクチャは、通信を容易にするだけではありません。また、この通信が効率的、安全、スケーラブルであることを保証することも重要です。
適切に設計された API アーキテクチャはシステムのパフォーマンスを大幅に向上させることができますが、設計が不十分な API アーキテクチャはボトルネック、セキュリティの脆弱性、メンテナンスの悪夢につながる可能性があります。
最も一般的な API 設計スタイルは次のとおりです。
REST (Representational State Transfer) は、標準メソッドと HTTP プロトコルを使用する最もよく使用されるスタイルです。これは、ステートレス性、クライアント/サーバー アーキテクチャ、キャッシュ可能性などの原則に基づいています。フロントエンド クライアントとバックエンド サービスの間でよく使用されます。
GraphQLは API 用のクエリ言語です。リソースごとにエンドポイントの固定セットを公開する REST とは異なり、GraphQL ではクライアントが必要なデータを正確にリクエストできるため、オーバーフェッチが削減されます。
WebSocketは、TCP 経由の双方向通信を可能にするプロトコルです。クライアントは Web ソケットを使用して、バックエンド システムからリアルタイムの更新を取得します。
Webhook は、あるシステムが別のシステムに特定のイベントについてリアルタイムで通知できるようにするメカニズムです。これはユーザー定義の HTTP コールバックです。
RPC (gRPC) は、あるサービスがネットワーク内の別のコンピューターにあるサービスからプロシージャ/メソッドを要求するために使用できるプロトコルです。通常、低遅延、高速通信向けに設計されています。
SOAP は、 Web サービスを実装するために構造化された情報を交換するためのプロトコルです。 XML に依存しており、堅牢性とセキュリティ機能で知られていますが、現在はレガシー プロトコルと考えられています。
各プロトコルの長所、短所、使用例を個別に見てみましょう。
RESTは、標準的な規則とプロトコルを使用するアーキテクチャ スタイルであり、理解しやすく、実装しやすくなっています。ステートレスな性質と標準 HTTP メソッドの使用により、Web ベースの API を構築するための一般的な選択肢となっています。
REST は長い間 API を構築するための事実上の標準でしたが、GraphQL のような他のスタイルも登場し、データのクエリと操作のためのさまざまなパラダイムを提供しています。
形式: XML、JSON、HTML、プレーンテキスト
トランスポートプロトコル: HTTP/HTTPS
リソース: REST では、すべてがリソースです。リソースは、タイプ、関連データ、他のリソースとの関係、およびリソース上で動作する一連のメソッドを持つオブジェクトです。リソースは、その URI (通常は URL) によって識別されます。
CRUD 操作: REST サービスは多くの場合、リソースに対する CRUD (作成、読み取り、更新、削除) 操作に直接マップされます。
HTTP メソッド: REST システムは標準の HTTP メソッドを使用します。
GET: リソースを取得します。
POST: 新しいリソースを作成します。
PUT/PATCH: 既存のリソースを更新します。
DELETE: リソースを削除します。
ステータス コード: REST API は、標準の HTTP ステータス コードを使用して、API リクエストの成功または失敗を示します。
500内部サーバーエラー
501 - 未実装
502不正なゲートウェイ
503 - サービスが利用できません
504ゲートウェイのタイムアウト
ステートレス: クライアントからサーバーへの各リクエストには、リクエストを理解して処理するために必要なすべての情報が含まれている必要があります。サーバーは、リクエスト間のクライアントの状態について何も保存しないでください。
クライアントサーバー: REST はクライアントサーバーモデルに基づいています。クライアントはユーザー インターフェイスとエクスペリエンスを担当し、サーバーはリクエストの処理、ビジネス ロジックの処理、およびデータの保存を担当します。
キャッシュ可能: サーバーからの応答をクライアントがキャッシュできます。サーバーは、応答がキャッシュ可能かどうかを示す必要があります。
階層化システム: 通常、クライアントは、エンド サーバーに直接接続されているのか、仲介サーバーに接続されているのかを知ることができません。中間サーバーは、負荷分散を有効にし、共有キャッシュを提供することにより、システムのスケーラビリティを向上させることができます。
HATEOAS:アプリケーションのエンジンとしてのハイパーメディア Stat は、サーバーが応答で動的に提供するハイパーメディアに完全に基づいてクライアントが Web アプリケーションと対話し、ナビゲートできるようにする REST Web サービスの原則であり、疎結合と検出可能性を促進します。
リクエスト
「/user/42」を取得
応答
{ "id": 42, "name": "Alex", "links": { "role": "/user/42/role" } }
GraphQL は、特に複雑なシステムやフロントエンドに高い柔軟性が必要な場合に、API を構築するためのより柔軟で堅牢かつ効率的なアプローチを提供します。これにより、責任の一部がサーバーからクライアントに移され、クライアントがデータ要件を指定できるようになります。
すべてのシナリオで REST に代わるわけではありませんが、特にアプリケーションのネットワーク化と分散化が進むにつれて、多くの状況で魅力的な代替手段となります。
形式: JSON
トランスポートプロトコル: HTTP/HTTPS
リクエスト
GET “/graphql?query=user(id:42){ 名前 ロール { id 名 } }”
応答
{ "data": { "user": { "id": 42, "name": "Alex", "role": { "id": 1, "name": "admin" } } } }
WebSocket は、単一の存続期間の長い接続を介して全二重通信チャネルを提供し、クライアントとサーバー間のリアルタイムのデータ交換を可能にします。このため、インタラクティブで高性能な Web アプリケーションに最適です。
フォーマット: バイナリ
トランスポートプロトコル: TCP
リクエスト
「ws://site:8181」を取得します
応答
HTTP/1.1 101 スイッチングプロトコル
Webhookは、特定の Web アプリケーション イベントによってトリガーされるユーザー定義の HTTP コールバックで、リアルタイムのデータ更新と異なるシステム間の統合を可能にします。
形式:XML、JSON、プレーンテキスト
トランスポートプロトコル: HTTP/HTTPS
リクエスト
「 https://external-site/webhooks?url=http://site/service-h/api&name=name 」を取得します。
応答
{ "webhook_id": 12 }
RPC (リモート プロシージャ コール) は、プログラムが別のアドレス空間でプロシージャまたはサブルーチンを実行できるようにするプロトコルであり、分散システム間のシームレスな通信とデータ交換を可能にします。
gRPC (Google RPC) は、RPC 上に構築された最新のオープンソース フレームワークで、トランスポートに HTTP/2 を使用し、インターフェイス記述言語としてプロトコル バッファーを使用し、効率的で堅牢な通信を促進するための認証、ロード バランシングなどの機能を提供します。マイクロサービス間。
形式: JSON、XML、Protobuf、Thrift、FlatBuffers
トランスポートプロトコル:各種
リクエスト
{ "method": "addUser", "params": [ "Alex" ] }
応答
{ "id": 42, "name": "Alex", "error": null }
フォーマット: プロトバッファ
トランスポートプロトコル: HTTP/2
message User { int id = 1 string name = 2 } service UserService { rpc AddUser(User) returns (User); }
SOAPは Simple Object Access Protocol の略で、コンピュータ ネットワークで Web サービスを実装するために構造化された情報を交換するためのプロトコルです。これは、異なるオペレーティング システム上で実行されているプログラムが相互に通信できるようにする XML ベースのプロトコルです。
形式: XML
トランスポート プロトコル: HTTP/HTTPS、JMS、SMTP など
XML ベース: SOAP メッセージは XML でフォーマットされ、次の要素が含まれます。
Fault : メッセージの処理中のエラーに関する情報を提供するオプションの Fault 要素。
中立性: SOAP は任意のプログラミング モデルで使用でき、特定のプログラミング モデルに関連付けられません。
リクエスト
<?xml version="1.0"?> <soap:Envelope> <soap:Body> <m:AddUserRequest> <m:Name>Alex</m:Name> </m:AddUserRequest> </soap:Body> </soap:Envelope>
応答
<?xml version="1.0"?> <soap:Envelope> <soap:Body> <m:AddUserResponse> <m:Id>42</m:Id> <m:Name>Alex</m:Name> </m:AddUserResponse> </soap:Body> </soap:Envelope>
API アーキテクチャ スタイルの状況は多様であり、REST、SOAP、RPC などのさまざまなアプローチを提供しており、それぞれに独自の強みとユースケースがあるため、開発者は、異なるソフトウェア間のスケーラブルで効率的かつ堅牢な統合を構築するための最適なパラダイムを選択できます。コンポーネントとシステム。