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

相关推荐
Agent产品评测局5 分钟前
互联网行业自动化平台选型,运营全流程提效指南:2026企业级智能体架构与实战全解析
运维·人工智能·ai·chatgpt·架构·自动化
开心码农1号26 分钟前
Java rabbitMQ如何发送、消费消息、全套可靠方案
java·rabbitmq·java-rabbitmq
蜡台35 分钟前
JetBrains IDEA 安装 卸载相关总结
java·ide·intellij-idea·注册码
WJLSH12336 分钟前
TomCat
java·tomcat
AI成长日志1 小时前
【AI原生开发实战】1.2 传统开发 vs AI原生开发:思维转变与架构差异
服务器·架构·ai-native
戮戮1 小时前
Spring Cloud Gateway 零拷贝参数校验:一种高性能网关架构实践
java·网络·架构·gateway
LONGZETECH1 小时前
汽车故障诊断仿真教学软件【哈弗M6PLUS】:技术架构、功能实现与落地实践
架构·汽车·职业教育·汽车仿真教学软件·汽车故障诊断
xinlianyq1 小时前
2026 边缘智能的崛起:端云协同架构下的“词元”调度艺术
人工智能·架构·api
2301_780789661 小时前
零信任架构在云安全落地过程中的最佳实践
服务器·人工智能·游戏·架构·零信任
梓䈑1 小时前
高性能 C++ 日志实战:spdlog 核心架构解析与最佳实践指南
c++·架构