SpringCloud-GateWay网关

简介

SpringCloud gateWay 是为微服务架构提供一种简单有效的统一的API路由管理方式。

SpringCloud GateWay 作为 SpringCloud 生态系统中的网关,是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty.

SpringCloud GateWay 的目标提供统一的路由方式且基于 Filter 链的方式提供了网关基于的功能。例如:安全,监控/指标,限流。

官方地址**SpringCloud gateway官网地址https://spring.io/projects/spring-cloud-gateway#overview**

特性

  • 基于 Spring Framework 和 Spring Boot 进行构建。
  • 兼容 Spring WebFlux 和 Spring Web MVC。
  • 动态路由:能够匹配任何请求属性。
  • 可以对路由指定 断言 和 过滤器。
  • 集成 Hystrix 的断路器功能。
  • 集成 Spring Cloud 服务发现功能。
  • 易于编写的 断言 和 过滤器。
  • 请求限流功能
  • 支持路径重写。

在项目中可以使用gateWay做反向代理、鉴权、流量控制、熔断、日志监控等。

核心概念

1、 三大核心

Route(路由):路由是构建网关的基本模块,它由ID,目标URL,一系列的断言和过滤器组成,如果断言为 TRUE 则匹配该路由。

Predicate(断言):匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由。

Filter(过滤):使用过滤器,可以在请求被路由前或者之后对请求进行修改。

2、工作流程

客户端向Spring Cloud Gateway发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关Web处理程序。 此处理程序通过特定于请求的筛选器链运行请求。 过滤器用虚线分隔的原因是过滤器可以在发送代理请求之前和之后运行逻辑。 执行所有的预过滤器逻辑,然后发出代理请求。发出代理请求后,将运行post过滤器逻辑。

客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。

Handler 再通过指定的过滤器链来将请求发送到实际的服务执行业务逻辑,然后返回。

过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前("pre")或之后("post")执行业务逻辑。

Filter在"pre"类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等,

在"post"类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等有着非常重要的作用。

Predicate(断言)

GateWay官网对于断言配置解释https://docs.spring.io/spring-cloud-gateway/reference/4.3/spring-cloud-gateway-server-webmvc/gateway-request-predicates.html

After,Before, Between

java 复制代码
spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
      routes:
        - id: payment_routh #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
#          uri: http://localhost:8001          #匹配后提供服务的路由地址
          uri: lb://CLOUD-PROVIDER-HYSTRIX-PAYMENT        #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/circuit/**         # 断言,路径相匹配的进行路由
            - After=2026-01-19T11:00:00.685+08:00[Asia/Shanghai]
            - Before=2026-01-19T19:00:00.685+08:00[Asia/Shanghai]
            - Between=2026-01-19T11:00:00.685+08:00[Asia/Shanghai],2026-01-19T19:00:00.685+08:00[Asia/Shanghai]
                

After: 表示在配置的时间之前进行访问会出现错误

Before:表示在配置的时间之前可以进行访问页面

Between: 表示在配置的时间区间能够正常的进行访问

指定Cookie里面携带某个值时可以访问服务

例如:Cookie里面必须要带用户名

java 复制代码
spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
      routes:
        - id: payment_routh #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
#          uri: http://localhost:8001          #匹配后提供服务的路由地址
          uri: lb://CLOUD-PROVIDER-HYSTRIX-PAYMENT        #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/circuit/**         # 断言,路径相匹配的进行路由
            - Cookie=username, lisi

1)Cookie携带多个值(或关系)

bash 复制代码
--第一种
spring:
  cloud:
    gateway:
      routes:
        - id: cookie-multi-value-route
          uri: http://localhost:8081
          predicates:
            - Cookie=userType, admin
            - Cookie=userType, test
            - Cookie=userType, guest




--第二种
spring:
  cloud:
    gateway:
      routes:
        - id: cookie-multi-value-route
          uri: http://localhost:8081
          predicates:
            # 匹配Cookie键为userType,值为admin、test、guest中的任意一个
            - Cookie=userType, ^(admin|test|guest)$

2)Cookie携带多个值(与关系)

bash 复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: multi-cookie-route
          uri: http://localhost:8081
          predicates:
            # 必须同时满足:Cookie包含token=abc123 且 userId=1001
            - Cookie=token, abc123
            - Cookie=userId, 1001

请求头携带某个值时可以访问服务

XML 复制代码
spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
      routes:
        - id: payment_routh #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
#          uri: http://localhost:8001          #匹配后提供服务的路由地址
          uri: lb://CLOUD-PROVIDER-HYSTRIX-PAYMENT        #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/circuit/**         # 断言,路径相匹配的进行路由
            - Header=X-Request-Id, \d+  # 请求头要有X-Request-Id属性并且值为整数的正则表达式

Host

限制某些地址才能访问,多个用逗号分隔,支持Ant风格

bash 复制代码
spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
      routes:
        - id: payment_routh #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
#          uri: http://localhost:8001          #匹配后提供服务的路由地址
          uri: lb://CLOUD-PROVIDER-HYSTRIX-PAYMENT        #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/circuit/**         # 断言,路径相匹配的进行路由
            - Host=**.hk.com,**.test.com

Method

限制某些请求方式才能访问

bash 复制代码
--只允许get请求访问
spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
      routes:
        - id: payment_routh #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
#          uri: http://localhost:8001          #匹配后提供服务的路由地址
          uri: lb://CLOUD-PROVIDER-HYSTRIX-PAYMENT        #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/circuit/**         # 断言,路径相匹配的进行路由
            - Method=GET

Path

路径匹配规则,也是使用最多的一种匹配方式

bash 复制代码
spring:
  application:
    name: cloud-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
      routes:
        - id: payment_routh #payment_route    #路由的ID,没有固定规则但要求唯一,建议配合服务名
#          uri: http://localhost:8001          #匹配后提供服务的路由地址
          uri: lb://CLOUD-PROVIDER-HYSTRIX-PAYMENT        #匹配后提供服务的路由地址
          predicates:
            - Path=/payment/circuit/**         # 断言,路径相匹配的进行路由

过滤器

常见的过滤器

GateWay官网对于过滤器解释https://docs.spring.io/spring-cloud-gateway/reference/4.3-SNAPSHOT/spring-cloud-gateway-server-webflux/gatewayfilter-factories.html

全局过滤器

GateWay官网对于全局过滤器解释https://docs.spring.io/spring-cloud-gateway/reference/4.3-SNAPSHOT/spring-cloud-gateway-server-webflux/global-filters.html

自定义过滤器

自定义过滤器主要实现GlobalFilter, Ordered接口

java 复制代码
@Component
public class MyLogGateWayFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("进入自定义过滤器...");
        String name = exchange.getRequest().getQueryParams().getFirst("name");
        if (StringUtils.isEmpty(name)){
            System.out.println("名称不能为空...");
            exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
            return exchange.getResponse().setComplete();
        }
        return chain.filter(exchange);
    }
 
    @Override
    public int getOrder() {
        return 0;
    }
}

补充篇:SpringCloud-Gateway 补充(生产必备知识点)

相关推荐
土豆.exe4 分钟前
Cast Attack:Java 中 Ghost Bits(幽灵比特)引发的新型安全威胁——Java 生态里被忽视的底层风险引发一系列绕过
java·python·安全
shughui13 分钟前
2026最新JDK版本选择及下载安装详细图文教程【windows、mac附安装包】
java·linux·开发语言·windows·jdk·mac
Wenzar_13 分钟前
# D3.js实战进阶:从基础图表到交互式数据仪表盘的全流程构建在现代前端开发中,**数据可视化已成为提升用户体验的核心能力之一
java·javascript·python·信息可视化·ux
TE-茶叶蛋14 分钟前
Spring自动配置分析
java·后端·spring
XiYang-DING14 分钟前
【Java EE】锁策略、锁升级、锁消除和锁粗化
java·redis·java-ee
wu85877345718 分钟前
Java AI Harness 落地:拥抱框架还是回归本质?深度解析选型之道
java·人工智能·回归
北风toto19 分钟前
SpringBoot 获取配置文件值、获取环境变量的方式
java·spring boot·后端
空中海26 分钟前
Nacos3: 面试题库
java·面试·职场和发展
摇滚侠26 分钟前
sqlplus “/ as sysdba“ 什么意思
java·数据库·oracle
user_lwl31 分钟前
解决langchain4j+deepseek使用过程中reasoning_contect报错并适配DeepSeekV4
java·后端