@@ -158,7 +158,7 @@ func (g *RuleBasedInstancesFilter) matchSourceMetadata(ruleMeta map[string]*apim
158158 if ruleMetaValue .GetValue ().GetValue () == matchAll {
159159 continue
160160 }
161- rawMetaValue , exist := g .getRuleMetaValueStr (routeInfo , ruleMetaKey , ruleMetaValue )
161+ rawMetaValue , exist := g .getRuleMetaValueForSource (routeInfo , ruleMetaKey , ruleMetaValue )
162162 if ! exist {
163163 return false , "" , nil
164164 }
@@ -354,7 +354,7 @@ func (g *RuleBasedInstancesFilter) matchDstMetadata(routeInfo *servicerouter.Rou
354354 cls = model .NewCluster (svcCache , inCluster )
355355 var metaChanged bool
356356 for ruleMetaKey , ruleMetaValue := range ruleMeta {
357- ruleMetaValueStr , exist := g .getRuleMetaValueStr (routeInfo , ruleMetaKey , ruleMetaValue )
357+ ruleMetaValueStr , exist := g .getRuleMetaValueForDest (routeInfo , ruleMetaKey , ruleMetaValue )
358358 if ! exist {
359359 // 首先如果元数据的value无法获取,直接匹配失败
360360 return nil , false , "" , nil
@@ -417,9 +417,21 @@ func (g *RuleBasedInstancesFilter) matchDstMetadata(routeInfo *servicerouter.Rou
417417 return cls , true , "" , nil
418418}
419419
420+ // getRuleMetaValueForSource 针对 Source 方向的标签 value 匹配获取
421+ func (g * RuleBasedInstancesFilter ) getRuleMetaValueForSource (routeInfo * servicerouter.RouteInfo , ruleMetaKey string ,
422+ ruleMetaValue * apimodel.MatchString ) (string , bool ) {
423+ return g .getRuleMetaValueStr (routeInfo , ruleMetaKey , ruleMetaValue , false )
424+ }
425+
426+ // getRuleMetaValueForDest 针对 Destination 方向的标签 value 匹配获取
427+ func (g * RuleBasedInstancesFilter ) getRuleMetaValueForDest (routeInfo * servicerouter.RouteInfo , ruleMetaKey string ,
428+ ruleMetaValue * apimodel.MatchString ) (string , bool ) {
429+ return g .getRuleMetaValueStr (routeInfo , ruleMetaKey , ruleMetaValue , true )
430+ }
431+
420432// 获取具体用于匹配的元数据的value
421433func (g * RuleBasedInstancesFilter ) getRuleMetaValueStr (routeInfo * servicerouter.RouteInfo , ruleMetaKey string ,
422- ruleMetaValue * apimodel.MatchString ) (string , bool ) {
434+ ruleMetaValue * apimodel.MatchString , forDest bool ) (string , bool ) {
423435 var srcMeta map [string ]string
424436 if routeInfo .SourceService != nil {
425437 srcMeta = routeInfo .SourceService .GetMetadata ()
@@ -431,10 +443,17 @@ func (g *RuleBasedInstancesFilter) getRuleMetaValueStr(routeInfo *servicerouter.
431443 processedRuleMetaValue = ruleMetaValue .GetValue ().GetValue ()
432444 exist = true
433445 case apimodel .MatchString_PARAMETER :
434- if len (srcMeta ) == 0 {
435- exist = false
446+ if forDest {
447+ if len (srcMeta ) == 0 {
448+ exist = false
449+ } else {
450+ // 对于参数场景,实例标签的 value 来自 source metadata 中的 value
451+ processedRuleMetaValue , exist = srcMeta [ruleMetaValue .GetValue ().GetValue ()]
452+ }
436453 } else {
437- processedRuleMetaValue , exist = srcMeta [ruleMetaKey ]
454+ // 如果是参数类型,并且当前是针对 Source 方向的标签匹配,默认直接放通
455+ exist = true
456+ processedRuleMetaValue = srcMeta [ruleMetaKey ]
438457 }
439458 case apimodel .MatchString_VARIABLE :
440459 processedRuleMetaValue , exist = g .getVariable (ruleMetaValue .GetValue ().GetValue ())
0 commit comments