Chuyển đến nội dung chính

レッスン 5: API 設計マスタークラス — REST、GraphQL、gRPC

REST、GraphQL、gRPC の詳細な比較: ユースケース、パフォーマンス、トレードオフ。 RESTful API のベスト プラクティス、GraphQL スキーマ設計、プロトコル バッファーを使用した gRPC。 API のバージョン管理戦略と下位互換性。

🏗️ アーキテクチャ — レッスン 5 レッスン 5: API 設計マスタークラス — REST、 GraphQL と gRPC

マイクロサービスとマイクロ フロントエンドのシステム設計 — 基本から運用まで

パート 2: マイクロサービス バックエンドの設計

xdev.asia

はじめに

API は、サービス間、およびバックエンドとフロントエンド間のコントラクトです。適切な API スタイルと適切な設計を選択することが、マイクロサービス アーキテクチャの成功か失敗かを決定します。この記事では、最も人気のある 3 つの API スタイルと、各ユースケースに適切な API スタイルを選択する手順について詳しく説明します。


1. REST API — デフォルトの選択

1.1 RESTful ベストプラクティス

リソースベースの URL:

GET    /api/v1/products              → List products
GET    /api/v1/products/{id}         → Get product
POST   /api/v1/products              → Create product
PUT    /api/v1/products/{id}         → Update product
PATCH  /api/v1/products/{id}         → Partial update
DELETE /api/v1/products/{id}         → Delete product
GET    /api/v1/products/{id}/reviews → Nested resource

ページネーション (カーソルベース):

{
  "data": [...],
  "pagination": {
    "next_cursor": "eyJpZCI6MTAwfQ==",
    "has_more": true,
    "total": 1500
  }
}

標準エラー応答:

{
  "error": {
    "code": "PRODUCT_NOT_FOUND",
    "message": "Product with id '123' not found",
    "details": []
  }
}

1.2 API のバージョン管理戦略

戦略例長所短所
URL パス/api/v1/products明示的でルーティングが簡単URLの変更
ヘッダーAccept: application/vnd.api.v2+jsonクリーンな URL非表示
クエリパラメータ/api/products?version=2シンプル乱雑

推奨: URL パスのバージョン管理 — シンプル、明確、API ゲートウェイでのルーティングが簡単です。

1.3 REST を使用する場合

  • サードパーティ向けのパブリック API
  • シンプルなCRUD操作
  • クリティカル キャッシュ (HTTP ネイティブ キャッシュ)
  • 馴染みのあるチーム、成熟したツール

2. GraphQL — 柔軟なクエリ

2.1 マイクロ フロントエンドに GraphQL を使用する理由

各マイクロ フロントエンドには、同じサービスからの異なるデータが必要です。

# Product MFE (cần đầy đủ thông tin)
query ProductDetail {
  product(id: "123") {
    id, name, description, price
    images { url, alt }
    reviews { rating, comment, user { name } }
    relatedProducts { id, name, price }
  }
}

# Cart MFE (chỉ cần tên + giá)
query CartItem {
  product(id: "123") {
    id, name, price, thumbnail
  }
}

→ GraphQL は、オーバーフェッチ (REST が返す数が多すぎる) と アンダーフェッチ (REST が多くのエンドポイントを呼び出す必要がある) に対処します。

2.2 スキーマ設計のベスト プラクティス

type Product {
  id: ID!
  name: String!
  slug: String!
  price: Money!
  images: [Image!]!
  category: Category!
  reviews(first: Int, after: String): ReviewConnection!
}

type Money {
  amount: Float!
  currency: Currency!
}

type ReviewConnection {
  edges: [ReviewEdge!]!
  pageInfo: PageInfo!
}

2.3 GraphQL を使用する場合

  • フロントエンドにはデータ取得の柔軟性が必要です
  • 複数のフロントエンド クライアントが異なるデータを必要とする
  • BFF レイヤーまたは API ゲートウェイ アグリゲーション
  • 複雑な入れ子になったデータ関係

3. gRPC — 高性能内部

3.1 プロトコルバッファ

// product.proto
syntax = "proto3";

service ProductService {
  rpc GetProduct(GetProductRequest) returns (Product);
  rpc ListProducts(ListProductsRequest) returns (stream Product);
  rpc CreateProduct(CreateProductRequest) returns (Product);
}

message Product {
  string id = 1;
  string name = 2;
  double price = 3;
  repeated string image_urls = 4;
}

message GetProductRequest {
  string id = 1;
}

3.2 gRPC の利点

  • JSON シリアル化 (バイナリ形式) より ~10 倍高速
  • HTTP/2: 多重化、ヘッダー圧縮
  • 強い型付け: 生成されたコード、コンパイル時チェック
  • 双方向ストリーミング: リアルタイム データ フロー

3.3 gRPC を使用する場合

  • サービス間 通信 (内部のみ)
  • 高スループット、低遅延の要件
  • ストリーミング データ (リアルタイム更新、ログ)
  • Polyglot: Go、Java、Python、Node.js のコード生成

4. 意思決定マトリックス

基準休憩グラフQLgRPC
主な用途外部 API、CRUDフロントエンドクエリサービス間
パフォーマンス良い良い素晴らしい
キャッシングHTTP ネイティブ複雑な (永続的なクエリ)マニュアル
学習曲線低い中高
フロントエンドに優しいはいとてもいいえ (プロキシが必要)
ストリーミングSSE/WebSocket定期購読ネイティブ
ツーリング素晴らしい良い成長中
ブラウザのサポートネイティブネイティブgRPC-Web が必要

4.1 電子商取引プラットフォームに関する推奨事項

Client → Shell/MFE:     GraphQL (flexible, typed)
MFE → BFF/Gateway:      REST hoặc GraphQL
Gateway → Services:      REST (simple CRUD) + gRPC (high-perf)
Service → Service:       gRPC (internal) + Events (async)

概要

  • REST: 外部 API と単純な CRUD のデフォルトの選択
  • GraphQL: マイクロ フロントエンドに最適 — オーバーフェッチ/アンダーフェッチを軽減します
  • gRPC: サービス間の王様 — 高速、型付き、ストリーミング
  • 実際: 正しい使用例には 3 つすべてを組み合わせて使用してください

次の記事: レッスン 6: サービス間通信 — 同期、非同期、およびイベント駆動型