Spring Cloud Gateway 介绍与使用 – wiki基地

Spring Cloud Gateway 介绍与使用

在微服务架构日益普及的今天,如何有效地管理和路由大量服务间的请求,同时处理跨领域的功能(如认证、限流、监控等),成为了开发者面临的重要挑战。Spring Cloud Gateway 应运而生,作为 Spring 生态系统中基于响应式编程的 API 网关解决方案,它为构建现代化、高性能的微服务系统提供了强大的支持。

什么是 Spring Cloud Gateway?

Spring Cloud Gateway 是一个构建在 Spring Framework 5、Project Reactor 和 Spring Boot 2 之上的 API 网关。它旨在为微服务提供一个简单、高效且可扩展的请求路由机制。作为客户端请求的统一入口,API 网关负责将外部请求转发到内部的微服务,并在转发过程中执行一系列的横切关注点,例如:

  • 路由 (Routing):根据请求的特定条件,将请求转发到后端服务。
  • 认证与授权 (Authentication & Authorization):验证请求的合法性,并控制对资源的访问权限。
  • 限流 (Rate Limiting):防止服务过载,保护后端微服务。
  • 负载均衡 (Load Balancing):将请求分发到多个服务实例,提高可用性和性能。
  • 熔断 (Circuit Breaking):在服务故障时提供优雅的降级策略,防止故障蔓延。
  • 监控与日志 (Monitoring & Logging):收集请求数据,用于系统监控和故障排查。

Spring Cloud Gateway 采用非阻塞的响应式编程模型,这意味着它能够以较少的线程处理大量的并发请求,从而提供更高的吞吐量和更低的延迟。

核心概念

理解 Spring Cloud Gateway 的核心概念是有效使用的关键:

  1. 路由 (Route):这是网关的基本组成单元,定义了如何处理一个传入请求。每个路由包含一个 ID、一个目标 URI (Uniform Resource Identifier) 以及一个或多个谓词 (Predicate) 和过滤器 (Filter)。
  2. 谓词 (Predicate):谓词是路由的“条件判断”部分。它用于匹配传入的 HTTP 请求。只有当请求满足路由定义的所有谓词时,该请求才会被转发到对应的目标 URI。常见的谓词包括路径 (Path)、主机 (Host)、请求方法 (Method)、请求头 (Header) 等。
  3. 过滤器 (Filter):过滤器允许在请求被路由到目标服务之前或之后修改请求和响应。它们可以用来添加请求头、重写路径、执行限流、添加断路器等。过滤器分为两种:
    • GatewayFilter:应用于特定路由的过滤器。
    • GlobalFilter:应用于所有路由的全局过滤器。

如何使用 Spring Cloud Gateway?

接下来,我们将通过一个简单的示例来演示如何在 Spring Boot 项目中使用 Spring Cloud Gateway。

1. 项目设置

首先,创建一个 Spring Boot 项目。在 pom.xml 文件中,添加 spring-cloud-starter-gateway 依赖:

“`xml


org.springframework.cloud
spring-cloud-starter-gateway



org.springframework.boot
spring-boot-starter-webflux




org.springframework.cloud
spring-cloud-dependencies
${spring-cloud.version}
pom
import



``
请确保将
${spring-cloud.version}` 替换为实际的 Spring Cloud 版本。

2. 配置路由

Spring Cloud Gateway 提供了两种主要的路由配置方式:YML 配置(声明式)和 Java 代码配置(编程式)。

方式一:YML 配置(推荐用于静态路由)

这是最常用且简洁的配置方式。在 application.yml 文件中定义路由:

“`yaml
spring:
application:
name: api-gateway
cloud:
gateway:
routes:
– id: example_route_path # 路由ID,唯一标识
uri: https://httpbin.org:80 # 目标URI,请求将被转发到这里
predicates:
– Path=/get/* # 谓词:匹配所有以 /get/ 开头的请求路径
filters:
– AddRequestHeader=X-Gateway-Request, True # 过滤器:添加一个请求头
– RewritePath=/get/(?.
), /${segment} # 过滤器:重写请求路径

    - id: example_route_host # 另一个路由,演示Host谓词
      uri: lb://myservice # 假设有一个名为 myservice 的服务,lb表示负载均衡
      predicates:
        - Host=**.my-domain.com # 谓词:匹配Host为 *.my-domain.com 的请求
      filters:
        - StripPrefix=1 # 过滤器:移除路径的第一个部分

“`

在上面的示例中:

  • 第一个路由 example_route_path
    • 匹配所有 /get/** 形式的请求。
    • 将请求转发到 https://httpbin.org:80
    • 在请求转发前,添加了一个名为 X-Gateway-Request 值为 True 的请求头。
    • 将请求路径中的 /get/ 部分移除,例如 /get/status/200 会变成 /status/200 再转发。
  • 第二个路由 example_route_host
    • 匹配 Host 头为 *.my-domain.com 的请求。
    • uri: lb://myservice 表示将请求转发给通过服务发现找到的 myservice 服务的一个实例,并进行负载均衡。
    • StripPrefix=1 过滤器会移除路径的第一个部分,例如 /myservice/hello 会变成 /hello 再转发。
方式二:Java 代码配置(推荐用于动态或复杂路由)

通过 Java 代码可以更灵活地定义路由,并且具有类型安全性。创建一个配置类,例如 GatewayConfig.java

“`java
package com.example.gateway;

import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class GatewayConfig {

@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    return builder.routes()
        .route("example_route_java", r -> r.path("/java/**") // 谓词:匹配 /java/**
            .filters(f -> f.addRequestHeader("X-Programmatic-Request", "true") // 过滤器:添加请求头
                           .rewritePath("/java/(?<segment>.*)", "/${segment}")) // 过滤器:重写路径
            .uri("http://localhost:8081")) // 目标URI
        .route("another_route_java", r -> r.host("*.api.example.com") // 谓词:匹配主机
            .uri("http://localhost:8082"))
        .build();
}

}
“`

在这个 Java 配置示例中:

  • 我们使用 RouteLocatorBuilder 来构建路由。
  • example_route_java 路由配置了路径谓词 /java/**,添加了 X-Programmatic-Request 请求头,并重写了路径,最终转发到 http://localhost:8081
  • another_route_java 路由配置了主机谓词 *.api.example.com,转发到 http://localhost:8082

3. 运行 Gateway 应用

完成配置后,只需运行 Spring Boot 应用程序即可。Gateway 会监听配置的端口(默认为 8080),并根据定义的路由规则处理传入的请求。

例如,如果您的 Gateway 运行在 http://localhost:8080

  • 当您访问 http://localhost:8080/get/anything 时,它会被 example_route_path 匹配,并转发到 https://httpbin.org:80/anything,同时带有 X-Gateway-Request: True 请求头。
  • 如果您配置了 Java 路由,访问 http://localhost:8080/java/hello,它将被转发到 http://localhost:8081/hello,并带有 X-Programmatic-Request: true 请求头。

总结

Spring Cloud Gateway 作为 Spring 微服务生态系统的重要组成部分,提供了一个强大、灵活且高性能的 API 网关解决方案。它凭借其响应式编程模型、丰富的谓词和过滤器功能,以及与 Spring Cloud 其他组件的无缝集成,极大地简化了微服务架构中请求路由和横切关注点的管理。无论是简单的路由转发还是复杂的请求处理逻辑,Spring Cloud Gateway 都能提供优雅而高效的实现方式。

滚动至顶部