ゲートウェイ アサーションの使用方法の詳細な説明

ゲートウェイの背景、なぜゲートウェイを使うのか?

システムは複数のマイクロサービスに分割されますが、クライアントはどのようにしてこれほど多くのマイクロサービスを呼び出すのでしょうか? ゲートウェイがない場合は、クライアント上の各マイクロサービスのアドレスを記録し、それを個別に呼び出すことしかできません。
たとえば、以下に示すように、
画像の説明を追加してください
このようなアーキテクチャには多くの問題があります:
・各ビジネスには、認証、電流制限、権限検証、クロスドメインなどのロジックが必要であり、各ビジネスが独立して戦う場合、独自のホイールを構築する必要があります。完全に抽出して統合された場所に配置して実行できます。
·業務量が比較的単純な場合、初期段階ではこの方法でも問題はありませんが、業務が複雑になると、たとえばタオバオやアマゾンのページを開くのに数百ものマイクロサービスが連携することになる可能性があります。各マイクロサービスすべてのサービスにドメイン名が割り当てられている場合、クライアント コードの保守が困難になる一方で、数百ものドメイン名が必要となり、接続数にボトルネックが発生します。キャプチャを実行すると、何百ものリモート呼び出しが含まれていることがわかりますが、これはモバイル端末では不可能であり、非常に非効率的であるように見えます。
後からマイクロサービスを再構築する必要があると非常に面倒になる コモディティサービスなど、変革にはクライアントの協力が必要 ビジネスが複雑化するにつれて、後から複数のマイクロサービスに分割する必要がある. サービス: 現時点では、外部
サービスも複数のサービスに分割する必要があり、クライアントは変換に協力する必要があります。

ゲートウェイとは

いわゆる API ゲートウェイは、システムの統一された入り口を指します。アプリケーションの内部構造をカプセル化し、統一されたサービスをクライアントに提供します。ビジネス自体とは関係のないいくつかのパブリック ロジックをここに実装できます。 AP ゲートウェイを追加
すると、システム アーキテクチャ図は次のようになります。
画像の説明を追加してください

ゲートウェイによってもたらされるメリット

ここに画像の説明を挿入します
ゲートウェイはトラフィックのエントリ ポイントとして機能し、一般的に使用される機能には、ルーティングと転送、権限の検証、電流制限などが含まれます。
Spring Cloud Gatewayは、Spring Cloudが正式に発表した第2世代のゲートウェイフレームワークで、Netflix Zuul1.Oを置き換える位置付けにある。Spring Cloud Gateway は、Zuul と比較して、より優れたパフォーマンスとより強力な機能を提供し、
WebFlux+Ney+Reactor によって実装された応答性の高い API ゲートウェイです。
Spring Cloud Gateway は、従来のサーブレット コンテナでは動作せず、war パッケージに組み込むこともできません。Spring Cloud Gateway は、マイクロサービス アーキテクチャ向けのシンプルかつ効果的な API ルーティング管理メソッドを提供することを目的としており、Filter メソッドに基づいてゲートウェイの基本機能を提供します。セキュリティ認証、監視、電流制限などについての話

機能的特徴

1. Spring Framework 5、Project Reactor、Spring Boot 2.0 に基づいて構築;
2. 動的ルーティング: あらゆるリクエスト属性に一致可能:
3. パス書き換えをサポート;
4. Spring Cloud サービス検出機能の統合 (Nacos、Eruka);
5.フロー制御ダウングレード機能を統合可能 (Sentinel、.Hystrix);
6. ルートに対して簡単に記述できる Predicates と Filter を指定できます; ## ゲートウェイによる転送の実装方法

プロジェクト内のゲートウェイによって使用される依存関係

親 pom で使用される依存関係:

<properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
        <spring-cloud-alibaba.version>2.2.8.RELEASE</spring-cloud-alibaba.version>
    </properties>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
<!-- springcloud的版本依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${
    
    spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${
    
    spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

ゲートウェイモジュールによって使用される依存関係

    <dependencies>
<!--        gateway依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

    </dependencies>

ゲートウェイの application.yml 構成情報

server:
  port: 8088
spring:
  main:
    web-application-type: reactive
  application:
    name: gateway
# gateway的配置
  cloud:
    gateway:
      #路由规则
      routes: #路由,数组[这里可以放置多个路由]
        #评分管理模块网关路由配置
        - id: shop_router #当前路由标识-要求唯一,默认是UUID;
          uri: http://localhost:8089 #请求最终要被转发的地址;
          order: 1 #路由的优先级——数字越小,代表路由的优先级越高
          predicates: #断言:(条件判断——转发请求要满足的条件)
#            - Path=/shop/** #当请求路径满族path指定的规则时,此路由信息才会正常转发;
#          filters: #过滤器,是在请求传递过程中对请求做一些手脚;
#            - StripPrefix=1 #在请求转发之前去掉一层路径
            - Path=/TestController/**
            - After=2019-12-31T23:59:59.789+08:00[Asia/Shanghai]
            - CheckAuth=gys

アサーションとは何ですか

Spring Cloud Gateway (略してゲートウェイ) は、Spring WebFlux の HandlerMapping に基づいて実装されるアサーション Predicate 関数をサポートします。ゲートウェイには多くのルーティング アサーション ファクトリが含まれており、これらのファクトリは HTTP リクエストの多くの属性を処理します。クライアントが HTTP リクエストを作成すると、HandlerMapping はリクエスト パラメータを取得し、それらをゲートウェイで構成された述語と比較します。ルールが満たされる場合、ルーティングは許可されます。ルールに従っていない場合は、アクセスが拒否されるか、404 エラーが報告されます。

アサーションの分類

公式サイトアドレス

内蔵

構成ファイルのアサーション タグの下に構成された Path と After はすべて組み込みアサーションであり、ゲートウェイ自体によって提供されるアサーションです。例: Datatime タイプに基づくアサーション ファクトリ。このタイプのアサーションは、以下に基づいて判断

ます
。 AfterRoutePredicateFactory :
要求された日付が指定された日付より後であるかどうかを決定する日付パラメーターを受信 BeforeRoutePredicateFactory: 要求された日付が指定された日付より
前であるかどうかを決定する日付パラメーターを受信
BetweenRoutePredicateFactory: 2 つの日付を受信date パラメータを使用して、要求された日付が指定された期間内かどうかを判断します。

カスタマイズ

カスタム ルート アサーション ファクトリは、AbstractRoutePredicateFactory クラスを継承し、apply メソッドのロジックを書き直す必要があります。apply メソッドでは、exchange...getRequest() を通じて ServerHttpRequest オブジェクトを取得することで、リクエスト パラメーター、リクエスト メソッド、リクエスト ヘッダーなどの情報を取得できます。

注:
1. Spring コンポーネントである必要があります (Bean である必要があります)
2. クラスは RoutePredicateFactory で終了する必要があります (規約は設定よりも重要です)
3. AbstractRoutePredicateFactory を継承する必要があります
4. 静的内部クラス (config) 宣言属性を宣言する必要があります対応する構成ファイルのアサーション情報を受け取る

ShoutcutFieldOrder コレクションを通じて入力コンテンツ情報を返します。

5. バインドするには、shortcutFieldOrderi と組み合わせる必要があります
。 6. apply を使用して、tue が一致に成功したか、一致に失敗した場合は false かを論理的に判断します。

@Component
public class CheckAuthRoutePredicateFactorya extends AbstractRoutePredicateFactory<CheckAuthRoutePredicateFactorya.Config> {
    
    


    public CheckAuthRoutePredicateFactorya() {
    
    
        super(Config.class);
    }

    @Override
    public List<String> shortcutFieldOrder() {
    
    
        return Arrays.asList("name");
    }

    @Override
    public Predicate<ServerWebExchange> apply(Config config) {
    
    
        return new GatewayPredicate() {
    
    
            @Override
            public boolean test(ServerWebExchange serverWebExchange) {
    
    
                if (config.getName().equals("gys")){
    
    
                    return true;
                }
                return false;
            }
        };
    }


    /**
 * @description: 用于接收配置文件中断言的信息
 * @author: 
 * @date: 2023/9/19 19:52
 * @param:
 * @return:
 **/
    @Validated
    public static class Config {
    
    
        private String name;
        public String getName() {
    
    
            return name;
        }

        public void setName(String name) {
    
    
            this.name = name;
        }
    }
}

アサーションとフィルターの違い

1. さまざまな機能: アサーションは、リクエスト パス、リクエスト ヘッダー、リクエスト パラメータなどのリクエストの特定の条件を照合するために使用され、リクエストを特定のターゲット サービスにルーティングするかどうかを決定します。フィルターは、リクエスト ヘッダーの追加、リクエスト本文の変更、ログの記録、認証と認可の実装など、リクエストの処理と変換に使用されます。
2. 動作原理が異なります: アサーションは通常、リクエストの受信時に照合するためにルーティング ステージで使用され、一致が成功すると、リクエストは対応するターゲット サービスにルーティングされます。フィルタはリクエストのルーティングの前後に適用され、リクエストの前処理または後処理に使用されます。ルートの選択には影響しません。
3. さまざまな使用シナリオ: アサーションは通常、リクエストの特定の属性に基づくルーティングに使用されるため、ゲートウェイの基礎となる実装に近くなります。フィルターはより柔軟であり、認証と認可、リクエストの再試行、フロー制御などのビジネス ロジックの実装に使用できます。

おすすめ

転載: blog.csdn.net/weixin_45309155/article/details/133121405