Gateway简介 #

一、Gateway概述 #

1.1 什么是API网关 #

API网关是微服务架构中的重要组件,作为系统的统一入口,负责请求路由、协议转换、安全认证等功能。

text
┌─────────────────────────────────────────────────────────────┐
│                    API网关架构                               │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   ┌─────────────┐                                          │
│   │   客户端    │                                          │
│   └──────┬──────┘                                          │
│          │                                                  │
│          ▼                                                  │
│   ┌─────────────────────────────────────────────────────┐  │
│   │                  API 网关                            │  │
│   │                                                      │  │
│   │   ┌─────────┐  ┌─────────┐  ┌─────────┐            │  │
│   │   │ 路由    │  │ 过滤器   │  │ 限流    │            │  │
│   │   │ Routing │  │ Filter  │  │ RateLimit│            │  │
│   │   └─────────┘  └─────────┘  └─────────┘            │  │
│   │                                                      │  │
│   │   ┌─────────┐  ┌─────────┐  ┌─────────┐            │  │
│   │   │ 认证    │  │ 熔断    │  │ 日志    │            │  │
│   │   │ Auth    │  │ Circuit │  │ Log     │            │  │
│   │   └─────────┘  └─────────┘  └─────────┘            │  │
│   │                                                      │  │
│   └─────────────────────────────────────────────────────┘  │
│          │                                                  │
│          ├──────────────────┬──────────────────┐           │
│          │                  │                  │           │
│          ▼                  ▼                  ▼           │
│   ┌─────────────┐   ┌─────────────┐   ┌─────────────┐     │
│   │  用户服务   │   │  订单服务   │   │  商品服务   │     │
│   └─────────────┘   └─────────────┘   └─────────────┘     │
│                                                             │
└─────────────────────────────────────────────────────────────┘

1.2 Gateway核心概念 #

概念 说明
Route 路由,网关的基本构建块
Predicate 断言,匹配HTTP请求的条件
Filter 过滤器,在请求发送前后修改请求和响应

1.3 Gateway特性 #

特性 说明
动态路由 动态配置路由规则
断言匹配 多种请求匹配方式
过滤器 请求/响应过滤处理
限流熔断 保护后端服务
路径重写 灵活的路径处理
负载均衡 集成LoadBalancer

1.4 Gateway vs Zuul #

特性 Gateway Zuul 1.x
编程模型 响应式 阻塞式
性能
长连接 支持 不支持
WebSocket 支持 不支持
限流 内置 需要额外组件

二、快速开始 #

2.1 添加依赖 #

xml
<dependencies>
    <!-- Spring Cloud Gateway -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
    
    <!-- Nacos Discovery -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    
    <!-- LoadBalancer -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-loadbalancer</artifactId>
    </dependency>
</dependencies>

2.2 配置文件 #

yaml
server:
  port: 8080

spring:
  application:
    name: gateway-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/user/**
          filters:
            - StripPrefix=1

        - id: order-service
          uri: lb://order-service
          predicates:
            - Path=/order/**
          filters:
            - StripPrefix=1

2.3 启动类 #

java
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

2.4 测试访问 #

bash
# 访问用户服务
curl http://localhost:8080/user/users/1

# 访问订单服务
curl http://localhost:8080/order/orders/1

三、路由配置 #

3.1 基本路由 #

yaml
spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/user/**

3.2 多条件路由 #

yaml
spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/user/**
            - Method=GET,POST
            - Header=X-Request-Id, \d+
            - Query=token
            - After=2024-01-01T00:00:00+08:00[Asia/Shanghai]

3.3 路由优先级 #

yaml
spring:
  cloud:
    gateway:
      routes:
        - id: specific-route
          uri: lb://special-service
          predicates:
            - Path=/user/admin/**
          order: 0

        - id: general-route
          uri: lb://user-service
          predicates:
            - Path=/user/**
          order: 1

3.4 动态路由 #

java
@Configuration
public class DynamicRouteConfig {

    @Autowired
    private RouteDefinitionLocator routeDefinitionLocator;

    @Bean
    public RouteDefinitionRepository routeDefinitionRepository() {
        return new InMemoryRouteDefinitionRepository();
    }
}

四、断言工厂 #

4.1 内置断言 #

断言 说明 示例
After 指定时间之后 After=2024-01-01T00:00:00+08:00
Before 指定时间之前 Before=2024-12-31T23:59:59+08:00
Between 时间区间 Between=2024-01-01T00:00:00+08:00, 2024-12-31T23:59:59+08:00
Cookie Cookie匹配 Cookie=session, abc
Header 请求头匹配 Header=X-Request-Id, \d+
Host 主机名匹配 Host=**.example.com
Method 请求方法匹配 Method=GET,POST
Path 路径匹配 Path=/user/**
Query 查询参数匹配 Query=token
RemoteAddr 远程地址匹配 RemoteAddr=192.168.1.1/24

4.2 使用示例 #

yaml
spring:
  cloud:
    gateway:
      routes:
        - id: example-route
          uri: lb://example-service
          predicates:
            - Path=/api/**
            - Method=GET,POST
            - Header=X-Request-Id, \d+
            - Query=token
            - After=2024-01-01T00:00:00+08:00[Asia/Shanghai]
            - Cookie=session, .+
            - Host=**.example.com

4.3 自定义断言 #

java
@Component
public class CustomRoutePredicateFactory extends AbstractRoutePredicateFactory<CustomRoutePredicateFactory.Config> {

    public CustomRoutePredicateFactory() {
        super(Config.class);
    }

    @Override
    public Predicate<ServerWebExchange> apply(Config config) {
        return exchange -> {
            String value = exchange.getRequest().getHeaders().getFirst(config.getHeaderName());
            return value != null && value.matches(config.getPattern());
        };
    }

    public static class Config {
        private String headerName;
        private String pattern;

        public String getHeaderName() {
            return headerName;
        }

        public void setHeaderName(String headerName) {
            this.headerName = headerName;
        }

        public String getPattern() {
            return pattern;
        }

        public void setPattern(String pattern) {
            this.pattern = pattern;
        }
    }
}

五、过滤器 #

5.1 内置过滤器 #

过滤器 说明
AddRequestHeader 添加请求头
AddRequestParameter 添加请求参数
AddResponseHeader 添加响应头
DedupeResponseHeader 去重响应头
CircuitBreaker 熔断器
FallbackHeaders 降级头
MapRequestHeader 映射请求头
PrefixPath 添加路径前缀
PreserveHostHeader 保留Host头
RequestRateLimiter 请求限流
RedirectTo 重定向
RemoveRequestHeader 移除请求头
RemoveResponseHeader 移除响应头
RewritePath 重写路径
RewriteLocationResponseHeader 重写Location头
SaveSession 保存Session
SecureHeaders 安全头
SetPath 设置路径
SetRequestHeader 设置请求头
SetResponseHeader 设置响应头
SetStatus 设置状态码
StripPrefix 去除路径前缀

5.2 使用示例 #

yaml
spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/user/**
          filters:
            - StripPrefix=1
            - AddRequestHeader=X-Request-Foo, Bar
            - AddResponseHeader=X-Response-Foo, Bar
            - RewritePath=/user/(?<segment>.*), /$\{segment}

5.3 全局过滤器 #

java
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String token = exchange.getRequest().getHeaders().getFirst("Authorization");
        
        if (token == null || token.isEmpty()) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
        
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        return -100;
    }
}

5.4 自定义过滤器 #

java
@Component
public class CustomGatewayFilterFactory extends AbstractGatewayFilterFactory<CustomGatewayFilterFactory.Config> {

    public CustomGatewayFilterFactory() {
        super(Config.class);
    }

    @Override
    public GatewayFilter apply(Config config) {
        return (exchange, chain) -> {
            ServerHttpRequest request = exchange.getRequest().mutate()
                    .header("X-Custom-Header", config.getValue())
                    .build();
            
            return chain.filter(exchange.mutate().request(request).build());
        };
    }

    public static class Config {
        private String value;

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }
    }
}

六、工作原理 #

6.1 请求处理流程 #

text
┌─────────────────────────────────────────────────────────────┐
│                    Gateway工作流程                           │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   客户端请求                                                 │
│       │                                                     │
│       ▼                                                     │
│   ┌─────────────────────────────────────────────────────┐  │
│   │              DispatcherHandler                       │  │
│   └───────────────────────────┬─────────────────────────┘  │
│                               │                             │
│                               ▼                             │
│   ┌─────────────────────────────────────────────────────┐  │
│   │              RoutePredicateHandlerMapping            │  │
│   │                  (路由匹配)                         │  │
│   └───────────────────────────┬─────────────────────────┘  │
│                               │                             │
│                               ▼                             │
│   ┌─────────────────────────────────────────────────────┐  │
│   │              FilteringWebHandler                     │  │
│   │                  (过滤器处理)                       │  │
│   │                                                      │  │
│   │   ┌─────────────────────────────────────────────┐  │  │
│   │   │           Filter Chain                       │  │  │
│   │   │                                              │  │  │
│   │   │   前置过滤器 ──► 代理请求 ──► 后置过滤器      │  │  │
│   │   │                                              │  │  │
│   │   └─────────────────────────────────────────────┘  │  │
│   │                                                      │  │
│   └───────────────────────────┬─────────────────────────┘  │
│                               │                             │
│                               ▼                             │
│                        目标微服务                            │
│                                                             │
└─────────────────────────────────────────────────────────────┘

6.2 核心组件 #

组件 说明
DispatcherHandler HTTP请求分发器
RoutePredicateHandlerMapping 路由断言处理器映射
FilteringWebHandler 过滤器Web处理器
GlobalFilter 全局过滤器
GatewayFilter 网关过滤器

七、配置详解 #

7.1 完整配置 #

yaml
spring:
  cloud:
    gateway:
      enabled: true
      httpclient:
        connect-timeout: 5000
        response-timeout: 60000
        pool:
          type: elastic
          max-idle-time: 15000
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/user/**
          filters:
            - StripPrefix=1
          metadata:
            response-timeout: 5000
            connect-timeout: 3000
          order: 0
      discovery:
        locator:
          enabled: true
          lower-case-service-id: true

7.2 配置项说明 #

配置项 默认值 说明
enabled true 是否启用Gateway
connect-timeout 45000 连接超时时间
response-timeout - 响应超时时间
pool.type elastic 连接池类型

八、最佳实践 #

8.1 生产环境配置 #

yaml
server:
  port: 8080

spring:
  application:
    name: gateway-service
  cloud:
    nacos:
      discovery:
        server-addr: ${NACOS_SERVER:localhost:8848}
    gateway:
      httpclient:
        connect-timeout: 5000
        response-timeout: 30000
        pool:
          type: elastic
          max-idle-time: 15000
      discovery:
        locator:
          enabled: true
          lower-case-service-id: true
      routes:
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/api/user/**
          filters:
            - StripPrefix=2
            - name: RequestRateLimiter
              args:
                redis-rate-limiter.replenishRate: 10
                redis-rate-limiter.burstCapacity: 20
                key-resolver: "#{@userKeyResolver}"

management:
  endpoints:
    web:
      exposure:
        include: health,info,gateway
  endpoint:
    gateway:
      enabled: true

8.2 注意事项 #

注意点 说明
不要使用Web依赖 Gateway基于WebFlux
超时配置 合理设置连接和响应超时
过滤器顺序 注意过滤器执行顺序
路由优先级 精确路由放前面

九、总结 #

9.1 核心要点 #

要点 说明
Route 路由配置
Predicate 请求匹配条件
Filter 请求/响应过滤器
响应式 基于WebFlux

9.2 下一步 #

现在你已经掌握了Gateway的基本概念,接下来让我们学习 路由配置,深入了解路由规则配置!

最后更新:2026-03-28