• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Spring Cloud Alibaba: Gateway 网关过滤器 GatewayGatewayFilter factory (记录)

武飞扬头像
但许星辰静月
帮助1

目录

AddRequestHeader GatewayFilter factory

AddRequestHeadersIfNotPresent GatewayFilter factory

AddRequestParameter GatewayFilter Factory

AddResponseHeader GatewayFilter Factory

CircuitBreaker GatewayFilter factory

circuit breaker based on the status code

PrefixPath GatewayFilter factory

StripPrefix GatewayFilter factory

RewritePath GatewayFilter factory

RequestRateLimiter GatewayFilter factory

default-filters

自定义GatewayFilter

多filter的运行


AddRequestHeader GatewayFilter factory

添加对应key和value

  1.  
    server:
  2.  
    port: 9000
  3.  
  4.  
    spring:
  5.  
    cloud:
  6.  
      gateway:
  7.  
        routes:
  8.  
          - id: my_route
  9.  
            uri: http://localhost:7070
  10.  
            predicates:
  11.  
              - Path=/info/**
  12.  
            filters:
  13.  
              - AddRequestHeader=X-Request-Color, blue

学新通

controller获取请求头遍历输出

学新通

postman加请求头也能输出

AddRequestHeadersIfNotPresent GatewayFilter factory

可以添加多组key和value(请求头不存在对应key的情况下)

  1.  
    server:
  2.  
    port: 9000
  3.  
  4.  
    spring:
  5.  
    cloud:
  6.  
      gateway:
  7.  
        routes:
  8.  
          - id: my_route
  9.  
            uri: http://localhost:7070
  10.  
            predicates:
  11.  
              - Path=/info/**
  12.  
            filters:
  13.  
              - AddRequestHeadersIfNotPresent=X-Request-Color:blue,school:rjxy
  1.  
    @GetMapping("/allHeaders")
  2.  
       public String allHeadersHandle(HttpServletRequest request){
  3.  
           StringBuilder sb = new StringBuilder();
  4.  
           //获取请求头所有的key
  5.  
           Enumeration<String> headerNames = request.getHeaderNames();
  6.  
           //遍历所有key
  7.  
           while (headerNames.hasMoreElements()) {
  8.  
               //获取key
  9.  
               String name = headerNames.nextElement();
  10.  
               sb.append(name "===");
  11.  
               //获取当前key的所有value
  12.  
               Enumeration<String> headers = request.getHeaders(name);
  13.  
               //遍历所有value
  14.  
               while (headers.hasMoreElements()) {
  15.  
                   //将当前遍历的value追加到sb中
  16.  
                   sb.append(headers.nextElement() "");
  17.  
              }
  18.  
               sb.append("<br>");
  19.  
  20.  
          }
  21.  
           
  22.  
           return sb.toString();
  23.  
      }
学新通

controller进行请求头遍历输出,添加成功

学新通

AddRequestParameter GatewayFilter Factory

添加请求参数

  1.  
    server:
  2.  
    port: 9000
  3.  
  4.  
    spring:
  5.  
    cloud:
  6.  
      gateway:
  7.  
        routes:
  8.  
          - id: my_route
  9.  
            uri: http://localhost:7070
  10.  
            predicates:
  11.  
              - Path=/info/**
  12.  
            filters:
  13.  
              - AddRequestParameter=red, blue

controller

  1.  
    @GetMapping("/params")
  2.  
       public String paramsHandle(String red){
  3.  
  4.  
           return red;
  5.  
      }

学新通

获取成功

AddResponseHeader GatewayFilter Factory

响应修改

  1.  
    server:
  2.  
    port: 9000
  3.  
  4.  
    spring:
  5.  
    cloud:
  6.  
      gateway:
  7.  
        routes:
  8.  
          - id: my_route
  9.  
            uri: http://localhost:7070
  10.  
            predicates:
  11.  
              - Path=/info/**
  12.  
            filters:
  13.  
              - AddResponseHeader=X-Response-color, Blue
  14.  
              - AddResponseHeader=X-Response-color, Red

直接F12查看响应头,添加成功

学新通

CircuitBreaker GatewayFilter factory

熔断过滤工厂,完成网关层的服务熔断与降级

  1.  
    server:
  2.  
    port: 9000
  3.  
  4.  
    spring:
  5.  
    cloud:
  6.  
      gateway:
  7.  
        routes:
  8.  
          - id: my_route
  9.  
            uri: http://localhost:7070
  10.  
            predicates:
  11.  
              - Path=/info/**
  12.  
            filters:
  13.  
              - name: CircuitBreaker
  14.  
                args:
  15.  
                  name: myCircuitBreaker
  16.  
                  fallbackUri: forward:/fb
学新通

访问http://localhost:7070不成功时,降级访问forward:/fb

降级controller

  1.  
    @GetMapping("/fb")
  2.  
       public String fallbackHandle(){
  3.  
           return "This is the Gateway Fallback";
  4.  
      }

测试,直接不启动7070,访问9000,熔断成功

学新通

circuit breaker based on the status code

PrefixPath GatewayFilter factory

  1.  
    server:
  2.  
    port: 9000
  3.  
  4.  
    spring:
  5.  
    cloud:
  6.  
      gateway:
  7.  
        routes:
  8.  
          - id: my_route
  9.  
            uri: http://localhost:8081
  10.  
            predicates:
  11.  
              - Path=/student/**
  12.  
            filters:
  13.  
              - PrefixPath=/provider

匹配字段,加上前缀,子模块自动添加路径

学新通

测试成功

StripPrefix GatewayFilter factory

去除指定的请求路径

  1.  
    server:
  2.  
    port: 9000
  3.  
  4.  
    spring:
  5.  
    cloud:
  6.  
      gateway:
  7.  
        routes:
  8.  
          - id: my_route
  9.  
            uri: http://localhost:8081
  10.  
            predicates:
  11.  
              - Path=/aa/bb/provider/student/**
  12.  
            filters:
  13.  
              - StripPrefix=2

去除/aa/bb

学新通

测试成功

RewritePath GatewayFilter factory

重写路径

  1.  
    server:
  2.  
    port: 9000
  3.  
  4.  
    spring:
  5.  
    cloud:
  6.  
      gateway:
  7.  
        routes:
  8.  
          - id: my_route
  9.  
            uri: http://localhost:8081
  10.  
            predicates:
  11.  
              - Path=/red/blue/**
  12.  
            filters:
  13.  
              - RewritePath=/red/blue,/provider/student
  14.  
              //           - RewritePath=/red/?(?<segment>.*), /$\{segment}

匹配路径,替换成指定路径

学新通

RequestRateLimiter GatewayFilter factory

通过令牌桶算法对进来的请求进行限流

导入依赖

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

添加限流键解析器

在启动类中添加一个限流键解析器,其用于从请求中解析出需要限流的key。

本例指定的是根据请求的host或ip进行限流。

  1.  
    package com.guo;
  2.  
  3.  
    import org.springframework.boot.SpringApplication;
  4.  
    import org.springframework.boot.autoconfigure.SpringBootApplication;
  5.  
    import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
  6.  
    import org.springframework.context.annotation.Bean;
  7.  
    import reactor.core.publisher.Mono;
  8.  
  9.  
    @SpringBootApplication
  10.  
    public class Application {
  11.  
  12.  
       public static void main(String[] args) {
  13.  
           SpringApplication.run(Application.class, args);
  14.  
      }
  15.  
  16.  
       @Bean
  17.  
       KeyResolver userKeyResolver() {
  18.  
           return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getHostName());
  19.  
      }
  20.  
    }
学新通

修改配置文件

  1.  
    server:
  2.  
    port: 9000
  3.  
  4.  
  5.  
  6.  
    spring:
  7.  
    cloud:
  8.  
      gateway:
  9.  
        routes:
  10.  
          - id: my_route
  11.  
            uri: http://localhost:8081
  12.  
            predicates:
  13.  
              - Path=/**
  14.  
            filters:
  15.  
    #             replenishRate 填充率
  16.  
              - name: RequestRateLimiter
  17.  
                args:
  18.  
                  key-resolver: "#{@userKeyResolver}"
  19.  
                  redis-rate-limiter.replenishRate: 2
  20.  
                  redis-rate-limiter.burstCapacity: 5
  21.  
                  redis-rate-limiter.requestedTokens: 1
  22.  
    data:
  23.  
      redis:
  24.  
        host: 127.0.0.1
  25.  
        port: 6379
学新通

学新通

成功

default-filters

  1.  
    server:
  2.  
    port: 9000
  3.  
  4.  
    spring:
  5.  
    cloud:
  6.  
      gateway:
  7.  
        default-filters:
  8.  
          - AddRequestHeader=X-Request-Color, Default-Blue
  9.  
        routes:
  10.  
          - id: my_route
  11.  
            uri: http://localhost:7070
  12.  
            predicates:
  13.  
              - Path=/info/header
  14.  
  15.  
          - id: my_route
  16.  
            uri: http://localhost:7070
  17.  
            predicates:
  18.  
              - Path=/info/headers
学新通

学新通 

测试成功

自定义GatewayFilter

AddHeaderGatewayFilter.java

  1.  
    public class AddHeaderGatewayFilter implements GatewayFilter {
  2.  
       @Override
  3.  
       public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  4.  
           ServerHttpRequest request = exchange.getRequest()
  5.  
                                              .mutate()
  6.  
                                              .header("X-Request-Color", "filter-Red")
  7.  
                                              .build();
  8.  
           ServerWebExchange webExchange = exchange.mutate().request(request).build();
  9.  
           return chain.filter(webExchange);
  10.  
      }
  11.  
    }

调用自定义的GatewayFilter

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

学新通

测试成功

多filter的运行

OneGateWayFilter.java

  1.  
    @Slf4j
  2.  
    public class OneGateWayFilter implements GatewayFilter {
  3.  
       @Override
  4.  
       public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  5.  
           long startTime = System.currentTimeMillis();
  6.  
           log.info("oneFilter-pre:" startTime);
  7.  
           exchange.getAttributes().put("startTime",startTime);
  8.  
           return chain.filter(exchange).then(
  9.  
                   Mono.fromRunnable(()->{
  10.  
                       log.info("oneFilter------post");
  11.  
                       Long startTimeAttr = (Long) exchange.getAttributes().get("startTime");
  12.  
                       long elaspedTime = System.currentTimeMillis() - startTimeAttr;
  13.  
                       log.info("所有过滤器执行的时间(毫秒)为:" elaspedTime);
  14.  
                  })
  15.  
          );
  16.  
      }
  17.  
    }
学新通

TwoGateWayFilter.java

  1.  
    @Slf4j
  2.  
    public class TwoGateWayFilter implements GatewayFilter {
  3.  
       @Override
  4.  
       public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  5.  
           log.info("TwoFilter----pre");
  6.  
           return chain.filter(exchange).then(
  7.  
                   Mono.fromRunnable(()->{
  8.  
                       log.info("TwoFilter------post");
  9.  
                  })
  10.  
          );
  11.  
      }
  12.  
    }

ThreeGateWayFilter.java

  1.  
    @Slf4j
  2.  
    public class ThreeGateWayFilter implements GatewayFilter {
  3.  
       @Override
  4.  
       public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  5.  
           log.info("ThreeFilter----pre");
  6.  
           return chain.filter(exchange).then(
  7.  
                   Mono.fromRunnable(()->{
  8.  
                       log.info("ThreeFilter------post");
  9.  
                  })
  10.  
          );
  11.  
      }
  12.  
    }

学新通

测试结果

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfikgbf
系列文章
更多 icon
同类精品
更多 icon
继续加载