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 补充(生产必备知识点)

相关推荐
卓怡学长2 小时前
m319个人网站的设计与实现
java·数据库·spring·tomcat·maven·intellij-idea
Zzj_tju2 小时前
Java 从入门到精通(十二):File 与 IO 流基础,为什么程序“读写文件”时总是容易出问题?
java·python·php
橘子编程3 小时前
操作系统原理:从入门到精通全解析
java·linux·开发语言·windows·计算机网络·面试
飞Link3 小时前
LangGraph 核心架构解析:节点 (Nodes) 与边 (Edges) 的工作机制及实战指南
java·开发语言·python·算法·架构
xuhaoyu_cpp_java3 小时前
Boyer-Moore 投票算法
java·经验分享·笔记·学习·算法
JavaEdge.3 小时前
Chrome加载已解压的扩展程序-清单文件缺失或不可读取 无法加载清单
java
iReachers4 小时前
HTML打包EXE配置管理教程:多项目打包设置一键保存、加载与切换
java·前端·javascript
XiYang-DING4 小时前
【Java】堆
java·开发语言
Lyyaoo.4 小时前
【Java基础面经】Java 反射机制
java·开发语言·python