跳至主要內容

Spring Cloud Gateway

酷风大约 4 分钟

Spring Cloud Gateway

网关

  • 网关
    • 网关的基础就是路由功能,通俗解释就是地址转发。

介绍

  • Spring Cloud Gateway
    • 一个构建API网关的库,在 Spring WebFlux 或 Spring WebMVC 之上。
    • 提供了一种简单而有效的方式来路由到API
    • 并为它们提供横切关注点,例如:安全性、监控/指标和弹性。

  • 主要特性
    1. 基于Spring框架和Spring Boot;
    2. 动态路由,能够匹配任何请求属性的路由;
    3. 可以对路由指定 断言(Predicate)和 过滤器(Filter)
    4. 熔断(Circuit Breaker integration)
    5. 服务发现(Spring Cloud DiscoveryClient integration)
    6. 易于编写的Predicate和Filter(Easy to write Predicates and Filters)
    7. 请求限流(Request Rate Limiting)
    8. 路径重写(Path Rewriting)

  • 三大核心概念
    1. 路由 Route
      1. 由ID和uri组成,一个路由可以包含多个 断言条件 和 多个 过滤器
    2. 断言 Predicate
      1. Java 8 Function Predicate, 输入类型 Spring Framework ServerWebExchange
      2. 匹配请求
        1. 匹配请求的任意属性,如 路径、请求头、请求参数等
    3. 过滤器 Filter
      1. 修改请求和响应

工作流程

  1. 接收请求
  2. Gateway Handler Mapping中找到与请求相匹配的路由,将其发送到Gateway Web Handler
  3. Handler再通过指定的过滤器链来对请求进行过滤处理
  4. 分发请求到业务服务端
  5. 业务服务端处理完成后,如若需要过滤器进行响应过滤处理,返回响应;

内置断言工厂

  • 匹配HTTP请求的不同属性

  • 可以组合在一起

  • 内置的断言工厂类都实现了 AbstractRoutePredicateFactory 抽象类

  • org.springframework.cloud.gateway.handler.predicate

After Route Predicate Factory

  • 设置时间参数,表示路由配置会在指定时间点之后生效
- After=2025-05-20T08:00:00.000+08:00[Asia/Shanghai]

Before Route Predicate Factory

  • 设置时间参数,表示路由配置会在指定时间点之前生效
- Before=2035-05-20T08:00:00.000+08:00[Asia/Shanghai]

Between Route Predicate Factory

  • 设置时间区间,表示路由配置会在指定的时间区间内生效
- Between=2025-05-20T08:00:00.000+08:00[Asia/Shanghai],2035-05-20T08:00:00.000+08:00[Asia/Shanghai]
  • 设置Cookie匹配
    • 有两个参数
      • Cookie 名称
      • regexp(一个Java正则表达式) ,Cookie 值 正则表达式
- Header=X-Request-Id, \d+

Header Route Predicate Factory

  • 设置请求头匹配
    • 有两个参数
      • Header 名称
      • regexp(一个Java正则表达式) ,Header 值 正则表达式

Host Route Predicate Factory

  • 匹配 主机名模式 列表,多个使用逗号隔开
  • Ant风格主机名匹配规则,使用 . 分隔
    • org.springframework.util.AntPathMatcher
    • ? 匹配任何单字符
    • * 匹配0或者任意数量的字符
    • ** 匹配0或者更多的目录
- Host=**.somehost.org,**.anotherhost.org

Method Route Predicate Factory

  • 匹配的HTTP请求方式
- Method=GET

Path Route Predicate Factory

  • 匹配请求路径
    • 多个使用逗号 , 分隔
    • 是一个Spring PathMatcher 模式列表
      • URI模板变量(如 segment)
- Path=/red/{segment},/blue/{segment}
# 匹配 /red/1 or /red/blue or /blue/green

Query Route Predicate Factory

  • 匹配请求参数
    • 参数1: 参数名称
    • 参数2(可选): 参数值表达式 (java 正则表达式)
# 匹配参数名
- Query=green

# 匹配参数及值
- Query=red, gree.

RemoteAddr Route Predicate Factory

  • 匹配 远程Addr route获取源的列表(最小大小1)
    • 源是CIDR表示法(IPv4或IPv6)字符串,例如192.168.0.1/16(其中192.168.0.1是IP地址,16是子网掩码)
- RemoteAddr=192.168.1.1/24

Weight Route Predicate Factory

  • 匹配权重
    • 参数1 : group
    • 参数2 : weight (an int)
  • 权重按组计算。
spring:
  cloud:
    gateway:
      routes:
      - id: weight_high
        uri: https://weighthigh.org
        predicates:
        - Weight=group1, 8
      - id: weight_low
        uri: https://weightlow.org
        predicates:
        - Weight=group1, 2

# group1
# 这条路由将把80%的流量转发给weighthigh.org, 20%的流量转发给weighlow.org

内置过滤器


  • 位于包:org.springframework.cloud.gateway.filter.factory

AddRequestHeader GatewayFilter

  • AddRequestHeaderGatewayFilterFactory
  • 添加请求头
    • 可结合使用URI变量(uri变量作用于请求头参数中)
routes:
  - id: add_request_header_route
    uri: https://example.org
    filters:
    - AddRequestHeader=X-Request-red, blue

# 例2 segment
routes:
  - id: add_request_header_route
    uri: https://example.org
    predicates:
    - Path=/red/{segment}
    filters:
    - AddRequestHeader=X-Request-Red, Blue-{segment}

···

自定义Predicate

  • 继承 org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory
@Component
public class DemoPredicate extends AbstractRoutePredicateFactory<DemoPredicate.Config> {

    public DemoPredicate(Class<Config> configClass) {
        super(configClass);
    }

    public static class Config{

    }
    
    @Override
    public Predicate<ServerWebExchange> apply(Config config) {
        return null;
    }
    
}

自定义Filter

  • 实现 GatewayFilterOrdered 接口
    • org.springframework.cloud.gateway.filter.GatewayFilter
    • org.springframework.core.Ordered
@Component
public class DemoFilter implements GatewayFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        return null;
    }

    @Override
    public int getOrder() {
        return 0;
    }
}