从零构建微服务网关: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 实现服务发现和负载均衡,以及如何通过断言和过滤器来控制请求的流转。

相关推荐
2301_780789664 小时前
跨平台适配!SDK 游戏盾兼容全终端游戏场景
java·网络·ddos
Shulex4 小时前
跨境电商 AI Agent 核心架构解析:从只读问答到自主执行的工程落地
人工智能·架构·智能客服·跨境电商
学长毕设5 小时前
基于springboot的食品仓库管理系统
java·spring boot·后端
钱工的门窗技术笔记5 小时前
室内极窄全景移门的支承路径与预留接口:轨道形式、型材壁厚口径与验收边界
物联网·架构·数据分析
码农小旋风5 小时前
Ray分布式计算引擎介绍
人工智能·架构
时间售卖铺5 小时前
触发器与函数实战:MySQL高效编程秘诀
运维·数据库·mysql·云原生
ZhengEnCi6 小时前
Agent 架构怎么选:从单 Agent 到多 Agent 编排的选型决策指南
算法·架构
步行cgn6 小时前
FormHttpMessageConverter 详解:Spring MVC 中表单数据的读写转换器
java·spring·mvc
龙亘川6 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
金銀銅鐵6 小时前
[Java] 用 CLI 展示 EnumMap 增删键值对时的内部变化
java·源码·ai编程