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

レッスン 8: リバース プロキシと API ゲートウェイ

リバース プロキシ: SSL 終端、圧縮、セキュリティ。 API ゲートウェイ パターン: ルーティング、認証、レート制限、スロットル。 Nginx、Envoy、Kong、AWS API Gateway を比較します。サービス メッシュの概念 (Istio、Linkerd)。 BFF (フロントエンド用バックエンド) パターン。

🏗️ アーキテクチャ — レッスン 8 レッスン 8: リバース プロキシと API ゲートウェイ

システムアーキテクチャ: ゼロからヒーローへ

パート 2: インフラストラクチャ コンポーネント

xdev.asia

はじめに

リバース プロキシと API ゲートウェイは、クライアントとバックエンド サーバーの間にある 2 つのコンポーネントです。これらは、あらゆる運用システムに必要なセキュリティ、ルーティング、および横断的な懸念を提供します。


1. リバースプロキシ

1.1 フォワード プロキシとリバース プロキシ

Forward Proxy (đại diện cho client):
  Client ──► Proxy ──► Internet ──► Server
  Ví dụ: VPN, Corporate proxy

Reverse Proxy (đại diện cho server):
  Client ──► Internet ──► Reverse Proxy ──► Backend Servers
  Ví dụ: Nginx, HAProxy, Cloudflare

1.2 主な機能

┌──────────────────────────────────────────────┐
│              Reverse Proxy                    │
│  ┌──────────────────────────────────────┐    │
│  │ SSL/TLS Termination                   │    │
│  │ → HTTPS decrypt tại proxy             │    │
│  │ → Backend dùng HTTP (nhanh hơn)       │    │
│  ├──────────────────────────────────────┤    │
│  │ Compression (gzip, brotli)            │    │
│  │ → Nén response trước khi gửi client   │    │
│  ├──────────────────────────────────────┤    │
│  │ Static File Serving                   │    │
│  │ → Serve HTML, CSS, JS, images         │    │
│  ├──────────────────────────────────────┤    │
│  │ Caching                               │    │
│  │ → Cache responses, giảm backend load  │    │
│  ├──────────────────────────────────────┤    │
│  │ Security                              │    │
│  │ → Hide backend topology               │    │
│  │ → Rate limiting, IP blocking, WAF     │    │
│  └──────────────────────────────────────┘    │
└──────────────────────────────────────────────┘

2. API ゲートウェイ

2.1 API ゲートウェイ パターン

                    ┌─────────────────┐
  Mobile App ──────►│                 │──► User Service
  Web App ─────────►│   API Gateway   │──► Order Service
  Partner API ─────►│                 │──► Payment Service
  IoT Device ─────►│                 │──► Notification Service
                    └─────────────────┘

2.2 APIゲートウェイ機能

機能説明
リクエストルーティングルート /users/* → ユーザー サービス、/orders/* → 注文サービス
認証JWT トークン、API キーの検証を検証する
承認アクセス許可、RBAC を確認する
レート制限API キーごとに 100 リクエスト/分
リクエスト/レスポンス変換形式の変更、ヘッダーの追加/削除
サーキットブレーカーサービスがダウンしている場合はリクエストを停止します。
ロギングとモニタリングアクセス ログ、メトリクス、トレース
API のバージョン管理/v1/ユーザー、/v2/ユーザー

2.3 レート制限アルゴリズム

Token Bucket:
  Bucket chứa N tokens, refill rate = R tokens/giây
  Mỗi request lấy 1 token
  Hết tokens → 429 Too Many Requests

  Ví dụ: 100 tokens, refill 10/s
  T=0:  100 tokens
  T=0:  Burst 100 requests → 0 tokens
  T=1:  10 tokens refilled
  T=10: 100 tokens lại

Sliding Window:
  Đếm requests trong window N giây gần nhất
  Mỗi request mới: count++ nếu count < limit
  → Chính xác hơn Token Bucket

3. BFF (フロントエンド用バックエンド)

3.1 問題

Mobile App cần:  { name, avatar }     ← Ít data, bandwidth thấp
Web App cần:     { name, avatar, posts, friends, settings }  ← Đầy đủ
Admin Panel cần: { name, email, role, audit_log, permissions } ← Khác

Nếu dùng chung 1 API:
  → Mobile nhận thừa data (waste bandwidth)
  → Web phải gọi nhiều APIs (nhiều roundtrips)

3.2 BFF ソリューション

         ┌────────────┐
Mobile ──►│ Mobile BFF │──► User Service
         └────────────┘──► Post Service
         ┌────────────┐
Web ─────►│  Web BFF   │──► User Service
         └────────────┘──► Post Service
                        ──► Friend Service
         ┌────────────┐
Admin ───►│ Admin BFF  │──► User Service
         └────────────┘──► Audit Service

各 BFF は、特定のクライアントの応答を最適化します。


4. サービスメッシュ

4.1 サービス メッシュとは何ですか?

Không có Service Mesh:
  Service A ──► Service B
  Mỗi service phải tự implement:
  retry, timeout, circuit breaker, mTLS, tracing, metrics

Có Service Mesh:
  Service A ──► Sidecar Proxy A ──► Sidecar Proxy B ──► Service B
  Sidecar proxy xử lý tất cả cross-cutting concerns

┌─────────────────┐       ┌─────────────────┐
│  Pod A          │       │  Pod B          │
│ ┌─────┐ ┌────┐ │       │ ┌────┐ ┌─────┐ │
│ │App A│ │Envoy│◄├───────├►│Envoy│ │App B│ │
│ └─────┘ └────┘ │       │ └────┘ └─────┘ │
└─────────────────┘       └─────────────────┘

4.2 Istio 対 Linkerd

特長イスティオリンカード
プロキシ特使linkerd2-proxy (Rust)
複雑さ曹操低い
パフォーマンス中程度より良い
特徴たくさん集中
こんな用途に最適エンタープライズ、複雑なニーズシンプルなサービスメッシュ

5. API ゲートウェイ ソリューションの比較

ソリューションタイプこんな方に最適
Nginxリバースプロキシ + LBシンプルなルーティング、静的ファイル
コンフル API ゲートウェイプラグイン エコシステム、マルチクラウド
特使L7プロキシサービスメッシュ、gRPC
AWS API ゲートウェイ管理AWS エコシステム、サーバーレス
トレフィククラウドネイティブKubernetes、自動検出
APISIXAPIゲートウェイパフォーマンス、Lua プラグイン

6. ハンズオン: Nginx を使用した API ゲートウェイ

# API Gateway configuration

# Rate limiting
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;

# Upstream services
upstream user_service {
    server 10.0.1.1:8001;
    server 10.0.1.2:8001;
}

upstream order_service {
    server 10.0.2.1:8002;
    server 10.0.2.2:8002;
}

server {
    listen 443 ssl http2;
    server_name api.xdev.asia;

    # SSL Termination
    ssl_certificate /etc/ssl/certs/api.crt;
    ssl_certificate_key /etc/ssl/private/api.key;

    # Compression
    gzip on;
    gzip_types application/json;

    # API Routing
    location /api/v1/users {
        limit_req zone=api burst=20 nodelay;
        proxy_pass http://user_service;
        proxy_set_header Authorization $http_authorization;
    }

    location /api/v1/orders {
        limit_req zone=api burst=20 nodelay;
        proxy_pass http://order_service;
        proxy_set_header Authorization $http_authorization;
    }

    # Health check
    location /health {
        return 200 '{"status":"ok"}';
        add_header Content-Type application/json;
    }
}

概要

コンポーネント役割いつ使用するか
リバースプロキシSSL、キャッシュ、セキュリティ常に本番環境
APIゲートウェイルーティング、認証、レート制限マイクロサービスアーキテクチャ
親友クライアントの種類ごとに最適化する複数のクライアント タイプ
サービスメッシュ横断的な懸念事項大規模なマイクロサービス (50 以上のサービス)

演習

  1. API ゲートウェイの設計: 5 つのバックエンド サービスを備えた電子商取引アプリケーション用の API ゲートウェイを設計します。ルーティング ルール、レート制限、認証戦略を定義します。

  2. BFF と単一 API: システムにはモバイル アプリ、Web アプリ、スマート TV アプリがあります。各プラットフォームには異なるデータが必要です。各プラットフォームのデータ マッピングを使用して BFF アーキテクチャを設計します。

  3. レート制限: 擬似コードを使用してトークン バケット アルゴリズムを実装します。バケットサイズ = 100、補充速度 = 10 トークン/秒。