@@ -158,7 +158,7 @@ func (g *RuleBasedInstancesFilter) matchSourceMetadata(ruleMeta map[string]*apim
158
158
if ruleMetaValue .GetValue ().GetValue () == matchAll {
159
159
continue
160
160
}
161
- rawMetaValue , exist := g .getRuleMetaValueStr (routeInfo , ruleMetaKey , ruleMetaValue )
161
+ rawMetaValue , exist := g .getRuleMetaValueForSource (routeInfo , ruleMetaKey , ruleMetaValue )
162
162
if ! exist {
163
163
return false , "" , nil
164
164
}
@@ -354,7 +354,7 @@ func (g *RuleBasedInstancesFilter) matchDstMetadata(routeInfo *servicerouter.Rou
354
354
cls = model .NewCluster (svcCache , inCluster )
355
355
var metaChanged bool
356
356
for ruleMetaKey , ruleMetaValue := range ruleMeta {
357
- ruleMetaValueStr , exist := g .getRuleMetaValueStr (routeInfo , ruleMetaKey , ruleMetaValue )
357
+ ruleMetaValueStr , exist := g .getRuleMetaValueForDest (routeInfo , ruleMetaKey , ruleMetaValue )
358
358
if ! exist {
359
359
// 首先如果元数据的value无法获取,直接匹配失败
360
360
return nil , false , "" , nil
@@ -417,9 +417,21 @@ func (g *RuleBasedInstancesFilter) matchDstMetadata(routeInfo *servicerouter.Rou
417
417
return cls , true , "" , nil
418
418
}
419
419
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
+
420
432
// 获取具体用于匹配的元数据的value
421
433
func (g * RuleBasedInstancesFilter ) getRuleMetaValueStr (routeInfo * servicerouter.RouteInfo , ruleMetaKey string ,
422
- ruleMetaValue * apimodel.MatchString ) (string , bool ) {
434
+ ruleMetaValue * apimodel.MatchString , forDest bool ) (string , bool ) {
423
435
var srcMeta map [string ]string
424
436
if routeInfo .SourceService != nil {
425
437
srcMeta = routeInfo .SourceService .GetMetadata ()
@@ -431,10 +443,17 @@ func (g *RuleBasedInstancesFilter) getRuleMetaValueStr(routeInfo *servicerouter.
431
443
processedRuleMetaValue = ruleMetaValue .GetValue ().GetValue ()
432
444
exist = true
433
445
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
+ }
436
453
} else {
437
- processedRuleMetaValue , exist = srcMeta [ruleMetaKey ]
454
+ // 如果是参数类型,并且当前是针对 Source 方向的标签匹配,默认直接放通
455
+ exist = true
456
+ processedRuleMetaValue = srcMeta [ruleMetaKey ]
438
457
}
439
458
case apimodel .MatchString_VARIABLE :
440
459
processedRuleMetaValue , exist = g .getVariable (ruleMetaValue .GetValue ().GetValue ())
0 commit comments