Spring Cloud Gatewayを理解するための記事(始め方から諦めるまで)

まずゲートウェイとは何かを理解する

従来のモノリシック アプリケーションでは、すべてのリクエストが 1 つのアプリケーションによって処理されるため、ゲートウェイの概念はありません。ただし、マイクロサービス アーキテクチャでは、各サービスには外部サービスを提供するためのアドレスとポートがあり、許可の検証、ロギング、電流制限、サーキット ブレーカー、監視などのいくつかの共通機能があります。各サービスが独立してインターフェイスを提供できる場合。これらのインターフェイスの調整と管理は非常に煩雑になり、コードの重複が発生します。

ゲートウェイは、マイクロサービス アーキテクチャにおけるこれらの問題を解決するために使用されます。ゲートウェイは外部に統合インターフェイスを提供し、内部では登録センターとの対話を通じてリクエストを適切なサービスに転送します。ゲートウェイは、許可の検証、ロギング、電流制限、サーキット ブレーカー、監視などのいくつかの一般的な機能も担います。

ゲートウェイの概念を導入した後、各マイクロサービスは自身のビジネス ロジックにのみ注意を払う必要があり、他の機能に注意を払う必要はありません。マイクロサービスの操作は大幅に簡素化されます。

Spring Cloud Gateway は、Spring によって正式に開始された非常に人気のあるマイクロサービス ゲートウェイ フレームワークです。他のゲートウェイ サービス フレームワークと比較して、Spring クラウド ゲートウェイは使いやすく強力で、Spring クラウド エコシステムとの統合が簡単です。

すぐに始めましょう

Spring Cloud Gateway を始めるのはとても簡単です。すべてを学ぶ前に、簡単な例を見てみましょう。

スプリングブートプロジェクトを作成する

springInitializr を使用して Spring Boot プロジェクトを作成し、webflux とゲートウェイの依存関係を選択します。

簡単なルートを書く

application.yml に次の設定を追加します。

spring:
  cloud:
    gateway:
      routes:
        - id: path_route
          uri: http://www.baidu.com
          predicates:
            - Path=/get

スタートアッププロジェクト

プロジェクトを開始し、http://localhost:8080/get にアクセスすると、ページに Baidu ホームページが読み込まれていることがわかります。

Spring Cloud Gatewayの基本プロセス

Spring Cloud ゲートウェイによって解決される問題と基本的なプロセスに精通することによってのみ、Spring Cloud ゲートウェイをより深く学ぶことができます。Spring Cloud Gateway の基本的なフローを次の図に示します。
[外部リンク画像の転送に失敗しました。ソース サイトにはリーチ防止メカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします (img-qRcilN82-1675767528124) )(img.png)]

クライアントが Spring Cloud Gateway にリクエストを送信すると、Spring Gateway は、リクエストされた情報とルーティング ルールに従って、対応するゲートウェイ Web ハンドラーと照合します。ハンドラーはフィルター リンクを通じてリクエストを処理し、フィルターはリクエスト エージェントがデータを送信する前または後にデータを処理できます。

Spring Cloud Gateway の中心となる概念

ルーティング

ルーティングは Spring Cloud Gateway の基本モジュールであり、ID、ターゲット URI、一連のアサーション、および一連のフィルターで構成されます。リクエストが Spring Cloud Gateway に入ると、システムはすべてのルートを順番に照合しようとし、照合が成功すると、対応するフィルター チェーンが実行されます。次に、ターゲット URI に転送します。

実際、Spring Cloud Gateway を使用する場合、私たちの主な仕事はルーティング ルールを指定することです。つまり、ルートの ID、ターゲット URI、アサーション、フィルターを指定します。ルーティングルールの指定方法には、設定ファイルで指定する方法とエンコードで指定する方法があります。

設定ファイルはルーティング ルールを指定します

application.yml に次の設定を追加します。

spring:
  cloud:
    gateway:
      routes:
        - id: path_route
          uri: http://www.baidu.com
          predicates:
            - Path=/get
        - id: host_route
          uri: http://www.baidu.com
          predicates:
            - Host=**.baidu.com

エンコーディングはルーティング ルールを指定します

Spring Cloud Gateway では、コーディングによってルーティング ルールを指定できるため、より柔軟であり、実行時にルーティング ルールを動的に追加および削除できます。

@Configuration
public class GatewayConfig {
    
    

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    
    
        return builder.routes()
                .route("path_route", r -> r.path("/get")
                        .uri("http://www.baidu.com"))
                .route("host_route", r -> r.host("*.baidu.com")
                        .uri("http://www.baidu.com"))
                .build();
    }
}

いずれにせよ、ルーティング設定で基本的に行う必要があるのは、アサーションを指定し、フィルターを設定し、処理用のジャンプまたはハンドラーを指定することです。
これらの概念を 1 つずつ見てみましょう。

断言

アサーションはブール式であり、その機能はリクエストがルートの条件を満たすかどうかを判断することです。アサーションが true の場合、ルートは一致しますが、それ以外の場合は一致しません。アサーションは構成ファイルで指定することも、コーディングすることもできます。

構成ファイルはアサーションを指定します

構成ファイルでアサーションを指定するには 2 つの方法があります。1 つはショートカット実装で、もう 1 つは完全な実装です。

ショートカットの実装

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - Cookie=mycookie,mycookievalue

完全な実装

spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: https://example.org
          predicates:
            - name: Cookie
              args:
                name: mycookie
                regexp: mycookievalue

上記の 2 つのメソッドを通じて、ショートカットではアサーションの名前とパラメーターをカンマで区切って指定し、完全なメソッドではアサーションの名前とパラメーターを name と args の 2 つの属性で指定していることがわかります。

指定されたアサーションのエンコード

コーディングでアサーションを指定するには、次のように PredicateSpec メソッドを通じてアサーションを指定できます。

@Configuration
public class GatewayConfig {
    
    

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    
    
        return builder.routes()
                .route("path_route", r -> r.path("/get").uri("http://www.baidu.com"))
                .route("host_route", r -> r.host("*.baidu.com").uri("http://www.baidu.com"))
                .build();
    }
}

上記の例では、path_route と host_route という 2 つのルーティング ルールをコーディングで指定しました。アサーション、フィルター、ターゲット URI をプログラムで設定します。

主張の要約

アサーションの意図とその構成方法を理解すると、アサーションの使用が非常に簡単になります。一般的に使用される組み込みアサーション ファクトリーのいくつかは、公式 Web サイトから使用方法を学ぶことができます。
公式サイトアドレス

フィルター

フィルターは Spring Cloud Gateway のコアコンポーネントであり、その役割は、リクエストがルーティングされる前または後にリクエストを変更することです。Spring Cloud GatewayのフィルタはGatewayFilterとGlobalFilterの2種類に分かれています。

  • GlobalFilter: リクエストがルーティングされる前または後にリクエストを変更するグローバル フィルター。
  • GatewayFilter: 単一のルートに作用し、ルーティングの前後にリクエストを変更できるローカル フィルタ。

グローバルフィルター

グローバル フィルターはすべてのルートに適用されるフィルターで、リクエストがルーティングされる前または後にリクエストを変更できます。Spring Gateway にはいくつかのグローバル フィルターが組み込まれています。組み込みの共通グローバル フィルターに加えて、グローバル フィルターをカスタマイズすることもできます。組み込みのグローバル フィルターについては、公式 Web サイトにアクセスして 1 つずつ学習することも、グローバル フィルターが必要な場合に公式 Web サイトにアクセスして見つけることもできます。適切なフィルタがない場合は、カスタム フィルタを検討してください。
公式サイトアドレス

構成ファイルはグローバルフィルターを指定します

spring:
  cloud:
    gateway:
      globalfilters:
        - name: AddRequestHeader
          args:
            name: X-Request-Global-Foo
            value: Global-Bar

エンコーディングはグローバルフィルターを指定します

@Configuration
public class GatewayConfig {
    
    
    @Bean
    public GlobalFilter customGlobalFilter() {
    
    
        return (exchange, chain) -> {
    
    
            ServerHttpRequest request = exchange.getRequest().mutate().header("X-Request-Global-Foo", "Global-Bar").build();
            return chain.filter(exchange.mutate().request(request).build());
        };
    }
}

カスタムグローバルフィルター

カスタム フィルターは、次のように GatewayFilter インターフェイスを実装する必要があります。

@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {
    
    

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    
    
        System.out.println("global filter");
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
    
    
        return 0;
    }
}

実際の使用では、ビジネス ニーズに応じて適切なフィルターを使用または組み合わせて使用​​できます。

ローカルフィルター

ローカル フィルターは、単一のルートに作用するフィルターであり、リクエストがルーティングされる前または後にリクエストを変更できます。Spring Gateway にはいくつかのローカル フィルターが組み込まれています。組み込みの一般的なローカル フィルターに加えて、ローカル フィルターをカスタマイズすることもできます。
組み込みのグローバル フィルターについては、公式 Web サイトにアクセスして 1 つずつ学習することも、グローバル フィルターが必要な場合に公式 Web サイトにアクセスして見つけることもできます。適切なフィルタがない場合は、カスタム フィルタを検討してください。ローカルフィルター公式サイトアドレス

構成ファイルでローカル フィルターを構成する

設定ファイルの定義済みルーターで、フィルターを介してフィルターを指定します。Filters では複数のフィルタを指定することができ、フィルタの実行順序は Filters 内の順序に従って実行されます。各フィルターでは、フィルターの名前とパラメーターを Name と Args で指定します。または、Name = Args でフィルターを設定することもできます。

spring:
  cloud:
    gateway:
      routes:
        - id: path_route
          uri: http://www.baidu.com
          predicates:
            - Path=/get
          filters:
            - AddRequestHeader=X-Request-Foo, Bar
            - AddResponseHeader=X-Response-Foo, Bar
            - DedupeResponseHeader=Foo
            - Hystrix=fooCommand
            - PrefixPath=/httpbin
            - PreserveHostHeader
            - RemoveRequestHeader=Foo
            - RemoveResponseHeader=Foo
            - RewritePath=/foo/(?<segment>.*), /$\{
    
    segment}
            - RewriteResponseHeader=Location, http://newlocation.org
            - RequestRateLimiter=5, 1, SECONDS
            - Retry=3
            - SaveSession
            - SecureHeaders
            - SetPath=/foo/{
    
    segment}
            - SetRequestHeader=X-Request-Foo, Bar
            - SetResponseHeader=X-Response-Foo, Bar
            - SetStatus=401
            - StripPrefix=1
            - StripRequestHeader=Foo
            - StripResponseHeader=Foo
            - Weight=foo, 5

ローカルフィルターを使用したエンコード

コーディングでは、Filters を通じてフィルターを指定できます。Filters では複数のフィルタを指定することができ、フィルタの実行順序は Filters 内の順序に従って実行されます。

@Configuration
public class GatewayConfig {
    
    

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    
    
        return builder.routes()
                .route("path_route", r -> r.path("/get")
                        .filters(f -> f.addRequestHeader("X-Request-Foo", "Bar")
                                .addResponseHeader("X-Response-Foo", "Bar"))
                        .uri("http://www.baidu.com"))
                .build();
    }
}

カスタムローカルフィルター

カスタム フィルターは、次のように GatewayFilter インターフェイスを実装する必要があります。

@Component
public class MyGatewayFilter implements GatewayFilter, Ordered {
    
    

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    
    
        System.out.println("gateway filter");
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
    
    
        return 0;
    }
}

ハンドラー関数

アサーションとフィルターを構成することにより、Spring Cloud Gateway はリクエストを指定されたサービスにルーティングできます。ただし、リクエストを指定されたサービスにルーティングするのではなく、Spring Cloud Gateway でリクエストを直接処理したい場合は、ハンドラー関数を使用する必要があります。

Handler Function は WebFlux の概念で、ServerRequest オブジェクトを受け取り、Mono オブジェクトを返す関数です。Spring Cloud Gateway では、リクエストを指定されたサービスにルーティングする代わりに、ハンドラー関数を通じてリクエストを処理できます。

ハンドラー関数のカスタマイズ

ハンドラー関数をカスタマイズするには、次のように HandlerFunction インターフェイスを実装する必要があります。

@Component
public class MyHandlerFunction implements HandlerFunction<ServerResponse> {
    
    

    @Override
    public Mono<ServerResponse> handle(ServerRequest request) {
    
    
        return ServerResponse.ok().body(BodyInserters.fromObject("hello world"));
    }
}

使用Handler Function

import org.springframework.beans.factory.annotation.Autowired;

@Configuration
public class GatewayConfig {
    
    
    @Autowired
    private MyHandlerFunction myHandlerFunction;
    @Bean
    public RouterFunction<ServerResponse> htmlRouterFunction() {
    
    
        return RouterFunctions.route(RequestPredicates.path("/fallback"), myHandlerFunction));
    }
}

要約する

Spring Cloud Gateway は非常にシンプルで、マイクロサービスで使用すると便利です。ほとんどの用途では、レジストリに接続するように Spring Cloud Gateway を構成してから、ルーティング ルールを構成するだけで済みます。多くの場合、ルーティング設定を設計する必要はなく、デフォルトでリクエストとレジストリのサービスが照合され、一致する場合は自動的に対応するサービスにルーティングされます。

おすすめ

転載: blog.csdn.net/aofengdaxia/article/details/128924106