Appearance
配置路由断言工厂和网关过滤器工厂
概述
在 Spring Cloud Gateway 中,路由断言(Route Predicate)和过滤器(Filter)是核心组件,它们决定了请求如何被路由和处理。本文将详细介绍这两种组件的配置方式,帮助您构建灵活、强大的 API 网关。
业务场景
想象您正在构建一个电商平台的 API 网关,需要根据不同的条件将请求路由到不同的微服务:
- 用户服务:处理用户认证和个人信息
- 商品服务:处理商品查询和管理
- 订单服务:处理订单创建和查询
您需要根据请求路径、请求头、Cookie 等条件来决定将请求路由到哪个服务,同时可能需要添加一些过滤逻辑(如认证、限流、日志记录等)。
配置方式概述
Spring Cloud Gateway 提供了两种配置断言和过滤器的方式:
- 快捷配置(Shortcut Configuration):简洁的配置方式
- 完全展开参数(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常见问题
配置时需要注意的问题:
- 参数顺序:快捷配置中参数顺序很重要,必须按照官方文档的顺序配置
- 正则表达式转义:在 YAML 中使用正则表达式时注意转义字符
- URI 格式:确保目标服务的 URI 格式正确
总结
Spring Cloud Gateway 提供了灵活的配置方式来定义路由断言和过滤器:
- 快捷配置适用于简单场景,语法简洁
- 完全展开配置适用于复杂场景,参数明确
通过合理选择配置方式,可以构建出既简洁又强大的 API 网关系统,满足各种业务场景的需求。
在实际项目中,建议结合两种配置方式:简单的断言使用快捷配置,复杂的断言使用完全展开配置,这样既保证了配置的简洁性,又确保了复杂场景的灵活性。