技術共有

スプリングクラウドゲートウェイ

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

効果

  • 一元管理、監視が容易
  • セキュリティ、電流制限: ゲートウェイ層で違法な情報をフィルタリングして除去します。
  • nginx 外部ゲートウェイ、ゲートウェイ イントラネット
  • nginx は Lua または Kong で強化できます

コンセプト

  • ID: 任意の名前
  • uri: プロキシ サービスのアドレス。 id と uri は必須ですが、述語とフィルターはオプションです
  • 述語: ゲートウェイにアクセスするための URI を照合するために使用できます。一致すると、現在のルートが有効になります。
  • Filter: GatewayFilter のインスタンス。プロキシの前後にロジックを追加し、最も高い柔軟性を実現します。

処理の流れ

  • まず、ハンドラー マッピングは URL を処理し、処理のためにフィルターの前半を呼び出します。プロキシ サービスが応答した後、ロジックを実行します。フィルターの後半の結果を WebHandler に返し、次に HandlerMapping に返し、最後にクライアントに返します。

使用

gateway:
      discovery:
        locator:
          enabled: true # 启用自动根据服务ID生成路由
          lower-case-service-id: true # 设置路由的路径为小写的服务ID
  • 1
  • 2
  • 3
  • 4
  • 5

yml設定

  • リスト内の要素に複数のフィールドがある場合は、各フィールドと値をそれぞれ指定するために「-」とコロンが必要です。フィールドが 1 つしかない場合は、カンマを使用して区切ることができます。
  • オブジェクトタイプの設定。各フィールドは「-」とコロンを使用して設定できます。
  • マップタイプ: キー、コロンで区切られた値
predicates:
  - Path=/sendOrder
  - Query=name,ma.
  - name: Query
    args:
      param: id
      regexp: d+
 #predicates是List, 它的元素是
 public class PredicateDefinition {

	@NotNull
	private String name;

	private Map<String, String> args = new LinkedHashMap<>();
  }
  等号分割转成对象的写法不是yml内置支持的
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

述語

  • 述語の構成はリストであり、その要素は特定の形式の文字列またはオブジェクトにすることができます。文字列の記述方法: 等号で区切られ、最初の部分は述語名 name、2 番目の部分 args はカンマで区切られ、値は Map 値に保存され、Map キーが自動的に生成されます。オブジェクトの記述方法:PredicateDefinition
  • 引数自体にカンマやコロンが含まれる場合、文字列形式は使用できません
  • ShortcutType メソッドは、args パラメータの解析方法を ConfigClass に定義します。DEFAULT:shortcutFieldOrder は、ConfigClass フィールド名に対応します。GATHER_LIST: GATHER_LIST_TAIL_FLAG のフィールド値に対応します。 : カンマ区切りリスト、ただし最後の値。値はブール値であり、最終的に 2 つのキーのマップに変換されます。最初のキーの値はブール値の前のリストであり、2 番目のキーはブール値。
  • ゲートウェイにアクセスするためのリクエスト (URI、クエリ パラメータ、リクエスト ヘッダーなど) を照合するために使用されます。一致すると、現在のルートが有効になります。
  • GatewayPredicate の実装に対応して、実装クラスは RoutePredicateFactory の実装クラスになります。たとえば、Path は PathRoutePredicateFactory に対応します。
  • 述語名はファクトリ実装クラスのクラス名プレフィックスに対応し、述語パラメータ args はファクトリ ConfigClass に対応します。
  • 複数の述語は、そして関係
  • 述語が通過しない場合、ゲートウェイは 404 を返します。

パス

  • パスを照合し、ant 照合をサポートし、{} を介して uriVariables を抽出します。

クエリ

  • 対応する http リクエスト パラメータ名はありますか? 値は通常のものでかまいません。
  • 名前は固定クエリです。args にはクエリ パラメータの名前と値に対応する param と regexp の 2 つの値があります。
  • 名前のみが設定されている場合は、リクエストパラメータが存在する限り、それが渡されることを意味します。

ヘッダ

  • ヘッダールート述語ファクトリー
  • リクエスト ヘッダーの名前と値を一致させます。一致するものが 1 つある限り、実際のリクエスト ヘッダー値は複数存在する可能性があります。

方法

  • HTTP リクエストメソッドと一致します。設定は大文字でカンマで区切る必要があります。

リモートアドレス

  • リクエストに一致するクライアント IP、正確には最後のネットワーク プロキシの IP は、カンマで区切って複数指定できます。

ホスト

  • ホスト リクエスト ヘッダーのホスト部分の値と一致します (ポートを除く)。カンマで区切って複数指定することも、ant で一致させることもできます。
  • AntPathMatcher を使用して照合し、パス区切り文字は「.」です。

クッキー

  • Cookie の名前と値を一致させる 値は定期的に一致させることができます。

重さ

  • 異なるルートの負荷分散に使用され、同じグループ内のルートは重みに従って負荷がかかります。
  • グループ化と重みの 2 つの値をカンマで区切って設定できます。
  • WeightCalculatorWebFilter: 起動すると、Weight 設定に基づいて 2 層の Map が生成され、最初の層はグループ名、2 層目はリクエストが来ると 0 ~ 1 の乱数が生成されます。ルーティング ID がグループごとに選択されます。
  • WeightRoutePredicateFactory: 述語フィルタリング時に、グループとルート ID に基づいてフィルタリングします。

フィルター

  • 設定の書き込み方法は述語と同じです。最初の部分はフィルター ファクトリ GatewayFilterFactory クラス名のプレフィックスに対応し、2 番目の部分はパラメーターです。
  • フィルターはリクエストとレスポンスを変更するために使用されます

リクエストヘッダーの追加

  • バックエンドで取得できるリクエストヘッダーを追加します。
  • リクエストヘッダーの値はuriVariablesからの動的取得をサポート

ストリッププレフィックス

  • 整数値 n は 1 つだけです。要求されたパスを「/」で分割した後、接頭辞 n を削除します。

制限する

クロスドメイン

spring.cloud.gateway.globalcors:
  cors-configurations:
    '[/**]': #跨域的uriPattern
      allowedHeaders: "*"
      allowedOrigins: "*"
      allowedMethods:
        - POST
        - OPTIONS
        - GET
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • サーバーは、リクエスト ヘッダーの Origin とリクエスト URL のスキーム、ホスト、およびポートが同じかどうかによって、クロスドメイン リクエストであるかどうかを判断します。1 つの違いがある限り、それはクロスドメイン リクエストです。
  • クロスドメイン構成が必要であり、要求された URI がクロスドメイン構成の uriPattern と一致するかどうかをゲートウェイが判断します。クロスドメインの場合、クロスドメイン要求ヘッダーが許可されます。クロスドメイン構成のソース、リクエストメソッド、および実際のリクエストが一致するかどうか。すべて一致する場合はクロスドメインアクセスを実行し、そうでない場合は 403Forbiden を返します。
  • org.springframework.web.reactive.handler.AbstractHandlerMapping#getHandler
  • org.springframework.web.cors.reactive.DefaultCorsProcessor#プロセス

ルートを自動生成する

  • サービス ディスカバリによるサービス ID の取得をサポートし、サービス ID に基づいてルーティング設定を自動的に生成します。デフォルトのルーティング構成の URI は lb://serviceId、述語は /serviceId/**、フィルターは ServiceId を削除する Rewritepath です。

グローバルフィルター

リアクティブロードバランサークライアントフィルター

  • lb スキームでルーティング URI を処理するには、まず ServiceInstanceListSupplier を通じてサービス名に従ってサービス インスタンスを取得し、次に ReactorLoadBalancer インスタンスを通じて負荷分散します。

ルートリクエスト URL フィルター

  • 2 つのことを実行します。 1. 2 層スキームをサポートし、外側のスキームを GATEWAY_SCHEME_PREFIX_ATTR に保存し、削除します。 2. 内部シーム、ホスト、およびポートを使用して、実際に要求された URI を置き換えて転送を実現します。