Skip to content

Traefik 多层路由(Multi-Layer Routing)文档

多层路由

多层路由允许你创建路由器之间的层级关系,其中父路由器可以在子路由器做出最终路由决策之前,通过中间件处理请求。

此功能允许在父级别的中间件修改请求(添加头、执行身份认证等),从而影响子路由器如何评估其规则并将流量路由到服务。

多层路由对于**渐进式请求丰富化(progressive request enrichment)**特别有用:每一层都为请求添加上下文,从而实现越来越具体的路由决策:

  • 基于认证的路由:父路由器对请求进行身份认证并将用户上下文(角色、权限)作为头添加,子路由器基于这些头进行路由。
  • 分层中间件应用:在父级别(针对给定的域/路径)应用通用中间件(限流、CORS),但在子级别应用特定中间件。

支持的 Provider

多层路由由以下 Provider 支持:

  • 文件 Provider(YAML、TOML、JSON)
  • KV 存储(Consul、etcd、Redis、ZooKeeper)
  • Kubernetes CRD(IngressRoute)

其他 Provider(Docker、Kubernetes Ingress、Gateway API 等)不支持多层路由。

工作原理

Request → EntryPoint → Parent Router → Middleware → Child Router A → Service A
                                          ↓       → Child Router B → Service B
                                     Modify Request
                                  (e.g., add headers)
  1. 请求到达入口点
  2. 父路由器根据其规则(例如 Host(example.com))匹配
  3. 父中间件执行,可能修改请求
  4. 一个子路由器根据其规则(可能使用修改后的请求属性)匹配
  5. 请求被转发到匹配的子路由器的服务

构建路由器层级

根路由器(Root Routers)

  • 没有 parentRefs(层级结构的顶部)
  • 可以tlsobservabilityentryPoints 配置
  • 可以是父路由器(带子路由器)或独立路由器(带服务)
  • 可以应用 models(非根路由器不能应用 models)

中间路由器(Intermediate Routers)

  • 通过 parentRefs 引用其父路由器
  • 有一个或多个子路由器
  • 必须不定义 service

叶子路由器(Leaf Routers)

  • 通过 parentRefs 引用其父路由器
  • 必须定义 service
  • 触发实际的服务调用

配置示例

YAML 格式:

yaml
http:
  routers:
    # 父路由器:处理认证和添加用户上下文
    api-parent:
      rule: "Host(`api.example.com`)"
      entryPoints:
        - "web"
      middlewares:
        - "auth"           # 执行认证
        - "add-user-info"  # 添加用户信息头
      # 没有 service,因为这是父路由器

    # 叶子路由器:基于用户角色路由
    api-admin:
      parentRefs:
        - "api-parent"
      rule: "Header(`X-User-Role`, `admin`)"
      service: "admin-service"
      priority: 100

    api-user:
      parentRefs:
        - "api-parent"
      rule: "Header(`X-User-Role`, `user`)"
      service: "user-service"
      priority: 100

  middlewares:
    add-user-info:
      headers:
        customRequestHeaders:
          X-User-Role: "user"  # 由认证中间件设置

  services:
    admin-service:
      loadBalancer:
        servers:
          - url: "http://admin-backend/"
    user-service:
      loadBalancer:
        servers:
          - url: "http://user-backend/"

适用场景

  • API 网关分层路由:先进行认证,再根据用户角色路由到不同的微服务
  • 多租户应用:先识别租户,再路由到该租户的实例
  • A/B 测试:在父级确定流量分配,再路由到不同版本
  • 蓝绿部署:在父级决定蓝/绿,再路由到对应环境

在生产环境使用 Traefik OSS?

如果你在工作中使用 Traefik,可以考虑为其添加企业级 API 网关能力或获取 Traefik OSS 的商业支持。

基于 MIT 协议发布