深入 Spring Cloud Gateway 过滤器

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 Tair(兼容Redis),内存型 2GB
简介: Spring Cloud Gateway 是新一代微服务网关框架,支持多种过滤器实现。本文详解了 `GlobalFilter`、`GatewayFilter` 和 `AbstractGatewayFilterFactory` 三种过滤器的实现方式及其应用场景,帮助开发者高效利用这些工具进行网关开发。

概述

Spring Cloud Gateway 是 Spring Cloud 家族中的新一代微服务网关框架,它为构建 API 网关提供了强大的功能。Spring Cloud Gateway 的核心组件之一就是过滤器,本文将详细介绍 GlobalFilterGatewayFilterAbstractGatewayFilterFactory 三种过滤器的实现方式,并探讨如何在实践中高效地使用它们。

1. 全局过滤器 (GlobalFilter)

全局过滤器 (GlobalFilter) 是一种可以在所有路由请求上执行的过滤器。它可以用于实现一些通用的功能,如日志记录、认证授权等。

实现步骤

  1. 创建全局过滤器:

kotlin

  1. 代码解读
  2. 复制代码
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
public class LoggingFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        System.out.println("LoggingFilter: " + request.getMethodValue());
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return 0; // 顺序越小,执行越早
    }
}
  1. 注册全局过滤器: 无需显式注册,因为全局过滤器通过 @Component 注解自动扫描。

特点

  • 简单易用:只需实现 GlobalFilter 接口即可。
  • 全局应用:对所有路由生效。

2. 路由过滤器 (GatewayFilter)

路由过滤器 (GatewayFilter) 可以被指定到特定的路由上,提供了更细粒度的控制能力。

实现步骤

  1. 创建GatewayFilter:

typescript

  1. 代码解读
  2. 复制代码
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
public class SignatureVerificationGatewayFilter implements GatewayFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        // 验证签名
        if (!validateSignature(request)) {
            return Mono.error(new RuntimeException("Invalid signature"));
        }
        return chain.filter(exchange);
    }

    private boolean validateSignature(ServerHttpRequest request) {
        // 实现签名验证逻辑
        return true; // 假设验证成功
    }

    @Override
    public int getOrder() {
        return 0; // 顺序越小,执行越早
    }
}
  1. 配置路由: 请注意,由于 GatewayFilter 通过 @Component 注解自动扫描,无需显式注册。

kotlin

  1. 代码解读
  2. 复制代码
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;

@Configuration
public class GatewayConfig {

    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
                .route(r -> r.path("/api/signed")
                        .filters(f -> f.filter(new SignatureVerificationGatewayFilter()))
                        .uri("http://localhost:8080"))
                .build();
    }
}

特点

  • 细粒度控制:可以针对特定路由应用。
  • 自动注册:通过 @Component 注解自动扫描,无需显式注册。
  • Java配置:必须通过Java配置来实现。

3. 自定义过滤器工厂 (AbstractGatewayFilterFactory)

AbstractGatewayFilterFactory自定义过滤器工厂提供了一个更加灵活的方式来创建 GatewayFilter 实例。这种方式允许你定义配置选项,并且可以通过工厂模式来创建多个不同的过滤器实例。与 GatewayFilter 类似,AbstractGatewayFilterFactory 也可以通过 @Component 注解自动扫描。

实现步骤

  1. 创建自定义工厂类:

scala

  1. 代码解读
  2. 复制代码
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

@Component
public class SignatureVerificationGatewayFilterFactory extends AbstractGatewayFilterFactory<SignatureVerificationGatewayFilterFactory.Config> {

    public SignatureVerificationGatewayFilterFactory() {
        super(Config.class);
    }

    @Override
    public GatewayFilter apply(Config config) {
        return (exchange, chain) -> {
            ServerHttpRequest request = exchange.getRequest();
            // 验证签名
            if (!validateSignature(request)) {
                return Mono.error(new RuntimeException("Invalid signature"));
            }
            return chain.filter(exchange);
        };
    }

    private boolean validateSignature(ServerHttpRequest request) {
        // 实现签名验证逻辑
        return true; // 假设验证成功
    }

    public static class Config {}
}
  1. 配置路由: AbstractGatewayFilterFactory 可以通过 YAML 文件来配置,这里提供一个 YAML 示例:

yaml

  1. 代码解读
  2. 复制代码
spring:
  cloud:
    gateway:
      routes:
      - id: signed_route
        uri: http://localhost:8080
        predicates:
          - Path=/api/signed
        filters:
          - name: SignatureVerificationGatewayFilterFactory
            args: {}

特点

  • 高级定制:允许通过配置参数来自定义过滤器的行为。
  • 自动注册:通过 @Component 注解自动扫描,无需显式注册。
  • 工厂模式:适用于需要创建多个具有不同配置的过滤器实例的情况。

4. 关键区别

  • GlobalFilter:适用于全局性的操作,易于实现但缺乏细粒度控制。
  • GatewayFilter:提供细粒度控制,可以针对特定路由应用,通过 @Component 注解自动扫描。
  • AbstractGatewayFilterFactory:提供更高级别的定制性和灵活性,适用于复杂的场景,并且可以通过 YAML 文件来配置,同样通过 @Component 注解自动扫描。

结论

根据你的需求和项目特性,你可以选择最适合的方式。如果需要全局性的操作,GlobalFilter 是一个不错的选择;如果需要更精细的控制,则可以选择 GatewayFilter;而对于高度定制化的场景,AbstractGatewayFilterFactory 则更为合适,并且可以通过 YAML 文件来配置。


以上就是 Spring Cloud Gateway 中 GlobalFilterGatewayFilter 以及 AbstractGatewayFilterFactory 的详细解析与实践指南。希望能够帮助您更好地理解和运用这些过滤器来优化您的网关应用程序。


转载来源:https://juejin.cn/post/7405471008600195113

目录
打赏
0
1
1
0
138
分享
相关文章
|
3月前
|
利用Spring Cloud Gateway Predicate优化微服务路由策略
Spring Cloud Gateway 的路由配置中,`predicates`​(断言)用于定义哪些请求应该匹配特定的路由规则。 断言是Gateway在进行路由时,根据具体的请求信息如请求路径、请求方法、请求参数等进行匹配的规则。当一个请求的信息符合断言设置的条件时,Gateway就会将该请求路由到对应的服务上。
235 69
利用Spring Cloud Gateway Predicate优化微服务路由策略
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
本文介绍了如何使用Spring Cloud Alibaba 2023.0.0.0技术栈构建微服务网关,以应对微服务架构中流量治理与安全管控的复杂性。通过一个包含鉴权服务、文件服务和主服务的项目,详细讲解了网关的整合与功能开发。首先,通过统一路由配置,将所有请求集中到网关进行管理;其次,实现了限流防刷功能,防止恶意刷接口;最后,添加了登录鉴权机制,确保用户身份验证。整个过程结合Nacos注册中心,确保服务注册与配置管理的高效性。通过这些实践,帮助开发者更好地理解和应用微服务网关。
106 0
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
项目中用的网关Gateway及SpringCloud
Spring Cloud Gateway 是一个功能强大、灵活易用的API网关解决方案。通过配置路由、过滤器、熔断器和限流等功能,可以有效地管理和保护微服务。本文详细介绍了Spring Cloud Gateway的基本概念、配置方法和实际应用,希望能帮助开发者更好地理解和使用这一工具。通过合理使用Spring Cloud Gateway,可以显著提升微服务架构的健壮性和可维护性。
138 0
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中过滤器的基础知识和实战项目应用的教程。
82 0
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
【Spring Cloud生态】Spring Cloud Gateway基本配置
【Spring Cloud生态】Spring Cloud Gateway基本配置
106 0
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——基于 xml 的整合
本教程介绍了基于XML的MyBatis整合方式。首先在`application.yml`中配置XML路径,如`classpath:mapper/*.xml`,然后创建`UserMapper.xml`文件定义SQL映射,包括`resultMap`和查询语句。通过设置`namespace`关联Mapper接口,实现如`getUserByName`的方法。Controller层调用Service完成测试,访问`/getUserByName/{name}`即可返回用户信息。为简化Mapper扫描,推荐在Spring Boot启动类用`@MapperScan`注解指定包路径避免逐个添加`@Mapper`
29 0
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——Thymeleaf 介绍
本课介绍Spring Boot集成Thymeleaf模板引擎。Thymeleaf是一款现代服务器端Java模板引擎,支持Web和独立环境,可实现自然模板开发,便于团队协作。与传统JSP不同,Thymeleaf模板可以直接在浏览器中打开,方便前端人员查看静态原型。通过在HTML标签中添加扩展属性(如`th:text`),Thymeleaf能够在服务运行时动态替换内容,展示数据库中的数据,同时兼容静态页面展示,为开发带来灵活性和便利性。
34 0
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——少量配置信息的情形
本课主要讲解Spring Boot项目中的属性配置方法。在实际开发中,测试与生产环境的配置往往不同,因此不应将配置信息硬编码在代码中,而应使用配置文件管理,如`application.yml`。例如,在微服务架构下,可通过配置文件设置调用其他服务的地址(如订单服务端口8002),并利用`@Value`注解在代码中读取这些配置值。这种方式使项目更灵活,便于后续修改和维护。
16 0
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— application.yml 中对日志的配置
在 Spring Boot 项目中,`application.yml` 文件用于配置日志。通过 `logging.config` 指定日志配置文件(如 `logback.xml`),实现日志详细设置。`logging.level` 可定义包的日志输出级别,例如将 `com.itcodai.course03.dao` 包设为 `trace` 级别,便于开发时查看 SQL 操作。日志级别从高到低为 ERROR、WARN、INFO、DEBUG,生产环境建议调整为较高级别以减少日志量。本课程采用 yml 格式,因其层次清晰,但需注意格式要求。
36 0
|
14天前
|
基于SpringBoot的Redis开发实战教程
Redis在Spring Boot中的应用非常广泛,其高性能和灵活性使其成为构建高效分布式系统的理想选择。通过深入理解本文的内容,您可以更好地利用Redis的特性,为应用程序提供高效的缓存和消息处理能力。
121 79

数据库

+关注
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等