从零构建微服务网关:Spring Cloud Gateway 核心原理与实战配置详解

一、 为什么需要 API 网关?

在微服务架构中,客户端通常需要调用多个后端服务。如果没有网关,客户端需要直接维护所有服务的地址,这不仅增加了客户端的复杂度,也使得服务治理变得困难。

网关作为统一入口,承担了以下核心功能:

  1. 统一入口:所有请求都通过网关转发,隐藏了后端服务的复杂性。

  2. 请求路由:根据规则将请求分发到不同的微服务。

  3. 负载均衡:自动将流量分摊到多个服务实例上。

  4. 安全防护:统一进行身份认证、权限校验和流量控制。

二、 Spring Cloud Gateway 核心架构

Spring Cloud Gateway 的核心组件主要包括 Route(路由)Predicate(断言) ​ 和 Filter(过滤器)

  • Route(路由):路由是网关的基本构建块,它由一个 ID、一个目标 URI、一组断言和一组过滤器定义。

  • Predicate(断言):断言是 Java 8 的 Predicate,输入类型是 Spring 框架的 ServerWebExchange。它允许开发者匹配 HTTP 请求中的任何内容(例如请求头、请求路径、请求参数等)。

  • Filter(过滤器):过滤器是 GatewayFilter 的实例,允许修改请求和响应。过滤器分为"GatewayFilter"(作用于单个路由)和"GlobalFilter"(作用于所有路由)。

工作流程:

  1. 客户端发送请求到 Gateway。

  2. Gateway HandlerMapping 根据配置的路由规则进行匹配。

  3. 如果匹配成功,请求会被转发到 Gateway WebHandler。

  4. WebHandler 会根据配置的过滤器链(Filter Chain)对请求进行处理(如修改请求头、记录日志等)。

  5. 最终请求被转发到目标服务(Destination)。

三、 实战配置:基于 Nacos 的路由转发

我们来配置一个简单的网关,实现 /api/order/**转发到 service-order/api/product/**转发到 service-product

1. 引入依赖

首先,我们需要引入 Spring Cloud Gateway 和 Nacos Discovery 的依赖:

XML 复制代码
<dependencies>
    <!-- Spring Cloud Gateway 核心依赖 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>

    <!-- Nacos 服务发现依赖 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
</dependencies>

2. 配置文件 (application.yml)

复制代码
spring:
  application:
    name: gateway
  cloud:
    nacos:
      server-addr: 127.0.0.1:8848 # Nacos 地址
    gateway:
      discovery:
        locator:
          enabled: true # 开启服务发现功能
      routes:
        # 路由 1:订单服务
        - id: order-route
          uri: lb://service-order # lb:// 表示使用负载均衡,后面跟服务名
          predicates:
            - Path=/api/order/** # 断言:匹配 /api/order 开头的路径
          filters:
            - StripPrefix=1 # 过滤器:去掉第一层前缀(可选,用于路径重写)

        # 路由 2:商品服务
        - id: product-route
          uri: lb://service-product
          predicates:
            - Path=/api/product/**
          filters:
            - StripPrefix=1

server:
  port: 80 # 网关端口

配置解析:

  • lb://service-order :这里的 lb代表 Load Balancer(负载均衡)。网关会自动从 Nacos 中获取 service-order的所有实例,并通过负载均衡策略(默认轮询)将请求分发出去。

  • Path=/api/order/** :这是一个断言配置。它表示只有当请求路径以 /api/order/开头时,才会匹配到这条路由。

  • StripPrefix=1 :这是一个过滤器配置。它表示在转发请求之前,去掉路径中的第一层前缀。例如,请求 /api/order/list会被转发为 /list到后端服务。

四、 深入理解:断言与过滤器的执行顺序

在 Spring Cloud Gateway 中,断言和过滤器的执行顺序非常重要:

  1. 断言匹配顺序:网关会按照配置文件中路由的顺序依次匹配断言。一旦匹配成功,就会停止匹配后续路由(除非配置了权重等特殊规则)。

  2. 过滤器执行顺序

    • Pre Filters(前置过滤器) :在请求被转发到后端服务之前执行。例如,AddRequestHeader用于添加请求头。

    • Post Filters(后置过滤器) :在请求被转发到后端服务之后执行。例如,AddResponseHeader用于添加响应头。

示例:

假设我们配置了两个过滤器:

复制代码
filters:
  - AddRequestHeader=X-Request-Id, 12345
  - AddResponseHeader=X-Response-Time, 100ms

请求流程如下:

  1. 客户端请求到达网关。

  2. Pre Filter 执行 :网关添加 X-Request-Id请求头。

  3. 请求转发到后端服务。

  4. 后端服务处理请求并返回响应。

  5. Post Filter 执行 :网关添加 X-Response-Time响应头。

  6. 响应返回给客户端。

五、 总结

Spring Cloud Gateway 是一个功能强大的 API 网关,它基于 Spring 5、Project Reactor 和 Spring Boot 2.0 构建。通过本文的配置示例,你应该已经掌握了如何利用 Nacos 实现服务发现和负载均衡,以及如何通过断言和过滤器来控制请求的流转。

相关推荐
摇滚侠8 小时前
JAVA 项目教程《苍穹外卖-12》,微信小程序项目,前后端分离,从开发到部署
java·开发语言·vue.js·node.js
楚国的小隐士9 小时前
为什么说Rust是对自闭症谱系人士友好的编程语言?
java·rust·编程·对比·自闭症·自闭症谱系障碍·神经多样性
春花秋月夏海冬雪9 小时前
代码随想录刷题 - 贪心Part1
java·算法·贪心·代码随想录
野生技术架构师9 小时前
2026年牛客网最新Java面试题总结
java·开发语言
Mr_Xuhhh9 小时前
深入理解Java抽象类与接口:从概念到实战
java·开发语言
wb0430720110 小时前
使用 Java 开发 MCP 服务并发布到 Maven 中央仓库完整指南
java·开发语言·spring boot·ai·maven
Rsun0455110 小时前
设计模式应该怎么学
java·开发语言·设计模式
5系暗夜孤魂10 小时前
系统越复杂,越需要“边界感”:从 Java 体系理解大型工程的可维护性本质
java·开发语言
二月夜10 小时前
Spring循环依赖深度解析:从三级缓存原理到跨环境“灵异”现象
java·spring
陈天伟教授10 小时前
智能体架构:大语言模型驱动的自主系统深度解析与演进研究(一)
人工智能·语言模型·架构