Skip to content

配置路由断言工厂和网关过滤器工厂

概述

在 Spring Cloud Gateway 中,路由断言(Route Predicate)和过滤器(Filter)是核心组件,它们决定了请求如何被路由和处理。本文将详细介绍这两种组件的配置方式,帮助您构建灵活、强大的 API 网关。

业务场景

想象您正在构建一个电商平台的 API 网关,需要根据不同的条件将请求路由到不同的微服务:

  • 用户服务:处理用户认证和个人信息
  • 商品服务:处理商品查询和管理
  • 订单服务:处理订单创建和查询

您需要根据请求路径、请求头、Cookie 等条件来决定将请求路由到哪个服务,同时可能需要添加一些过滤逻辑(如认证、限流、日志记录等)。

配置方式概述

Spring Cloud Gateway 提供了两种配置断言和过滤器的方式:

  1. 快捷配置(Shortcut Configuration):简洁的配置方式
  2. 完全展开参数(Fully Expanded Arguments):详细的 YAML 配置方式

大多数示例都使用快捷配置方式,因为它更简洁易读。参数名称和参数通常按照快捷配置所需的顺序列出。

快捷配置

语法格式

快捷配置的语法结构如下:

过滤器名称=参数1,参数2,参数3
  • 过滤器名称后跟等号(=
  • 参数值用逗号(,)分隔

实际示例

以下是一个使用 Cookie 断言的电商网关配置示例:

yaml
spring:
  cloud:
    gateway:
      routes:
        - id: user_service_route # 用户服务路由
          uri: https://user-service.example.com
          predicates:
            - Cookie=session_token,^[A-Za-z0-9]+$ # 检查是否存在有效的session token

在这个示例中:

  • Cookie:断言工厂名称
  • session_token:Cookie 名称
  • ^[A-Za-z0-9]+$:Cookie 值的正则表达式模式

业务流程图

完全展开参数配置

语法格式

完全展开参数配置采用标准的 YAML 配置格式:

yaml
predicates:
  - name: 断言工厂名称
    args:
      参数名1: 参数值1
      参数名2: 参数值2

实际示例

以下是与上面快捷配置等效的完全展开配置:

yaml
spring:
  cloud:
    gateway:
      routes:
        - id: user_service_route
          uri: https://user-service.example.com
          predicates:
            - name: Cookie # 断言工厂名称
              args:
                name: session_token # Cookie名称参数
                regexp: ^[A-Za-z0-9]+$ # Cookie值的正则表达式参数

实际业务场景示例

场景 1:电商平台多服务路由

yaml
spring:
  cloud:
    gateway:
      routes:
        # 用户服务路由
        - id: user_service
          uri: https://user-service.example.com
          predicates:
            - Path=/api/users/**
            - Header=Authorization,Bearer.*
          filters:
            - StripPrefix=2 # 移除/api/users前缀

        # 商品服务路由
        - id: product_service
          uri: https://product-service.example.com
          predicates:
            - Path=/api/products/**
            - Method=GET,POST
          filters:
            - AddRequestHeader=X-Service-Name,ProductService

        # 订单服务路由(需要认证)
        - id: order_service
          uri: https://order-service.example.com
          predicates:
            - Path=/api/orders/**
            - Cookie=user_role,admin|customer
          filters:
            - RateLimiter=user-rate-limiter

场景 2:基于时间的服务切换

yaml
spring:
  cloud:
    gateway:
      routes:
        # 工作时间路由到主服务
        - id: main_service_worktime
          uri: https://main-service.example.com
          predicates:
            - Path=/api/**
            - Between=09:00,18:00 # 工作时间:9:00-18:00

        # 非工作时间路由到备用服务
        - id: backup_service_offhours
          uri: https://backup-service.example.com
          predicates:
            - Path=/api/**
          filters:
            - AddResponseHeader=X-Service-Mode,Backup

配置对比

配置方式优点缺点适用场景
快捷配置简洁、易读、配置快速参数顺序固定,复杂配置不够灵活简单路由、常用断言
完全展开配置参数明确、灵活性强、易于维护配置较冗长复杂路由、多参数配置

最佳实践

选择配置方式的建议:

  • 简单的断言和过滤器使用快捷配置
  • 复杂的或需要多个参数的使用完全展开配置
  • 团队协作时推荐使用完全展开配置,提高可读性

1. 命名规范

yaml
spring:
  cloud:
    gateway:
      routes:
        - id: service_name_route # 使用描述性的ID
          uri: https://service.example.com
          predicates:
            - name: Path
              args:
                pattern: /api/service/**

2. 参数验证

yaml
predicates:
  - name: Header
    args:
      header: X-Request-ID
      regexp: ^[A-Za-z0-9\-]{36}$ # UUID格式验证

3. 错误处理

yaml
filters:
  - name: Hystrix
    args:
      name: fallback-command
      fallbackUri: forward:/fallback/service-unavailable

常见问题

配置时需要注意的问题:

  1. 参数顺序:快捷配置中参数顺序很重要,必须按照官方文档的顺序配置
  2. 正则表达式转义:在 YAML 中使用正则表达式时注意转义字符
  3. URI 格式:确保目标服务的 URI 格式正确

总结

Spring Cloud Gateway 提供了灵活的配置方式来定义路由断言和过滤器:

  • 快捷配置适用于简单场景,语法简洁
  • 完全展开配置适用于复杂场景,参数明确

通过合理选择配置方式,可以构建出既简洁又强大的 API 网关系统,满足各种业务场景的需求。

在实际项目中,建议结合两种配置方式:简单的断言使用快捷配置,复杂的断言使用完全展开配置,这样既保证了配置的简洁性,又确保了复杂场景的灵活性。