Spring Cloud Alibaba: ゲートウェイ フィルターゲートウェイゲートウェイ フィルター ファクトリ (レコード)

目次

AddRequestHeader GatewayFilter ファクトリ

AddRequestHeadersIfNotPresent ゲートウェイ フィルター ファクトリ

AddRequestParameter ゲートウェイフィルター ファクトリ

AddResponseHeader ゲートウェイフィルター ファクトリ

サーキットブレーカー ゲートウェイフィルター ファクトリ

ステータスコードに基づくサーキットブレーカー

PrefixPath GatewayFilter ファクトリ

StripPrefix GatewayFilter ファクトリ

RewritePath Gatewayフィルター ファクトリ

RequestRateLimiter ゲートウェイフィルター ファクトリ

デフォルトフィルター

カスタムゲートウェイフィルター

複数のフィルターを実行する


AddRequestHeader GatewayFilter工場

対応するキーと値を追加します

server:
  port: 9000
​
spring:
  cloud:
    gateway:
      routes:
        - id: my_route
          uri: http://localhost:7070
          predicates:
            - Path=/info/**
          filters:
            - AddRequestHeader=X-Request-Color, blue

コントローラーはリクエストヘッダートラバーサル出力を取得します

Postmanはリクエストヘッダーを追加して出力することもできます

AddRequestHeadersIfNotPresent GatewayFilter工場

複数のキーと値のセットを追加可能(リクエストヘッダーに対応するキーが存在しない場合)

server:
  port: 9000
​
spring:
  cloud:
    gateway:
      routes:
        - id: my_route
          uri: http://localhost:7070
          predicates:
            - Path=/info/**
          filters:
            - AddRequestHeadersIfNotPresent=X-Request-Color:blue,school:rjxy
@GetMapping("/allHeaders")
    public String allHeadersHandle(HttpServletRequest request){
        StringBuilder sb = new StringBuilder();
        //获取请求头所有的key
        Enumeration<String> headerNames = request.getHeaderNames();
        //遍历所有key
        while (headerNames.hasMoreElements()) {
            //获取key
            String name = headerNames.nextElement();
            sb.append(name+"===");
            //获取当前key的所有value
            Enumeration<String> headers = request.getHeaders(name);
            //遍历所有value
            while (headers.hasMoreElements()) {
                //将当前遍历的value追加到sb中
                sb.append(headers.nextElement()+"");
            }
            sb.append("<br>");
​
        }
        
        return sb.toString();
    }

コントローラーはリクエスト ヘッダーを調べて出力し、追加は成功します。

 

AddRequestParameter GatewayFilter工場

リクエストパラメータの追加

server:
  port: 9000
​
spring:
  cloud:
    gateway:
      routes:
        - id: my_route
          uri: http://localhost:7070
          predicates:
            - Path=/info/**
          filters:
            - AddRequestParameter=red, blue

コントローラ

@GetMapping("/params")
    public String paramsHandle(String red){
​
        return red;
    }

 

成功を得る

AddResponseHeader GatewayFilter工場

変更への対応

server:
  port: 9000
​
spring:
  cloud:
    gateway:
      routes:
        - id: my_route
          uri: http://localhost:7070
          predicates:
            - Path=/info/**
          filters:
            - AddResponseHeader=X-Response-color, Blue
            - AddResponseHeader=X-Response-color, Red

直接 F12 を押して応答ヘッダーを表示し、正常に追加されました

 

サーキットブレーカー ゲートウェイフィルター ファクトリ

サーキット ブレーカー フィルター ファクトリは、ゲートウェイ層でのサービス サーキット ブレーカーとダウングレードを完了します。

server:
  port: 9000
​
spring:
  cloud:
    gateway:
      routes:
        - id: my_route
          uri: http://localhost:7070
          predicates:
            - Path=/info/**
          filters:
            - name: CircuitBreaker
              args:
                name: myCircuitBreaker
                fallbackUri: forward:/fb

http://localhost:7070にアクセスできない場合は、forward:/fb にアクセスするようにダウングレードします。

コントローラのダウングレード

@GetMapping("/fb")
    public String fallbackHandle(){
        return "This is the Gateway Fallback";
    }

テスト。7070 を直接起動しないでください。9000 にアクセスしてください。サーキット ブレーカーは成功しました。

 

ステータスコードに基づくサーキットブレーカー

PrefixPath GatewayFilter工場

server:
  port: 9000
​
spring:
  cloud:
    gateway:
      routes:
        - id: my_route
          uri: http://localhost:8081
          predicates:
            - Path=/student/**
          filters:
            - PrefixPath=/provider

フィールドを照合し、プレフィックスを追加すると、サブモジュールが自動的にパスを追加します

 

テストの成功

StripPrefix GatewayFilter工場

指定されたリクエストパスを削除します

server:
  port: 9000
​
spring:
  cloud:
    gateway:
      routes:
        - id: my_route
          uri: http://localhost:8081
          predicates:
            - Path=/aa/bb/provider/student/**
          filters:
            - StripPrefix=2

/aa/bb を削除します

 

テストの成功

RewritePath GatewayFilter工場

パスを書き換える

server:
  port: 9000
​
spring:
  cloud:
    gateway:
      routes:
        - id: my_route
          uri: http://localhost:8081
          predicates:
            - Path=/red/blue/**
          filters:
            - RewritePath=/red/blue,/provider/student
            //            - RewritePath=/red/?(?<segment>.*), /$\{segment}

パスを照合し、指定されたパスに置き換えます

 

RequestRateLimiter GatewayFilter工場

トークンバケットアルゴリズムを通じて受信リクエストのフローを制限する

依存関係をインポートする

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis-reactive -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
    <version>3.0.5</version>
</dependency>

レート制限キーパーサーを追加する

スタートアップ クラスに電流制限キー パーサーを追加します。これは、リクエストから制限する必要があるキーを解析するために使用されます。

この例では、要求されたホストまたは IP に基づいてフロー制限を指定します。

package com.guo;
​
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import reactor.core.publisher.Mono;
​
@SpringBootApplication
public class Application {
​
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
​
    @Bean
    KeyResolver userKeyResolver() {
        return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
    }
}

設定ファイルを変更する

server:
  port: 9000
​
​
​
spring:
  cloud:
    gateway:
      routes:
        - id: my_route
          uri: http://localhost:8081
          predicates:
            - Path=/**
          filters:
#              replenishRate 填充率
            - name: RequestRateLimiter
              args:
                key-resolver: "#{@userKeyResolver}"
                redis-rate-limiter.replenishRate: 2
                redis-rate-limiter.burstCapacity: 5
                redis-rate-limiter.requestedTokens: 1
  data:
    redis:
      host: 127.0.0.1
      port: 6379

 

成功

デフォルトフィルター

server:
  port: 9000
​
spring:
  cloud:
    gateway:
      default-filters:
        - AddRequestHeader=X-Request-Color, Default-Blue
      routes:
        - id: my_route
          uri: http://localhost:7070
          predicates:
            - Path=/info/header
​
        - id: my_route
          uri: http://localhost:7070
          predicates:
            - Path=/info/headers

 

テストの成功

カスタムゲートウェイフィルター

AddHeaderGatewayFilter.java

public class AddHeaderGatewayFilter implements GatewayFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest()
                                            .mutate()
                                            .header("X-Request-Color", "filter-Red")
                                            .build();
        ServerWebExchange webExchange = exchange.mutate().request(request).build();
        return chain.filter(webExchange);
    }
}

カスタム GatewayFilter を呼び出す

@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder){
    return builder.routes()
            .route("my_router2",
                    ps ->ps.path("/info/**")
                            .filters(fs->fs.filter(new AddHeaderGatewayFilter()))
                            .uri("http://localhost:7070"))
            .build();
}

 

テストの成功

複数のフィルターを実行する

OneGateWayFilter.java

@Slf4j
public class OneGateWayFilter implements GatewayFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        long startTime = System.currentTimeMillis();
        log.info("oneFilter-pre:"+startTime);
        exchange.getAttributes().put("startTime",startTime);
        return chain.filter(exchange).then(
                Mono.fromRunnable(()->{
                    log.info("oneFilter------post");
                    Long startTimeAttr = (Long) exchange.getAttributes().get("startTime");
                    long elaspedTime = System.currentTimeMillis() - startTimeAttr;
                    log.info("所有过滤器执行的时间(毫秒)为:"+elaspedTime);
                })
        );
    }
}

TwoGateWayFilter.java

@Slf4j
public class TwoGateWayFilter implements GatewayFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("TwoFilter----pre");
        return chain.filter(exchange).then(
                Mono.fromRunnable(()->{
                    log.info("TwoFilter------post");
                })
        );
    }
}

ThreeGateWayFilter.java

@Slf4j
public class ThreeGateWayFilter implements GatewayFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        log.info("ThreeFilter----pre");
        return chain.filter(exchange).then(
                Mono.fromRunnable(()->{
                    log.info("ThreeFilter------post");
                })
        );
    }
}

 

試験結果

おすすめ

転載: blog.csdn.net/qq_52183856/article/details/130535536