[SpringCloudマイクロサービスプロジェクト実際のcombat-mall4cloudプロジェクト(2)]——mall4cloud-gateway

代码地址
github地址
fork自github原始项目
gitee地址
fork自gitee原始项目

システムアーキテクチャとゲートウェイの紹介

ここに画像の説明を挿入します
図からわかるように、ユーザー側と静的層はアクセス層(nginx+ファイアウォール)を通過した後、バックエンドサービスに到達します 最初に通過するのはゲートウェイ層です ゲートウェイ層は実装されていますspringCloudゲートウェイ2+負荷分散による。

ゲートウェイの紹介

マイクロサービス アーキテクチャのゲートウェイ層は、マイクロサービス アーキテクチャのゲートキーパーとして機能し、リクエストの処理、セキュリティの管理、フィルタリングと変換の実装、ルーティングと負荷分散の実行、およびその他のタスクを担当します。これらの機能を一元管理することで、ゲートウェイはマイクロサービスへのクライアント アクセスを簡素化し、いくつかの重要な非ビジネス機能を提供して、システム全体の高可用性、パフォーマンス、セキュリティを確保できます。

リクエストのルーティング: ゲートウェイは、マイクロサービス システムに入るすべてのリクエストのエントリ ポイントとして機能します。事前定義されたルールに基づいて、リクエストを適切なマイクロサービス インスタンスにルーティングします。このルーティングは、要求された URI、HTTP メソッド、要求ヘッダー、クエリ パラメーター、およびその他の条件に基づいて行うことができます。

負荷分散: ゲートウェイをロード バランサーと統合すると、リクエストが複数のマイクロサービス インスタンスに均等に分散され、システムの可用性とパフォーマンスが向上します。これにより、単一障害点を回避し、大量のリクエストを効率的に処理できます。

セキュリティ: 通常、ゲートウェイ層は認証と認可の処理を担当し、認証および認可されたリクエストのみが保護されたマイクロサービスにアクセスできるようにします。シングル サインオン (SSO)、OAuth、JWT 検証、その他のセキュリティ メカニズムを統合できます。

監視とロギング: ゲートウェイは、監視とロギングのために要求と応答の情報を記録できます。これは、システムのパフォーマンスの問題、トラブルシューティング、セキュリティ監査の追跡に役立ちます。

フィルタリングと変換: ゲートウェイはフィルタを通じてリクエストとレスポンスを処理し、リクエストとレスポンスの変換、リクエストの再試行、電流制限、キャッシュ、データ暗号化などの非ビジネス機能を実行できます。これらのフィルターは、リクエストの処理中にリクエストと応答の一部を追加、変更、または削除できます。

バージョン管理とルーティング戦略: ゲートウェイ層では、バージョン管理戦略を実装できるため、異なるバージョンのマイクロサービスが共存でき、バージョン番号に基づいて要求を適切なマイクロサービス バージョンにルーティングできます。

エラー処理: ゲートウェイはマイクロサービスのエラーを処理し、内部エラーをクライアントに公開する代わりに、意味のあるエラー応答を提供できます。

キャッシュ: ゲートウェイは一般的に使用される応答をキャッシュできるため、バックエンド マイクロサービスの負担が軽減され、応答時間が短縮されます。

電流制限: ゲートウェイはトラフィックを制御し、マイクロサービスへのリクエスト レートを制限して、リクエストが多すぎてシステムが過負荷になるのを防ぎます。

ゲートウェイ層コード

依存関係の導入

コードの pom ファイルの下にある 。次の主な依存関係が導入されていることがわかります。
ここに画像の説明を挿入します
①③: nacos 登録センターと構成センターの依存関係の導入
②: ロードバランサーの依存関係の導入
④: ゲートウェイ依存関係を導入する

ブートストラップ構成

ここに画像の説明を挿入します
①: ポートは 8000 です
②: アプリケーション名: 名前を指定した後、Maven 設定から mall4cloud-gateway として読み取ります。設定が行われていない場合、デフォルトの設定ファイル名は mall4cloud-gateway.yaml となり、設定センターに接続すると、このデフォルト設定ファイルが自動的に取得されます。
③: nacos 登録センターのアドレス、ポート 8848
④: 構成センターのアドレス、前の手順と同じアドレスが導入されます
⑤: 使用しますデフォルトの名前空間、
⑥: 上記のshared-configs:application-dev.ymlに使用されます。この設定はnacosから取得します
次に、 nacos の設定

ナコスの設定

application-dev.yml の設定は公開接続情報であるため説明を省略しますが、ゲートウェイの個別の設定は次のとおりです。

spring:
  cloud:
    gateway:
      globalcors:
        cors-configurations:
          '[/**]':
            allow-credentials: true
            allowed-headers: "*"
            # 半个月内都允许
            max-age: 1296000
            # 测试环境,全部允许
            allowedOriginPatterns: "*"
            # allowedOrigins:
              # - "http://localhost:9527"
              # - "http://localhost:9527"
              # - "http://localhost:9528"
              # - "http://localhost:9529"
              # - "http://:9527"
            allowedMethods:
              - GET
              - POST
              - PUT
              - OPTIONS
              - DELETE
      discovery:
        locator:
          # 开启服务注册和发现
          enabled: true
          # 不手动写路由的话,swagger整合不了...

ゲートウェイ構成はクロスドメインの問題を処理します

spring.cloud.gateway.globalcors.cors-configurations: この構成アイテムは CORS 構成情報を指定します。これはマップであり、キーは URL 一致パターン、値は CORS 構成です。
[/**]: これは URL 一致パターンであり、すべての URL と一致することを意味します。これは、この CORS 構成がすべてのリクエスト パスに適用されることを意味します。
allow-credentials: true: Cookie や HTTP 認証情報などの資格情報を CORS リクエストに含めることを許可します。
allowedOriginPatterns: * 許可されるソース (ドメイン) パターン。テスト環境では、任意のオリジンを許可するには * に設定します。通常、 allowedOrigins 属性を使用して、特定の許可されたオリジンを指定することもできます。
allowed-headers: * : 許可されるリクエスト ヘッダー。ここで、* は任意のリクエスト ヘッダーを許可することを意味します。
max-age: 1296000: ブラウザが CORS 応答をキャッシュできる時間を秒単位で設定します。ここでは半月(1296000秒)に設定します。つまり、有効期間中は cors リクエストを経由せずに直接アクセスできます。
allowedMethods: 許可される HTTP リクエスト メソッドには、GET、POST、PUT、OPTIONS、DELETE などが含まれます。

この構成は、Spring Cloud Gateway でグローバル CORS ルールを構成するために使用され、フロントエンド アプリケーションが任意のソース (テスト環境内) からゲートウェイの API にアクセスできるようにし、資格情報を含むリクエストを許可します。これにより、クロスドメイン リクエストの問題が解決され、フロントエンドがバックエンド API とクロスドメインで通信できるようになります。

ゲートウェイ ルーティング アサーションの設定

	routes:
        - id: mall4cloud-rbac
          uri: lb://mall4cloud-rbac
          predicates:
            - Path=/mall4cloud_rbac/**
          filters:
            - RewritePath=/mall4cloud_rbac(?<segment>/?.*), $\{
    
    segment}
        - id: mall4cloud-auth
          uri: lb://mall4cloud-auth
          predicates:
            - Path=/mall4cloud_auth/**
          filters:
            - RewritePath=/mall4cloud_auth(?<segment>/?.*), $\{
    
    segment}

routes: ゲートウェイ ルーティング設定
例は次のとおりです。
ID mall4cloud-rbac のルート:配列形式で
id: mall4cloud-rbac: このルートの一意の識別子を定義します。
uri: lb://mall4cloud-rbac: リクエストのルーティング先となるターゲット サービスの負荷分散アドレスを指定します。ここで、lb://mall4cloud-rbac は、ロード バランサーを使用して特定のインスタンスを選択し、リクエストを mall4cloud-rbac という名前のサービスにルーティングすることを意味します。
predicates: リクエストの一致ルールを定義します。ここでは Path 属性が使用されます。のみを意味します このルーティング ルールは、要求されたパスが /mall4cloud_rbac/** に一致する場合にのみ適用されます。ターゲット サービスにルーティングされます lb://mall4cloud-rbac

ゲートウェイ経由でログイン インターフェイスにアクセスした結果は次のとおりです。
ここに画像の説明を挿入します
結果はログイン インターフェイスへの直接アクセスと一致しています。つまり、ルーティングは成功です。 a>
ここに画像の説明を挿入します
上記の結果 /mall4cloud_rbac/** lb://mall4cloud-rbac サービスへのルーティング
ここで、一般的に使用されるルーティング アサーション ファクトリを紹介します。公式サイトには以下の11 種類のアサーションメソッドが掲載されています。
ここに画像の説明を挿入します

ゲートウェイルートフィルタリング設定

Spring Cloud Gateway では、フィルターを使用して、ゲートウェイに出入りするトラフィックを処理できます。リクエストとレスポンス。これらのフィルタを使用すると、リクエスト ヘッダー、レスポンス ヘッダー、リクエスト本文、ログ記録などの変更など、リクエストとレスポンスのさまざまな段階でさまざまな操作を実行できます。。フィルターはグローバル構成または特定のルーティング ルールに使用できます
以下はプロジェクトのフィルター構成です
ここに画像の説明を挿入します
filters: いくつかのルーティング フィルターが定義されています。ここでは RewritePath を使用します。フィルター。要求されたパスを書き換えます。具体的には、/mall4cloud_rbac以降のパス部分を抽出し、対象サービスのURIに付加することでリクエストパスの書き換えを実現します。

  • RewritePath: 使用するフィルター ファクトリの名前を指定します。これはリクエスト パスを書き換えるフィルターです。
  • /mall4cloud_auth: これは、一致する元のリクエスト パスの一部です。要求されたパスがこの部分に一致する場合、このフィルターがトリガーされます。
    (?/?.*): これは正規表現キャプチャ グループであり、リクエスト パスの /mall4cloud_auth 以降のパス部分をキャプチャし、変数内のsegment という名前のセグメントに格納するために使用されます。 。
  • ,${segment}: 書き換えられたターゲットパスの形式です。元のリクエスト パスの /mall4cloud_auth に続くパスの部分をターゲット パスに追加します。

たとえば、元のリクエスト パスが /mall4cloud_auth/users の場合、このフィルターはリクエスト パスを /users に書き換え、リクエストを適切なバックエンド サービスにルーティングします。このようにして、リクエスト パスの /mall4cloud_auth 部分が削除されます。

さらに、Spring では、次のようなさまざまなフィルタ ファクトリも提供しています。
ここに画像の説明を挿入します
特定のニーズに応じて他のフィルタを設定できます。ドキュメントは、ゲートウェイの公式 Web サイトで参照できます。 MyGlobalFilter という名前のグローバル フィルタ クラスを作成し、GlobalFilter インターフェイスを継承し、フィルタ メソッドを実装してフィルタリング ロジックを定義します。 、例 コードは次のとおりです。
ここに画像の説明を挿入します
たとえば、グローバル フィルタを追加することもできます。

import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;

@Component
public class MyGlobalFilter implements GlobalFilter, Ordered {
    
    

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    
    
        // 这里可以编写过滤逻辑,例如修改请求或响应
        return chain.filter(exchange); // 调用链中的下一个过滤器
    }

    @Override
    public int getOrder() {
    
    
        return 0; // 定义过滤器的执行顺序,0表示最高优先级
    }
}

要約する

ゲートウェイを介して、プロジェクトはリクエストの処理、フィルタリングと変換の実装、ルーティングと負荷分散の実行を行うことができ、これらの内容には通常、多くの構成が含まれます。プロジェクトでゲートウェイの使用が必要な場合は、ゲートウェイの機能に基づいて適切なソリューションを選択できます。

おすすめ

転載: blog.csdn.net/qq_40454136/article/details/132819693