Spring Cloud Gateway介绍 - -基础概念,简单工作原理和配置示例

Spring Cloud Gateway 是 Spring Cloud 生态系统中的一个 API 网关服务,基于 Spring 5、Spring Boot 2 和 Project Reactor 等技术开发,旨在为微服务架构提供一种简单、有效且统一的 API 路由管理方式。

核心概念

1. 路由(Route)

路由是网关的基本构建块,由 ID、目标 URI、断言集合和过滤器集合组成。当断言匹配时,请求会被转发到目标 URI 并经过一系列过滤器处理。

2. 断言(Predicate)

使用 Java 8 的 Predicate 接口,开发者可以匹配 HTTP 请求中的任何内容(如 headers 或参数),只有匹配的请求才会被路由。

3. 过滤器(Filter)

Spring Cloud Gateway 中的过滤器分为两种:

  • Gateway Filter:作用于单个路由
  • Global Filter:作用于所有路由

主要特性

  1. 动态路由:能够匹配任何请求属性,支持动态路由配置
  2. 请求限流:内置的请求限流功能
  3. 路径重写:支持路径重写
  4. 断路器集成:与 Hystrix 断路器集成
  5. 服务发现集成:支持与 Eureka、Consul 等服务发现组件集成
  6. 安全控制:易于与 Spring Security 集成
  7. 监控:提供监控端点
  8. 高性能:基于 Netty 的非阻塞异步模型

工作原理

Spring Cloud Gateway 的工作流程如下:

  1. 客户端向 Spring Cloud Gateway 发出请求
  2. 网关处理程序映射确定与请求匹配的路由
  3. 请求通过网关过滤器链处理
  4. 过滤器可以在发送代理请求之前或之后执行逻辑
  5. 代理请求被发出
  6. 响应通过过滤器链返回给客户端

配置示例

基本路由配置

yaml 复制代码
spring:
  cloud:
    gateway:
      routes:
      - id: example-service
        uri: http://example.com
        predicates:
        - Path=/example/**
        filters:
        - RewritePath=/example/(?<segment>.*), /$\{segment}

集成服务发现

yaml 复制代码
spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
          lowerCaseServiceId: true
      routes:
      - id: user-service
        uri: lb://user-service
        predicates:
        - Path=/api/users/**

常用过滤器

  1. AddRequestHeader:添加请求头
  2. AddRequestParameter:添加请求参数
  3. AddResponseHeader:添加响应头
  4. PrefixPath:添加路径前缀
  5. RequestRateLimiter:请求限流
  6. Retry:重试机制
  7. Hystrix:熔断器
  8. FallbackHeaders:熔断时的回退头

自定义开发

自定义过滤器

java 复制代码
@Component
public class CustomFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 前置处理
        exchange.getRequest().mutate().header("X-Custom-Header", "value");
        
        return chain.filter(exchange).then(Mono.fromRunnable(() -> {
            // 后置处理
            exchange.getResponse().getHeaders().add("X-Response-Header", "value");
        }));
    }

    @Override
    public int getOrder() {
        return -1; // 过滤器执行顺序
    }
}

自定义路由定位器

java 复制代码
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
    return builder.routes()
            .route("path_route", r -> r.path("/get")
                .uri("http://httpbin.org"))
            .route("host_route", r -> r.host("*.myhost.org")
                .uri("http://httpbin.org"))
            .build();
}

性能优化建议

  1. 合理配置路由数量,避免过多路由影响匹配效率
  2. 使用缓存过滤器缓存频繁访问的响应
  3. 合理配置连接池大小
  4. 启用响应压缩
  5. 合理使用熔断和降级策略

与 Zuul 的比较

  1. 性能:Spring Cloud Gateway 基于 Netty 和 Reactor,性能优于 Zuul 1.x
  2. 功能:Gateway 提供了更丰富的路由和过滤功能
  3. 扩展性:Gateway 更易于扩展和自定义
  4. 异步支持:Gateway 原生支持异步非阻塞模型

Spring Cloud Gateway 是构建现代微服务架构的理想选择,特别适合需要高性能、灵活路由和丰富过滤功能的场景。

相关推荐
全栈凯哥13 分钟前
16.Spring Boot 国际化完全指南
java·spring boot·后端
M1A119 分钟前
Java集合框架深度解析:LinkedList vs ArrayList 的对决
java·后端
Top`24 分钟前
Java 泛型 (Generics)
java·开发语言·windows
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ1 小时前
如何使用Java WebSocket API实现客户端和服务器端的通信?
java·开发语言·websocket
是小崔啊1 小时前
tomcat源码02 - 理解Tomcat架构设计
java·tomcat
没有bug.的程序员1 小时前
JAVA面试宝典 -《安全攻防:从 SQL 注入到 JWT 鉴权》
java·安全·面试
栈溢出了1 小时前
MyBatis实现分页查询-苍穹外卖笔记
java·笔记·mybatis
morningcat20181 小时前
java17 gc笔记
java·jvm·笔记
2 小时前
Unity开发中常用的洗牌算法
java·算法·unity·游戏引擎·游戏开发
Your易元2 小时前
设计模式-模板方法模式
java·设计模式·模板方法模式