マイクロサービス-GateWay (ゲートウェイ)

いわゆるゲートウェイとはどういう意味ですか?

       コミュニティの警備員に相当します。コミュニティの生命と財産の健康を守るために、コミュニティに出入りするには警備員の同意が必要です。ゲートウェイも同様で、あらゆるリクエストを厳密に制御します。法的または許可されたリクエストをサーバーに送信します。

ゲートウェイの機能:

  • 認証と認可の検証
  • サービスルーティング、負荷分散
  • スロットリングのリクエスト

 一般的な共通ゲートウェイは次のとおりです。

ゲートウェイ: Spring5 で提供される WebFlux に基づいており、レスポンシブ プログラミングの実装に属し、パフォーマンスが向上しています。

zuul: サーブレットベースの実装。ブロッキング プログラミングに属します。

ゲートウェイサービスの構築

1. 新しいモジュールを作成し、SpringCloudGateway の依存関係と nacos のサービス検出依存関係を導入します。

   <!--nacos服务注册发现依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--网关gateway依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

2. nacos アドレスであるルーティング設定を書き込みます。

server:
  port: 10010
logging:
  level:
    cn.itcast: debug
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: nacos:8848 # nacos地址
    gateway:
      routes:
        - id: user-service # 路由标示,必须唯一
          uri: lb://userservice # 路由的目标地址
          predicates: # 路由断言,判断请求是否符合规则
            - Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合

要約:

ゲートウェイを構築する手順:

1. プロジェクトを作成し、nacos サービス検出とゲートウェイの依存関係を導入します。

2. 基本的なサービス情報、nacos アドレス、ルーティングを含む application.yml を設定します。

ルーティング設定には次のものが含まれます。

1. 理由 ID: ルートの一意の識別子

2. ルーティング宛先: ルーティングの宛先アドレス。http は固定アドレスを表し、lb はサービス名に基づく負荷分散を表します。

3 ルーティングアサーション:ルーティングの判定ルール

4. ルート フィルター: リクエストまたはレスポンスを処理します。

ルート述語ファクトリー

ゲートウェイルーティングで設定できる内容は次のとおりです。

  • ルート ID: ルートの一意の識別子
  • uri: ルーティング先、lb と http の両方をサポート
  • predicates: ルーティング アサーション。リクエストが要件を満たしているかどうかを判断し、リクエストを満たしていればルーティング先に転送します。

       設定ファイル内のルールは単なる文字列です。この文字列はPredicate Factoryで読み取られて処理され、ルーティングの判定条件に変換されます。例えば、「Path=/user/**」はパスに応じて一致し、「Path=/user/**」のみが一致します。 /user で始まるものは許可されます。

  • フィルタ: ルートフィルタ、リクエストまたはレスポンスの処理

11種類の工場:

 ルートフィルター GatewayFilter

GatewayFilter はゲートウェイに提供されるフィルターで、ゲートウェイに入るリクエストとマイクロサービスから返されるレスポンスを処理できます。

 Spring が提供するいくつかの異なるルート フィルター ファクトリを次に示します。

ここで、A サービスに入るすべてのリクエストにリクエスト ヘッダーを追加する必要があります。どのように実装しますか?

リクエスト ヘッダーをサービスに個別に追加します。

spring:
  cloud:
    gateway:
      routes:#网关路由配置
        - id: order-service
          uri: lb://orderservice
          predicates:
            - Path=/order/**
          filters: #过滤器
           - AddRequestHeader=Truth,Itcast is freaking awesome!#添加请求头

すべてのルートに対して有効にしたい場合は、次のようにデフォルトでフィルター ファクトリを作成できます。

spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: nacos:8848 # nacos地址
    gateway:
      routes:
        - id: user-service # 路由标示,必须唯一
          uri: lb://userservice # 路由的目标地址
          predicates: # 路由断言,判断请求是否符合规则
            - Path=/user/** # 路径断言,判断路径是否是以/user开头,如果是则符合
        - id: order-service
          uri: lb://orderservice
          predicates:
            - Path=/order/**
      default-filters:#对所有的路由都生效的过滤器
        - AddRequestHeader=Truth,Itcast is freaking awesome!

グローバルフィルター

       グローバル フィルターの役割は、すべてのゲートウェイ リクエストとマイクロサービスの応答を処理することです。GatewayFilter の役割と同じです。違いは、GatewayFilter は構成によって定義され、処理ロジックが固定されているのに対し、GlobalFilter のロジックは固定であることです。自分でコードを書いて実装する必要がありますが、その定義は GlobalFilter インターフェイスを実装することです。

//@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 1.获取请求参数
        ServerHttpRequest request = exchange.getRequest();
        MultiValueMap<String, String> params = request.getQueryParams();
        // 2.获取参数中的 authorization 参数
        String auth = params.getFirst("authorization");
        // 3.判断参数值是否等于 admin
        if ("admin".equals(auth)) {
            // 4.是,放行
            return chain.filter(exchange);
        }
        // 5.否,拦截
        // 5.1.设置状态码
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        // 5.2.拦截请求
        return exchange.getResponse().setComplete();
    }

    @Override
    public int getOrder() {
        return -1;
    }

ステップ:

1. GlobalFilter インターフェイスを実装する

2. @Order アノテーションを追加するか、Ordered インターフェースを実装します。

3. 処理ロジックの書き込み

フィルターの実行順序

  •  各フィルターには int 型の順序値を指定する必要があります。順序値が小さいほど優先順位が高く、実行順序も高くなります。
  • GlobalFilter は、Ordered インターフェイスを実装するか、@Order アノテーションを追加することによって順序値を指定します。
  • ルーティングフィルターとdefaultFilterの順序はSpringで指定されており、デフォルトは宣言順序に従って1から増加します。
  • フィルタの順序値が同じ場合、defaultFilter>ローカルルーティングフィルタ>GlobalFilterの順に実行されます。

クロスドメインの問題

       クロスドメインの問題: 一貫性のないドメイン名はクロスドメインです。ブラウザーは、リクエストの開始者がサーバーに対してクロスドメイン Ajax リクエストを行うことを禁止し、リクエストはブラウザーによってインターセプトされます。

コルス:

spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: nacos:8848 # nacos地址
    gateway:
      globalcors: #全年的跨域处理
        add-to-simple-url-handler-mapping: true #解决options请求被拦截问题
        corsconfigurations: 
          '[/**]':
            allowedOrigins: #允许哪些网站的跨域请求
              -"http://127.0.0.1:8090"
            allowedMethods: #允许的跨域ajax的请求方式
              -"GET"
            -"POST"
            -"DELETE"
            -"PUT"
            -"OPTIONS"
            allowedHeaders: "*" #允许在请求中携带的头信息
                allowCredentials: true #是否允许携带cookie
            maxAge: 360000 #这次跨域检测的有效期

おすすめ

転載: blog.csdn.net/dfdbb6b/article/details/132342456
おすすめ