SpringCloudGateway — 网关路由

Spring Cloud Gateway 是 Spring 提供的一个高效、灵活的 API 网关解决方案,基于 Spring 5、Spring Boot 2 和 Project Reactor,具有高并发和低延迟的特点。它用于在微服务架构中对外提供统一的入口,处理请求的路由、过滤、负载均衡等功能。

由于每个微服务都有不同的地址或端口,入口不同,前后端联调会发现一些问题:

  • 请求不同数据时要访问不同的入口,需要维护多个入口地址,麻烦

  • 前端无法调用nacos,无法实时更新服务列表

官网:https://spring.io/projects/spring-cloud-gateway#learn

1. 网关简介

顾明思议,网关就是 络的 口。数据在网络间传输,从一个网络传输到另一网络时就需要经过网关来做数据的路由 和转发以及数据安全的校验

现在,微服务网关就起到同样的作用。前端请求不能直接访问微服务,而是要请求网关:

  • 网关可以做安全控制,也就是登录身份校验,校验通过才放行

  • 通过认证后,网关再根据请求判断应该访问哪个微服务,将请求转发过去

2. Spring Cloud Gateway基本概念

Spring Cloud Gateway 的核心概念包括 Route (路由)、Predicate (断言)和 Filter(过滤器)。

  • Route(路由):Route 是 Gateway 的基本构建单元。每个 Route 都有一个唯一的 ID、一个匹配规则(Predicate)和一个目标 URL(URI)。

  • Predicate(断言):用于判断请求是否匹配当前路由规则。例如,可以根据请求路径、请求方法、请求头等信息进行匹配。

  • Filter(过滤器):用于在请求或响应中进行处理。过滤器可以用于权限认证、请求修改、响应修改等。

3. Spring Cloud Gateway 的优势

  • 路由控制:能够将请求转发到不同的微服务。

  • 请求过滤:提供强大的过滤机制,可以对请求进行验证、修改等处理。

  • 负载均衡:支持与 Spring Cloud LoadBalancer 集成,提供自动负载均衡。

  • 限流和熔断:支持对请求进行限流和熔断,保障服务的稳定性。

4. 快速入门

4.1 创建项目

由于网关本身也是一个独立的微服务,因此也需要创建一个独立的微服务项目开发功能。

4.2 引入依赖

XML 复制代码
        <!--网关-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!--nacos discovery-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--负载均衡-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

4.3 配置路由

Spring Cloud Gateway 支持两种方式配置路由:基于配置文件(application.yaml)配置基于 Java 代码配置

4.2.1 基于配置文件的路由配置

application.yaml 中可以定义 Gateway 的路由规则。下面是一个示例配置:

XML 复制代码
server:
  port: 8080 # 配置网关服务的启动端口为8080

spring:
  application:
    name: gateway # 指定应用名称为 "gateway"
  cloud:
    nacos:
      server-addr: 192.168.1.101:8848 # Nacos服务器地址,用于服务注册与发现
    gateway:
      routes: # 配置网关路由
        - id: item # 路由规则的唯一ID,用于标识此路由规则
          uri: lb://item-service # 指定路由的目标服务地址,这里使用负载均衡 (lb://) 前缀,表示从Nacos注册中心拉取 "item-service" 服务的实例
          predicates: # 路由断言,定义规则,决定哪些请求可以匹配到该路由
            - Path=/items/**,/search/** # 路径断言,表示匹配请求路径以 "/items/" 或 "/search/" 开头的请求,符合则路由到 item-service
        - id: cart # 路由规则的唯一ID
          uri: lb://cart-service # 指定目标服务为 "cart-service",同样通过负载均衡从注册中心获取实例
          predicates:
            - Path=/carts/** # 路径断言,匹配以 "/carts/" 开头的请求,将其路由到 "cart-service"
        - id: user # 路由规则的唯一ID
          uri: lb://user-service # 指定目标服务为 "user-service"
          predicates:
            - Path=/users/**,/addresses/** # 路径断言,匹配以 "/users/" 或 "/addresses/" 开头的请求,将其路由到 "user-service"
        - id: trade # 路由规则的唯一ID
          uri: lb://trade-service # 指定目标服务为 "trade-service"
          predicates:
            - Path=/orders/** # 路径断言,匹配以 "/orders/" 开头的请求,将其路由到 "trade-service"
        - id: pay # 路由规则的唯一ID
          uri: lb://pay-service # 指定目标服务为 "pay-service"
          predicates:
            - Path=/pay-orders/** # 路径断言,匹配以 "/pay-orders/" 开头的请求,将其路由到 "pay-service"
  • id:路由的唯一标识。

  • uri :目标服务的地址。如果注册中心集成了负载均衡,可以使用 lb://service-name 的形式来配置服务。

  • predicates :断言规则,用于匹配请求。这里使用 Path 来匹配请求路径,/user/** 表示所有以 /user/ 开头的请求都将匹配该路由。

4.2.2 路由过滤讲解

路由规则的定义语法如下:

XML 复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: item
          uri: lb://item-service
          predicates:
            - Path=/items/**,/search/**

4.2.3 断言配置讲解

Spring Cloud Gateway 提供了多种断言来匹配请求。常用的断言包括:

  • Path 路径匹配 :匹配请求路径。例如,Path=/user/** 匹配所有以 /user/ 开头的路径。

  • Method 请求方法 :匹配请求方法。例如,Method=GET 匹配所有 GET 请求。

  • Header 请求头 :匹配请求头。例如,Header=X-Request-Id 匹配包含 X-Request-Id 请求头的请求。

  • Query 参数匹配 :匹配查询参数。例如,Query=token 匹配包含 token 参数的请求。

XML 复制代码
spring:
  cloud:
    gateway:
      routes:
        - id: header-route
          uri: lb://service-name
          predicates:
            - Header=X-Request-Id # 请求头断言
        - id: method-route
          uri: lb://service-name
          predicates:
            - Method=GET # 请求方法断言
        - id: query-route
          uri: lb://service-name
          predicates:
            - Query=token # 查询参数断言
相关推荐
袁震5 分钟前
HarmonyOS 应用包体积优化与上架自检实战:从 76.2MB 到 3.6MB
java·华为·性能优化·harmonyos
江屿风10 分钟前
C++OJ题经验总结(竞赛)5
开发语言·c++
溪语流沙13 分钟前
【Python项目实战】虚拟环境与依赖管理:venv / pip / requirements.txt实操
开发语言·python·pip
神威难绷泪13 分钟前
Linux应用软件编程:线程分离属性 互斥机制 同步机制 死锁
linux·开发语言·算法·线程
黄俊懿17 分钟前
【架构师从入门到进阶】第五章:DNS&CDN&网关优化思路——第七节:网关-XSS攻击与预防
网关·网络安全·架构·系统架构·架构师·xss·架构设计
zcmodeltech26 分钟前
反应装置模型控制系统设计与实现:多设备协同联动方案
java·网络·数据库·stm32·嵌入式硬件·能源·制造
研☆香36 分钟前
数组方法 splice讲解 拓展
开发语言·前端·javascript
码视野38 分钟前
基于 Spring Boot + Vue3 的【城市地下燃气管网微泄漏感知与相邻地下空间燃爆预警中台】设计与实现(含PRD/三端高保真源码/大屏)
java·前端·人工智能·spring boot·后端
峥嵘life1 小时前
Android16 系统 APEX 模块说明
android·大数据·开发语言
2601_962071571 小时前
数据库系统架构与DBMS功能探微:现代信息时代数据管理的关键
java·开发语言·数据库