🚀 Spring Framework 講座【特別編】ゼロから始めるマイクロサービス実践!〜Spring Cloud Gatewayの基本〜

docs

全50回を通して、Spring Bootを使った強固なアプリケーション構築技術を習得しました。最終回では、マイクロサービスクラウドネイティブといった次世代のアーキテクチャへの移行が重要であることを確認しました。

マイクロサービス環境では、アプリケーションが数十、数百と増えていきます。これらのサービスをクライアント(フロントエンドやモバイルアプリ)が個別に呼び出すのは非常に非効率です。

今回は、マイクロサービス群の単一の窓口となる重要なコンポーネント、**API Gateway(APIゲートウェイ)**のSpring Bootにおける標準的な実装 Spring Cloud Gateway の基本を学びます。


1. API Gatewayの役割

マイクロサービスアーキテクチャにおいて、API Gatewayはクライアントからのすべてのリクエストを受け付ける玄関のような存在です。an API Gateway architecture diagram showing all client requests going through the Gateway to reach various Microservicesの画像

Shutterstock

API Gatewayが担う主な役割は以下の通りです。

役割説明
ルーティング (Routing)リクエストを適切なマイクロサービスに振り分ける。
負荷分散 (Load Balancing)複数のインスタンスがあるサービスに対して負荷を均等に分散させる。
認証・認可 (Authentication/Authorization)共通のセキュリティチェックを一元的に行う。
レート制限 (Rate Limiting)クライアントごとのリクエスト数を制限し、バックエンドを保護する。

2. Spring Cloud Gatewayとは?

Spring Cloud Gatewayは、Spring WebFlux(第48回で学んだリアクティブ基盤)上に構築されており、ノンブロッキングI/Oで動作します。このため、少数のスレッドで大量の同時接続を高速に処理できる、高性能なゲートウェイを実現できます。

2-1. 導入方法

Gatewayを作成するには、専用のSpring Bootプロジェクトを立ち上げ、以下の依存関係を追加します。

Groovy

dependencies {
    // Spring Cloud Gatewayのスターター
    implementation 'org.springframework.cloud:spring-cloud-starter-gateway'
    
    // WebFluxの依存関係(Gatewayの基盤)
    implementation 'org.springframework.boot:spring-boot-starter-webflux' 
    
    // サービスディスカバリ(例: Eureka/Consulなど、今回は省略)
    // implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' 
}

3. ルーティングの基本設定

Spring Cloud Gatewayの設定の核となるのは、**ルーティング(経路)**の定義です。これは、主に $\text{application.yml}$ で行います。

3-1. ルートの構成要素

各ルートは以下の要素で構成されます。

  1. id: ルートを一意に識別するための名前。
  2. uri: リクエストの転送先(ターゲット)となるサービスのURL。
  3. predicates: リクエストを転送するかどうかを判断するための条件(述語)。
  4. filters: 転送前後にリクエスト/レスポンスを加工するための処理。

3-2. application.ymlでのルーティング設定例

ここでは、2つのマイクロサービス(ユーザーサービスと商品サービス)へのルーティングを設定します。

YAML

spring:
  cloud:
    gateway:
      routes:
        # --- ルート 1: ユーザーサービスへのルーティング ---
        - id: user_service_route
          # リクエストを転送するターゲットURI
          uri: http://localhost:8081 
          # 以下の条件にマッチした場合に転送する
          predicates:
            # パスが '/users/' で始まるもの全てにマッチ
            - Path=/users/**
          
        # --- ルート 2: 商品サービスへのルーティング ---
        - id: product_service_route
          uri: http://localhost:8082
          predicates:
            - Path=/products/**

この設定により、クライアントがGateway(例: $\text{http://localhost:8080}$)にアクセスした場合、以下の動作が実現します。

  • $\text{/users/1}$ へのリクエスト $\rightarrow$ $\text{http://localhost:8081/users/1}$ へ転送
  • $\text{/products/list}$ へのリクエスト $\rightarrow$ $\text{http://localhost:8082/products/list}$ へ転送

4. フィルターによるリクエストの加工

フィルターは、Gatewayの最も強力な機能です。リクエストがターゲットサービスに到達するや、レスポンスがクライアントに戻るに、共通のロジックを実行できます。

4-1. フィルターの例:レート制限(Rate Limiting)

全てのサービス共通で、クライアント(IPアドレス)ごとにリクエストの頻度を制限するフィルターの例です。

YAML

spring:
  cloud:
    gateway:
      # ... routes の定義は省略 ...
      default-filters:
        # RateLimiterフィルターを全てのルートに適用
        - name: RequestRateLimiter
          args:
            # 1秒間に最大10件のリクエストを許可
            redis-rate-limiter.replenishRate: 10 
            redis-rate-limiter.burstCapacity: 10
            # 制限対象のキー(ここではIPアドレスを使用)
            key-resolver: "#{@ipAddressResolver}" 

この設定により、バックエンドのマイクロサービスは、過剰なリクエストから守られ、安定性が向上します。

5. まとめ:マイクロサービスの基盤

Spring Cloud Gatewayは、マイクロサービスをデプロイする上で必須のコンポーネントです。クライアントとバックエンド間の複雑な通信を仲介し、セキュリティ、ルーティング、トラフィック管理といった横断的な関心事を一手に引き受けます。この知識は、あなたが今後クラウドネイティブな環境で大規模なシステムを設計・運用する上で、必ず役に立つでしょう。

✅ 本日のまとめ

  • API Gatewayは、マイクロサービスアーキテクチャにおける単一のアクセス窓口であり、ルーティング、認証、レート制限などを一元的に担う。
  • Spring Cloud Gatewayは、WebFlux上に構築された高性能なAPI Gatewayであり、ノンブロッキングで動作する。
  • ルーティングは $\text{application.yml}$ の $\text{spring.cloud.gateway.routes}$ 以下で定義し、Pathなどの predicates(条件)と転送先の uri(ターゲット)を指定する。
  • filters を使うことで、リクエストの転送前後に、レート制限($\text{RequestRateLimiter}$)やヘッダー操作といった共通の処理を適用できる。

全50回+特別編を通して、Spring Frameworkの奥深さと可能性を感じていただけたなら幸いです。あなたの今後のご活躍を心から応援しています!

コメント

タイトルとURLをコピーしました