traefik計算優先級

核心代碼

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,rewrite Path2,rewrite 情況
path1優先匹配
path1優先匹配
path2優先匹配
path1優先匹配
  • 已有path1:/a/b,新提交path2:/a/b/c
Path1,rewrite Path2,rewrite 情況
path2優先匹配
path1優先匹配
path2優先匹配
path2優先匹配
發佈了46 篇原創文章 · 獲贊 19 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章