SpringCloud Gateway GatewayFilter网关过滤器详解

Spring Cloud Gateway 是一个基于 Spring 5、Spring Boot 2 和 Project Reactor 构建的 API 网关。它旨在提供一种简单有效的方式来路由和增强 API 请求。GatewayFilter 是 Spring Cloud Gateway 中用于在请求进入和离开网关时执行逻辑的过滤器。

GatewayFilter 的基本概念

过滤器类型

Spring Cloud Gateway 提供了两种类型的过滤器:

  1. Global Filters(全局过滤器):适用于所有路由的过滤器。
  2. Route Filters(路由过滤器):仅适用于特定路由的过滤器。

过滤器执行顺序

过滤器有一个顺序值,决定了它们的执行顺序。较低的顺序值意味着较早执行。

过滤器的创建方式

使用 Spring Cloud Gateway 提供的内置过滤器工厂

Spring Cloud Gateway 提供了一些内置的过滤器工厂,可以直接使用:

  1. AddRequestHeader:在请求头中添加一个新的 header。
  2. AddResponseHeader:在响应头中添加一个新的 header。
  3. RewritePath:重写请求路径。
  4. StripPrefix:删除请求路径的前缀。
  5. Retry:重试请求。

配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_header_route
        uri: http://example.org
        filters:
        - AddRequestHeader=MyHeader, MyValue
        predicates:
        - Path=/my/path/**

自定义过滤器

如果内置过滤器不能满足需求,可以创建自定义过滤器。

自定义过滤器类

创建一个实现 GatewayFilter 接口的类:

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

public class MyCustomFilter implements GatewayFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 在这里添加自定义逻辑
        return chain.filter(exchange);
    }
}
注册自定义过滤器

通过 Java 配置将自定义过滤器添加到路由:

import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GatewayConfig {

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route("custom_filter_route", r -> r.path("/custom/**")
                        .filters(f -> f.filter(new MyCustomFilter()))
                        .uri("http://example.org"))
                .build();
    }
}

Global Filters(全局过滤器)

全局过滤器适用于所有的路由,可以通过实现 GlobalFilter 接口来创建全局过滤器:

import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

public class MyGlobalFilter implements GlobalFilter {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 在这里添加全局过滤逻辑
        return chain.filter(exchange);
    }
}

并将其注册为 Spring Bean:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GlobalFilterConfig {

    @Bean
    public MyGlobalFilter myGlobalFilter() {
        return new MyGlobalFilter();
    }
}

示例

AddRequestParameter 过滤器示例

添加请求参数的过滤器可以这样配置:

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_parameter_route
        uri: http://example.org
        filters:
        - AddRequestParameter=name, value
        predicates:
        - Path=/add/request/parameter/**

RewritePath 过滤器示例

重写路径的过滤器配置如下:

spring:
  cloud:
    gateway:
      routes:
      - id: rewrite_path_route
        uri: http://example.org
        filters:
        - RewritePath=/foo/(?<segment>.*), /bar/$\\{segment}
        predicates:
        - Path=/foo/**

总结

Spring Cloud Gateway 的 GatewayFilter 提供了灵活的方式来拦截和修改请求和响应。通过内置过滤器工厂和自定义过滤器,可以满足各种复杂的业务需求。了解并掌握这些过滤器的使用,对于构建健壮和高效的 API 网关至关重要。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值