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)- 请求到达入口点
- 父路由器根据其规则(例如
Host(example.com))匹配 - 父中间件执行,可能修改请求
- 一个子路由器根据其规则(可能使用修改后的请求属性)匹配
- 请求被转发到匹配的子路由器的服务
构建路由器层级
根路由器(Root Routers)
- 没有
parentRefs(层级结构的顶部) - 可以有
tls、observability和entryPoints配置 - 可以是父路由器(带子路由器)或独立路由器(带服务)
- 可以应用 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 的商业支持。