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 是构建现代微服务架构的理想选择,特别适合需要高性能、灵活路由和丰富过滤功能的场景。

相关推荐
DokiDoki之父8 小时前
MyBatis—增删查改操作
java·spring boot·mybatis
兩尛8 小时前
Spring面试
java·spring·面试
Java中文社群8 小时前
服务器被攻击!原因竟然是他?真没想到...
java·后端
Full Stack Developme8 小时前
java.nio 包详解
java·python·nio
零千叶9 小时前
【面试】Java JVM 调优面试手册
java·开发语言·jvm
代码充电宝9 小时前
LeetCode 算法题【简单】290. 单词规律
java·算法·leetcode·职场和发展·哈希表
li3714908909 小时前
nginx报400bad request 请求头过大异常处理
java·运维·nginx
摇滚侠9 小时前
Spring Boot 项目, idea 控制台日志设置彩色
java·spring boot·intellij-idea
Aevget10 小时前
「Java EE开发指南」用MyEclipse开发的EJB开发工具(二)
java·ide·java-ee·eclipse·myeclipse
黄昏晓x10 小时前
C++----多态
java·jvm·c++