【Spring Cloud 微服务教程】 Spring Cloud Gateway 过滤器工厂

2020/05/13

Spring Cloud Gateway 过滤器工厂

概述

GatewayFilter Factory是Spring Cloud Gateway中提供的过滤器工厂。Spring CloudGateway的路由过滤器允许以某种方式修改传入的HTTP请求或输出的HTTP响应,只作用于特定的路由。Spring Cloud Gateway中内置了很多过滤器工厂,直接采用配置的方式使用即可,同时也支持自定义GatewayFilter Factory来实现更复杂的业务需求。

快速入门

创建应用

创建一个命名为: gateway-cloud-client-filter-example 的 Spring cloud 应用。

  <properties>
        <java.version>1.8</java.version>
        <spring.cloud.alibaba.version>2.1.2.RELEASE</spring.cloud.alibaba.version>
        <spring.cloud.version>Greenwich.RELEASE</spring.cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!-- gateway -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!-- nacos -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>

        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring.cloud.alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

        </dependencies>
    </dependencyManagement>

AddRequestHeader过滤器工厂

通过名称我们可以快速明白这个过滤器工厂的作用是添加请求头。

application.yml中配置

server:
  port: 8092
spring:
  application:
    name: gateway-route
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    gateway:
      routes:
        - id: add_request_header_route
          uri: https://example.org
          predicates:
            - After=2020-05-01T14:45:39.145+08:00[Asia/Shanghai]
          filters:
            - AddRequestHeader=X-Request-Foo, Bar
logging:
  level:
    org.springframework.cloud.gateway: trace
    org.springframework.http.server.reactive: debug
    org.springframework.web.reactive: debug
    reactor.ipc.netty: debug

  • -AddRequestHeader=X-Request-Foo, Bar : 为请求添加名为 X-Request-Foo ,值为 Bar 的请求头。
  • logging: 设置 gateway 请求打印日志级别

断点测试

断点打在 org.springframework.cloud.gateway.filter.NettyRoutingFilter#filter ,debug 启动:

AddRequestParameter 过滤器工厂

新增请求参数

application.yml中配置

spring:
  cloud:
    gateway:
      routes:
        - id: add_request_header_route
          uri: https://example.org
          predicates:
            - After=2020-05-01T14:45:39.145+08:00[Asia/Shanghai]
          filters:
          #   请求参数 token:abc
            - AddRequestParameter=token,abc

Retry 过滤器工厂

Retry 过滤器工厂是一种定义的重试的过滤器工厂。在 Retry 过滤器工厂有以下 5 个参数。

  • retries:默认为3,重试次数,非负数
  • series:用来指定哪些段的状态码需要重试,默认SERVER_ERROR,即5xx。
  • statuses:用于指定哪些状态需要重试,默认为空,它跟series至少得指定一个。一般不怎么配置这个。
  • methods:于指定那些方法的请求需要重试,默认为GET
  • exceptions:用于指定哪些异常需要重试,默认为java.io.IOExceptionjava.util.concurrent.TimeoutException
spring:
  cloud:
    gateway:
      routes:
        - id: add_request_header_route
          uri: https://example.org
          predicates:
            - After=2020-05-01T14:45:39.145+08:00[Asia/Shanghai]
          filters:
             # 过滤器工厂名称
            - name: Retry
              args:
                  # 默认 3
                retries: 3
                series: SERVER_ERROR
                statuses: INTERNAL_SERVER_ERROR,BAD_GATEWAY
                methods: GET,POST,DELETE,PUT
                exceptions:
                  - java.io.IOException
                  - java.util.concurrent.TimeoutException

文章参考

  • https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway

代码示例

本文示例代码访问下面查看仓库:

其中,本文示例代码名称:

  • gateway-cloud-client-filter-example:过滤器断言工厂


微信扫描二维码,关注一个有故事的程序员

(转载本站文章请注明作者和出处 山间木匠-mtcarpenter

Post Directory

扫码关注公众号:山间木匠
发送 290992
即可立即永久解锁本站全部文章