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