路由配置 #

一、路由基础 #

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