Spring Cloud Gateway

person ~~情~非~    watch_later 2024-07-30 17:09:59
visibility 128    class Spring Cloud Gateway    bookmark 专栏

Spring Cloud Gateway 是一个基于 Spring 生态系统的 API 网关,旨在为微服务架构提供动态路由、监控、弹性、安全和限流等功能。它是 Spring Cloud 的一部分,提供了基于 Spring WebFlux 的非阻塞反应式编程模型,与 Spring Boot、Spring Cloud 其他组件无缝集成。

Spring Cloud Gateway 的主要功能

  1. 动态路由:根据请求的路径、头信息、参数等动态地将请求路由到不同的服务实例。
  2. 过滤器:支持全局过滤器和路由过滤器,可以对请求和响应进行修改。
  3. 负载均衡:集成 Spring Cloud LoadBalancer,可以实现负载均衡。
  4. 限流:提供了多种限流方式,支持令牌桶算法等。
  5. 安全:可以集成 Spring Security,提供认证和授权功能。
  6. 熔断:集成 Resilience4j,可以实现熔断和重试功能。

Spring Cloud Gateway 的架构

Spring Cloud Gateway 的架构基于三大核心概念:Route(路由)Predicate(谓词)Filter(过滤器)

  • Route(路由):是网关的基本构建模块,由一系列的断言和过滤器组成。当所有的断言为真时,路由匹配。
  • Predicate(谓词):用于匹配 HTTP 请求的条件,比如请求路径、请求头、请求参数等。
  • Filter(过滤器):用于在请求被路由前或路由后对请求进行修改,可以实现请求重写、增加头信息、限流等功能。

Spring Cloud Gateway 使用示例

下面是一个简单的 Spring Cloud Gateway 示例,包括项目创建、配置和使用。

1. 创建 Spring Boot 项目

使用 Spring Initializr 创建一个新的 Spring Boot 项目,选择以下依赖:

  • Spring Cloud Gateway
  • Spring Boot Actuator

2. 添加依赖

pom.xml 中添加 Spring Cloud Gateway 依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

3. 配置 Spring Cloud Gateway

application.yml 中配置路由和过滤器:

server:
  port: 8080

spring:
  application:
    name: gateway-service

  cloud:
    gateway:
      routes:
        - id: eureka-client
          uri: http://localhost:8081  # 转发目标地址
          predicates:
            - Path=/client/**         # 路由断言条件
          filters:
            - StripPrefix=1           # 过滤器:去除路径前缀
            - AddRequestHeader=X-Request-Gateway, Gateway  # 添加请求头
        - id: another-service
          uri: lb://another-service   # 负载均衡服务
          predicates:
            - Method=GET
            - Header=X-Request-Type, special
          filters:
            - Hystrix=another-service-fallback  # 熔断处理

      default-filters:
        - AddResponseHeader=Gateway-Version, 1.0.0

management:
  endpoints:
    web:
      exposure:
        include: "*"
  • server.port:指定网关服务的端口。
  • routes:配置网关的路由规则。
    • id:路由的唯一标识。
    • uri:转发的目标地址,可以是具体的 URL 或者服务名(需要在注册中心注册)。
    • predicates:路由断言条件,用于匹配请求。
    • filters:路由过滤器,用于修改请求或响应。
  • default-filters:全局过滤器,应用于所有路由。

4. 路由断言

Spring Cloud Gateway 提供了多种路由断言,可以用来匹配请求:

  • Path 路由断言:根据请求路径匹配。
    - Path=/client/**
    
  • Method 路由断言:根据请求方法匹配。
    - Method=GET
    
  • Header 路由断言:根据请求头匹配。
    - Header=X-Request-Type, special
    

5. 过滤器

Spring Cloud Gateway 支持多种过滤器,可以对请求和响应进行修改:

  • StripPrefix 过滤器:去除请求路径的前缀。
    - StripPrefix=1
    
  • AddRequestHeader 过滤器:添加请求头。
    - AddRequestHeader=X-Request-Gateway, Gateway
    
  • Hystrix 过滤器:熔断处理。
    - Hystrix=another-service-fallback
    

6. 启动 Spring Cloud Gateway

运行项目的主类 GatewayServiceApplication

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class GatewayServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayServiceApplication.class, args);
    }
}

7. 测试路由

启动服务后,可以通过以下方式测试路由:

  • 测试 /client 路由:

    curl -H "X-Request-Gateway: Gateway" http://localhost:8080/client/hello
    

    该请求会被路由到 http://localhost:8081/hello

  • 测试负载均衡路由:

    curl -H "X-Request-Type: special" http://localhost:8080/another-service/hello
    

    该请求会被负载均衡地路由到名为 another-service 的服务实例。

小结

Spring Cloud Gateway 提供了一种强大的方式来管理微服务的路由和过滤。通过配置路由断言和过滤器,可以轻松实现请求的动态路由、负载均衡和流量控制。

如果有其他问题或者需要进一步的帮助,请随时告诉我!

评论区
评论列表
menu