路由配置 #
一、路由基础 #
1.1 路由组成 #
一个完整的路由配置包含以下要素:
yaml
spring:
cloud:
gateway:
routes:
- id: route-id # 路由ID,唯一标识
uri: lb://service-name # 目标URI
predicates: # 断言条件
- Path=/api/**
filters: # 过滤器
- StripPrefix=1
order: 0 # 路由优先级
metadata: # 元数据
key: value
1.2 URI配置 #
| URI格式 | 说明 | 示例 |
|---|---|---|
| http:// | HTTP协议 | http://localhost:8080 |
| https:// | HTTPS协议 | https://example.com |
| lb:// | 负载均衡 | lb://user-service |
| ws:// | WebSocket | ws://localhost:8080 |
二、断言工厂 #
2.1 Path断言 #
yaml
spring:
cloud:
gateway:
routes:
- id: path-route
uri: lb://user-service
predicates:
- Path=/user/**
- id: multi-path-route
uri: lb://user-service
predicates:
- Path=/user/**,/api/user/**
- id: path-variable-route
uri: lb://user-service
predicates:
- Path=/user/{segment}
2.2 Method断言 #
yaml
spring:
cloud:
gateway:
routes:
- id: method-route
uri: lb://user-service
predicates:
- Method=GET
- id: multi-method-route
uri: lb://user-service
predicates:
- Method=GET,POST,PUT,DELETE
2.3 Header断言 #
yaml
spring:
cloud:
gateway:
routes:
- id: header-route
uri: lb://user-service
predicates:
- Header=X-Request-Id
- id: header-value-route
uri: lb://user-service
predicates:
- Header=X-Request-Id, \d+
- id: auth-header-route
uri: lb://user-service
predicates:
- Header=Authorization, Bearer .+
2.4 Query断言 #
yaml
spring:
cloud:
gateway:
routes:
- id: query-route
uri: lb://user-service
predicates:
- Query=token
- id: query-value-route
uri: lb://user-service
predicates:
- Query=token, abc.+
- id: multi-query-route
uri: lb://user-service
predicates:
- Query=token
- Query=userId
2.5 Cookie断言 #
yaml
spring:
cloud:
gateway:
routes:
- id: cookie-route
uri: lb://user-service
predicates:
- Cookie=session
- id: cookie-value-route
uri: lb://user-service
predicates:
- Cookie=session, .+
2.6 Host断言 #
yaml
spring:
cloud:
gateway:
routes:
- id: host-route
uri: lb://user-service
predicates:
- Host=**.example.com
- id: multi-host-route
uri: lb://user-service
predicates:
- Host=api.example.com,admin.example.com
2.7 时间断言 #
yaml
spring:
cloud:
gateway:
routes:
- id: after-route
uri: lb://user-service
predicates:
- After=2024-01-01T00:00:00+08:00[Asia/Shanghai]
- id: before-route
uri: lb://user-service
predicates:
- Before=2024-12-31T23:59:59+08:00[Asia/Shanghai]
- id: between-route
uri: lb://user-service
predicates:
- Between=2024-01-01T00:00:00+08:00[Asia/Shanghai], 2024-12-31T23:59:59+08:00[Asia/Shanghai]
2.8 RemoteAddr断言 #
yaml
spring:
cloud:
gateway:
routes:
- id: remote-addr-route
uri: lb://user-service
predicates:
- RemoteAddr=192.168.1.1/24
- id: multi-remote-addr-route
uri: lb://user-service
predicates:
- RemoteAddr=192.168.1.1/24,10.0.0.1/24
2.9 Weight断言 #
yaml
spring:
cloud:
gateway:
routes:
- id: weight-route-1
uri: lb://user-service-v1
predicates:
- Weight=group1, 8
- id: weight-route-2
uri: lb://user-service-v2
predicates:
- Weight=group1, 2
2.10 Cloud Foundry断言 #
yaml
spring:
cloud:
gateway:
routes:
- id: cf-route
uri: lb://user-service
predicates:
- CloudFoundryRouteService
三、组合断言 #
3.1 AND组合(默认) #
yaml
spring:
cloud:
gateway:
routes:
- id: and-route
uri: lb://user-service
predicates:
- Path=/user/**
- Method=GET
- Header=X-Request-Id
3.2 OR组合 #
yaml
spring:
cloud:
gateway:
routes:
- id: or-route
uri: lb://user-service
predicates:
- Path=/user/**
- Path=/api/user/**
四、动态路由 #
4.1 基于配置中心 #
yaml
spring:
cloud:
gateway:
discovery:
locator:
enabled: true
lower-case-service-id: true
4.2 基于Nacos动态配置 #
java
@Configuration
public class DynamicRouteConfig {
@Autowired
private RouteDefinitionRepository routeDefinitionRepository;
@NacosListener(dataId = "gateway-routes.json", groupId = "DEFAULT_GROUP")
public void onRouteChange(String config) {
List<RouteDefinition> routeDefinitions = JSON.parseArray(config, RouteDefinition.class);
routeDefinitionRepository.getRouteDefinitions()
.subscribe(route -> routeDefinitionRepository.delete(Mono.just(route.getId())));
routeDefinitions.forEach(route ->
routeDefinitionRepository.save(Mono.just(route)).subscribe()
);
}
}
4.3 基于数据库 #
java
@Service
public class DynamicRouteService {
@Autowired
private RouteDefinitionRepository routeDefinitionRepository;
@Autowired
private RouteMapper routeMapper;
@Scheduled(fixedRate = 30000)
public void refreshRoutes() {
List<RouteConfig> routes = routeMapper.selectAll();
routeDefinitionRepository.getRouteDefinitions()
.subscribe(route -> routeDefinitionRepository.delete(Mono.just(route.getId())));
routes.forEach(this::addRoute);
}
private void addRoute(RouteConfig config) {
RouteDefinition definition = new RouteDefinition();
definition.setId(config.getId());
definition.setUri(URI.create(config.getUri()));
List<PredicateDefinition> predicates = new ArrayList<>();
predicates.add(new PredicateDefinition("Path=" + config.getPath()));
definition.setPredicates(predicates);
routeDefinitionRepository.save(Mono.just(definition)).subscribe();
}
}
4.4 API方式 #
java
@RestController
@RequestMapping("/routes")
public class RouteController {
@Autowired
private RouteDefinitionRepository routeDefinitionRepository;
@GetMapping
public Flux<RouteDefinition> getRoutes() {
return routeDefinitionRepository.getRouteDefinitions();
}
@PostMapping
public Mono<Void> addRoute(@RequestBody RouteDefinition definition) {
return routeDefinitionRepository.save(Mono.just(definition));
}
@DeleteMapping("/{id}")
public Mono<Void> deleteRoute(@PathVariable String id) {
return routeDefinitionRepository.delete(Mono.just(id));
}
}
五、路由优先级 #
5.1 Order配置 #
yaml
spring:
cloud:
gateway:
routes:
- id: specific-route
uri: lb://user-service
predicates:
- Path=/user/admin/**
order: 0
- id: general-route
uri: lb://user-service
predicates:
- Path=/user/**
order: 1
5.2 优先级规则 #
| 规则 | 说明 |
|---|---|
| order值越小 | 优先级越高 |
| 精确匹配 | 放在前面 |
| 通配匹配 | 放在后面 |
六、路由元数据 #
6.1 配置元数据 #
yaml
spring:
cloud:
gateway:
routes:
- id: user-route
uri: lb://user-service
predicates:
- Path=/user/**
metadata:
response-timeout: 5000
connect-timeout: 3000
rate-limit: 100
description: 用户服务路由
6.2 使用元数据 #
java
@Component
public class MetadataFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
Route route = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);
if (route != null) {
Map<String, Object> metadata = route.getMetadata();
String timeout = (String) metadata.get("response-timeout");
exchange.getRequest().mutate()
.header("X-Route-Timeout", timeout)
.build();
}
return chain.filter(exchange);
}
}
七、路由配置最佳实践 #
7.1 配置模板 #
yaml
spring:
cloud:
gateway:
routes:
- id: user-service-api
uri: lb://user-service
predicates:
- Path=/api/v1/user/**
filters:
- StripPrefix=3
order: 0
metadata:
version: v1
description: 用户服务API
- id: user-service-admin
uri: lb://user-service
predicates:
- Path=/admin/user/**
- Header=X-Admin-Token
filters:
- StripPrefix=2
order: 0
metadata:
version: v1
description: 用户服务管理接口
7.2 配置规范 #
| 规范 | 说明 |
|---|---|
| ID命名 | 服务名-功能-版本 |
| 路径规范 | 统一前缀,版本号 |
| 优先级 | 精确路由优先 |
| 元数据 | 添加描述信息 |
八、总结 #
8.1 核心要点 #
| 要点 | 说明 |
|---|---|
| 断言工厂 | 多种请求匹配方式 |
| 组合断言 | AND/OR组合条件 |
| 动态路由 | 运行时更新路由 |
| 路由优先级 | Order控制优先级 |
8.2 下一步 #
现在你已经掌握了路由配置,接下来让我们学习 过滤器,深入了解Gateway的过滤器机制!
最后更新:2026-03-28