【Spring Cloud 微服务】2.守护神网关Gateway

目录

1.API网关的作用

[2.Spring Cloud Gateway 是什么?](#2.Spring Cloud Gateway 是什么?)

3.核心由来与背景

[1. 微服务架构的挑战:](#1. 微服务架构的挑战:)

[2. API 网关模式的兴起:](#2. API 网关模式的兴起:)

[3. Zuul 的局限性:](#3. Zuul 的局限性:)

[4. Spring Cloud Gateway 的诞生:](#4. Spring Cloud Gateway 的诞生:)

4.核心特征:

5.核心概念与工作原理

[1. 路由 (Route)](#1. 路由 (Route))

[2. 断言 (Predicate)](#2. 断言 (Predicate))

[3. 过滤器 (Filter)](#3. 过滤器 (Filter))

工作原理流程

[6.如何与 Spring Cloud 集成](#6.如何与 Spring Cloud 集成)

第一步:创建项目并添加依赖

第二步:配置文件 (application.yml)

第三步:编写简单的降级控制器

第四步:主启动类

7.集成案例:一个简单的路由

总结


1.API网关的作用

在微服务中,每个模块都是单独的服务,每个服务之间通过Fegin或着RPC之间进行通信,那我们客户端如何与不同服务进行调用呢?

但是带来以下几个问题

在我们引入APi网关之后

架构优势:

  1. 简化客户端:客户端只需知道网关的地址,不需要了解所有微服务的细节
  2. 安全性:可以在网关层面统一实施安全策略
  3. 可观察性:集中收集日志、指标和追踪信息
  4. 灵活性:可以在不影响客户端的情况下重构后端服务

2.Spring Cloud Gateway 是什么?

Spring Cloud Gateway 是基于 Spring 5、Spring Boot 2 和 Project Reactor 等技术构建的 API 网关。它的核心是一个建立在 Spring Framework 之上的反向代理,旨在为微服务架构提供一种简单、有效且统一的方式来路由到 API,并提供跨领域的关注点,如:安全、监控/指标和弹性。

3.核心由来与背景

要理解 Spring Cloud Gateway 的由来,需要先了解微服务架构的演进和其前身。

1. 微服务架构的挑战:

在微服务架构中,系统被拆分为数十甚至上百个细粒度的服务。客户端(如 Web 前端、移动 App)如果直接与这些服务通信,会面临诸多问题:

  • 客户端复杂性:客户端需要知道所有服务的网络位置(IP/域名)。
  • 交叉关切点:每个服务都需要独立实现认证、授权、日志、限流等功能,造成代码重复和维护困难。
  • 协议适配:后端微服务可能使用 gRPC、Dubbo 等协议,而外部客户端通常只接受 HTTP/HTTPS。

2. API 网关模式的兴起:

为了解决上述问题,API 网关模式 应运而生。它作为系统的唯一入口,扮演了"门卫"和"路由器"的角色,将所有非业务功能集中处理。Netflix 开源的 Zuul 是这个领域的先驱。

3. Zuul 的局限性:

Spring Cloud 早期整合了 Netflix Zuul 1.x 作为其网关解决方案。

然而,Zuul 1.x 基于 阻塞式 I/O (Servlet API) 模型。在处理大量并发连接或慢速客户端时,容易阻塞工作线程,成为性能瓶颈,无法很好地应对未来的响应式编程趋势。

4. Spring Cloud Gateway 的诞生:

为了提供一款现代化、高性能、响应式 且与 Spring 生态无缝集成的官方网关,Spring 团队自己开发了 Spring Cloud Gateway。它的设计目标非常明确:

    • 性能:基于 Netty 和 Project Reactor,提供非阻塞、异步的响应式编程模型,能够轻松处理高并发场景。
    • 与 Spring 生态深度集成:天生支持通过服务发现(如 Eureka、Nacos)动态路由,与 Spring Cloud CircuitBreaker、Spring Cloud Security 等组件完美配合。
    • 强大的功能 :提供简单而强大的断言(Predicates)过滤器(Filters) 机制,可以通过配置或编程方式灵活地定义路由和请求处理逻辑。
    • 面向未来:支持 WebSocket、gRPC 等现代通信协议。

简单来说,Spring Cloud Gateway 是 Spring 官方为了取代老旧的 Zuul 1.x,顺应响应式编程潮流而推出的新一代高性能 API 网关

4.核心特征:

  1. 建立在 Spring Framework 5、Project Reactor 和 Spring Boot 2 之上 :这意味着它天生支持异步非阻塞(Reactive) 模型,能够轻松处理高并发请求,资源消耗低,性能强劲。
  2. 动态路由:能够与任何服务发现组件(如 Eureka, Nacos, Consul)集成,实现到微服务的动态路由。
  3. 请求限流:集成 Resilience4j 或 Sentinel 实现限流和熔断。
  4. 路径重写:可以修改转发前后的请求路径。
  5. 强大的过滤器(Filter) :提供了丰富的、功能各异的过滤器,用于在请求转发前(Pre) 和接收响应后(Post) 执行各种逻辑(如修改请求头、添加参数、认证鉴权、记录日志等)。

5.核心概念与工作原理

要理解 Gateway,必须先掌握它的三个核心概念:路由(Route)断言(Predicate)过滤器(Filter)

1. 路由 (Route)

路由是网关最基础的部分。它由一个 ID、一个目标 URI、一组断言 和一组过滤器组成。如果断言为真,则匹配该路由,请求就会被转发到目标 URI。

  • id:路由的唯一标识。
  • uri :最终要转发到的目标地址。可以是 lb://SERVICE-NAME(lb 代表从注册中心负载均衡)或一个具体的 http://host:port
  • predicates:断言数组,决定什么时候使用这个路由。
  • filters:过滤器数组,用于在发送下游请求之前或之后修改请求和响应。

2. 断言 (Predicate)

这是 Java 8 中的 Predicate 函数式接口。它接收一个 ServerWebExchange 对象,可以访问到请求的所有信息(如路径、方法、头、参数等),并返回布尔值。

  • 作用 :定义匹配条件 。例如:"如果请求路径是 /api/user/**" 或 "如果请求方法是 GET 并且包含一个 X-Token 头"。
  • 常见断言Path, Method, Header, Host, Query, Cookie, After, Before 等。

3. 过滤器 (Filter)

这是 Gateway 的核心功能组件,基于 Spring Framework 的 GatewayFilter 工厂构建。

  • 作用 :在请求被转发前(pre)收到响应后(post) 执行特定操作。
  • 种类
    • Gateway Filter:作用于单个路由。
    • Global Filter :作用于所有路由,实现 GlobalFilter 接口,常用于全局鉴权、日志等。
  • 常见过滤器AddRequestHeader, AddRequestParameter, AddResponseHeader, StripPrefix, PrefixPath, RewritePath, Retry, RequestRateLimiter, Hystrix (已不推荐,用 Resilience4j)。

工作原理流程

一个请求到达 Spring Cloud Gateway 后的处理流程,清晰地展示了其基于反应式编程模型的核心组件如何协同工作:路由定位、断言判断及过滤器链处理。


6.如何与 Spring Cloud 集成

集成非常简单,主要通过 spring-cloud-starter-gateway 依赖和配置文件即可完成。

第一步:创建项目并添加依赖

创建一个新的 Spring Boot 项目,在 pom.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>

  <!-- 如果需要限流等功能,引入Resilience4j -->
  <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-circuitbreaker-reactor-resilience4j</artifactId>
  </dependency>
</dependencies>

<dependencyManagement>
  <dependencies>
    <!-- Spring Cloud 版本管理 -->
    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-dependencies</artifactId>
      <version>2021.0.8</version> <!-- 请使用最新稳定版 -->
      <type>pom</type>
      <scope>import</scope>
    </dependency>
    <!-- Spring Cloud Alibaba 版本管理 -->
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-alibaba-dependencies</artifactId>
      <version>2021.0.5.0</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

第二步:配置文件 (application.yml)

这是最核心的集成部分,展示了如何配置路由、与服务发现集成、配置过滤器等。

复制代码
server:
  port: 8080 # 网关端口

spring:
  application:
    name: api-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true # 开启根据服务名自动创建路由的功能(可选)
          lower-case-service-id: true # 服务名小写
      routes:
        # 路由1: 用户服务路由
        - id: user-service-route
          uri: lb://user-service # lb:// 表示从注册中心负载均衡发现服务
          predicates:
            - Path=/api/user/**   # 断言:路径匹配
            - Method=GET,POST     # 断言:请求方法匹配
          filters:
            - StripPrefix=1       # 过滤器:去掉路径的第一部分(/api),再转发给user-service
            - AddRequestHeader=X-Request-color, blue # 过滤器:添加请求头
            - name: RequestRateLimiter # 过滤器:请求限流
              args:
                redis-rate-limiter.replenishRate: 10 # 每秒允许的请求数
                redis-rate-limiter.burstCapacity: 20 # 每秒最大处理的请求数
                key-resolver: "#{@userKeyResolver}" # 限流策略(需自己定义Bean)

        # 路由2: 订单服务路由
        - id: order-service-route
          uri: lb://order-service
          predicates:
            - Path=/api/order/**
            - After=2023-01-20T17:42:47.789-07:00[America/Denver] # 在此时间之后生效
          filters:
            - StripPrefix=1
            - name: CircuitBreaker # 断路器过滤器 (Resilience4j)
              args:
                name: myCircuitBreaker
                fallbackUri: forward:/fallback/orderServiceDown # 降级URI

      # 全局默认过滤器,会对所有路由生效
      default-filters:
        - AddResponseHeader=X-Response-Default-Red, Default-Blue

    # Nacos 服务发现与注册配置
    nacos:
      discovery:
        server-addr: localhost:8848

# 配置限流使用的Redis(如果使用了RequestRateLimiter过滤器)
  redis:
    host: localhost
    port: 6379

第三步:编写简单的降级控制器

当触发熔断时,需要一个本地的 fallback 端点来返回托底信息。

复制代码
@RestController
@RequestMapping("/fallback")
public class FallbackController {

    @GetMapping("/orderServiceDown")
    public ResponseEntity<String> orderServiceFallback() {
        return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE)
        .body("订单服务暂时不可用,请稍后再试。");
    }
}

第四步:主启动类

主启动类非常简单,只需添加 @EnableDiscoveryClient 注解即可与 Spring Cloud 集成。

复制代码
@SpringBootApplication
@EnableDiscoveryClient // 启用服务发现客户端
public class ApiGatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(ApiGatewayApplication.class, args);
    }
}

7.集成案例:一个简单的路由

假设你有两个服务:

  • user-service (注册到 Nacos,实例地址为 localhost:8081)
  • order-service (注册到 Nacos,实例地址为 localhost:8082)

配置网关路由后

  • 当你访问 http://localhost:8080/api/user/1 (网关地址)
  • Gateway 的 Path 断言匹配到 /api/user/**
  • StripPrefix=1 过滤器会将路径中的第一部分 /api 去掉
  • 最终,网关会将请求负载均衡地转发到 user-service/user/1 这个接口上。
  • 对于客户端来说,它只和网关交互,完全不知道后端微服务的具体地址,实现了解耦和统一入口。

总结

Spring Cloud Gateway 通过 路由 + 断言 + 过滤器 的组合,提供了一个强大而灵活的方式来管理微服务API的入口流量。它与 Spring Cloud 生态系统的其他组件(如服务发现、熔断器)无缝集成,通过简单的 YAML 配置即可完成大部分工作,是构建现代微服务架构不可或缺的组件。

相关推荐
吃饱了得干活2 天前
Spring Cloud Gateway 微服务网关:路由、断言、过滤器
java·spring cloud
蝎子莱莱爱打怪6 天前
XZLL-IM干货系列 04|Netty 长连接实战:Pipeline 怎么排、心跳怎么跳、连接怎么管
后端·微服务·面试
SamDeepThinking7 天前
Java微服务练习方式
java·后端·微服务
米丘10 天前
微前端之 Web Components 完全指南
微服务·html
霸道流氓气质13 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
慧一居士13 天前
Feign的GET请求如何传递对象参数?
java·spring cloud
我登哥MVP13 天前
SpringCloud Alibaba 核心组件解析:服务链路追踪
java·spring boot·后端·spring·spring cloud·java-ee·maven
慧一居士13 天前
SpringCloud 微服务Feigin 用的完整调用端和被调用的示例
java·spring cloud
霸道流氓气质13 天前
Spring Boot 微服务性能优化完全指南
spring boot·微服务·性能优化
地瓜伯伯14 天前
从MESI缓存一致性协议讲透synchronized的底层
java·spring boot·spring·spring cloud·微服务·springcloud