traefik计算优先级

本文探讨了Traefik如何处理路由优先级,特别关注了当新提交的路径如/a与已存在的/a/b冲突时,以及新增的/a/b/c如何影响优先级。核心代码展示了Traefik如何根据路径匹配规则来决定请求的路由。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

核心代码

type Frontend struct {
	Priority             int                   `json:"priority"`
	Routes               map[string]Route      `json:"routes,omitempty" 
	......
}
func (p *Provider) loadIngresses(k8sClient Client) (*types.Configuration, error) {
				...
		for _, r := range i.Spec.Rules {
			for _, pa := range r.HTTP.Paths {
				...
				rule, err := getRuleForPath(pa, i)
				if rule != "" {
					frontend.Routes[pa.Path] = types.Route{
						Rule: rule,
					}
				}
				...
}
func getRuleForPath(pa extensionsv1beta1.HTTPIngressPath, i *extensionsv1beta1.Ingress) (string, error) {
		...
		rules := []string{ruleType + ":" + pa.Path}
		...
		if rewriteTarget != "" {
			rewriteTargetRule := fmt.Sprintf("ReplacePathRegex: ^%s(.*) %s$1", pa.Path, strings.TrimRight(rewriteTarget, "/"))
			if pa.Path == "/" {
				rewriteTargetRule = fmt.Sprintf("ReplacePathRegex: ^(.*) %s$1", strings.TrimRight(rewriteTarget, "/"))
		}
		rules = append(rules, rewriteTargetRule)
	}
	...
	return strings.Join(rules, ";"), nil
}

func buildServerRoute(serverEntryPoint *serverEntryPoint, frontendName string, frontend *types.Frontend, hostResolver *hostresolver.Resolver) (*types.ServerRoute, error) {
	serverRoute := &types.ServerRoute{Route: serverEntryPoint.httpRouter.GetHandler().NewRoute().Name(frontendName)}

	priority := 0
	for routeName, route := range frontend.Routes {
		rls := rules.Rules{Route: serverRoute, HostResolver: hostResolver}
		...
		priority += len(route.Rule)
	}

	if frontend.Priority > 0 {
		serverRoute.Route.Priority(frontend.Priority)
	} else {
		serverRoute.Route.Priority(priority)
	}

	return serverRoute, nil
}
  • path1:/a/b,新提交path2:/a
Path1,rewritePath2,rewrite情况
path1优先匹配
path1优先匹配
path2优先匹配
path1优先匹配
  • 已有path1:/a/b,新提交path2:/a/b/c
Path1,rewritePath2,rewrite情况
path2优先匹配
path1优先匹配
path2优先匹配
path2优先匹配
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值