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

相关推荐
老葱头蒸鸡1 小时前
(2)Docker搭建私人仓库
云原生·eureka
悠闲蜗牛�1 小时前
下一代API网关深度实践:基于Spring Cloud Gateway的云原生网关架构与治理平台
微服务·云原生·架构
南部余额2 小时前
Apache POI 从入门到实战:Excel 与 Word操作攻略
java·word·excel·poi
java1234_小锋2 小时前
Java高频面试题:怎么实现Redis的高可用?
java·开发语言·redis
笨蛋不要掉眼泪2 小时前
Spring Cloud Gateway 核心实战:断言(Predicate)的长短写法与自定义工厂详解
java·前端·微服务·架构
A懿轩A2 小时前
【Maven 构建工具】Maven + JUnit5 单元测试实战:测试级别、注解、断言与 Maven test 阶段
java·单元测试·maven
Coder_Boy_2 小时前
以厨房连锁故事为引,梳理Java后端全技术脉络(JVM到云原生,总结篇)
java·jvm·spring boot·分布式·spring·云原生
悠闲蜗牛�2 小时前
Kubernetes从零到集群:本地Minikube环境搭建与Spring Cloud微服务运维实战
spring cloud·微服务·kubernetes
特立独行的猫a2 小时前
基于HarmonyOS ArkTS的MVVM架构最佳实践
华为·架构·harmonyos·mvvm·最佳实战