mirror of
https://github.com/alibaba/higress.git
synced 2026-04-21 03:57:28 +08:00
feat(loadbalance): enhance consistent hashing with useSourceIp support (#2844)
This commit is contained in:
@@ -50,13 +50,13 @@ var (
|
||||
headersMapping = map[string]string{
|
||||
"$request_uri": ":path",
|
||||
"$host": ":authority",
|
||||
"$remote_addr": "x-envoy-external-address",
|
||||
}
|
||||
)
|
||||
|
||||
type consistentHashByOther struct {
|
||||
header string
|
||||
queryParam string
|
||||
header string
|
||||
queryParam string
|
||||
useSourceIp bool
|
||||
}
|
||||
|
||||
type consistentHashByCookie struct {
|
||||
@@ -110,19 +110,26 @@ func (l loadBalance) Parse(annotations Annotations, config *Ingress, _ *GlobalCo
|
||||
} else if isOtherAffinity(annotations) {
|
||||
if key, err := annotations.ParseStringASAP(upstreamHashBy); err == nil &&
|
||||
strings.HasPrefix(key, varIndicator) {
|
||||
value, exist := headersMapping[key]
|
||||
if exist {
|
||||
// Special case for $remote_addr: use useSourceIp instead of header mapping
|
||||
if key == "$remote_addr" {
|
||||
loadBalanceConfig.other = &consistentHashByOther{
|
||||
header: value,
|
||||
useSourceIp: true,
|
||||
}
|
||||
} else {
|
||||
if strings.HasPrefix(key, headerIndicator) {
|
||||
value, exist := headersMapping[key]
|
||||
if exist {
|
||||
loadBalanceConfig.other = &consistentHashByOther{
|
||||
header: strings.TrimPrefix(key, headerIndicator),
|
||||
header: value,
|
||||
}
|
||||
} else if strings.HasPrefix(key, queryParamIndicator) {
|
||||
loadBalanceConfig.other = &consistentHashByOther{
|
||||
queryParam: strings.TrimPrefix(key, queryParamIndicator),
|
||||
} else {
|
||||
if strings.HasPrefix(key, headerIndicator) {
|
||||
loadBalanceConfig.other = &consistentHashByOther{
|
||||
header: strings.TrimPrefix(key, headerIndicator),
|
||||
}
|
||||
} else if strings.HasPrefix(key, queryParamIndicator) {
|
||||
loadBalanceConfig.other = &consistentHashByOther{
|
||||
queryParam: strings.TrimPrefix(key, queryParamIndicator),
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -165,7 +172,13 @@ func (l loadBalance) ApplyTrafficPolicy(trafficPolicy *networking.TrafficPolicy,
|
||||
}
|
||||
} else if loadBalanceConfig.other != nil {
|
||||
var consistentHash *networking.LoadBalancerSettings_ConsistentHashLB
|
||||
if loadBalanceConfig.other.header != "" {
|
||||
if loadBalanceConfig.other.useSourceIp {
|
||||
consistentHash = &networking.LoadBalancerSettings_ConsistentHashLB{
|
||||
HashKey: &networking.LoadBalancerSettings_ConsistentHashLB_UseSourceIp{
|
||||
UseSourceIp: true,
|
||||
},
|
||||
}
|
||||
} else if loadBalanceConfig.other.header != "" {
|
||||
consistentHash = &networking.LoadBalancerSettings_ConsistentHashLB{
|
||||
HashKey: &networking.LoadBalancerSettings_ConsistentHashLB_HttpHeaderName{
|
||||
HttpHeaderName: loadBalanceConfig.other.header,
|
||||
|
||||
@@ -109,7 +109,7 @@ func TestLoadBalanceParse(t *testing.T) {
|
||||
expect: &LoadBalanceConfig{
|
||||
simple: networking.LoadBalancerSettings_ROUND_ROBIN,
|
||||
other: &consistentHashByOther{
|
||||
header: "x-envoy-external-address",
|
||||
useSourceIp: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
@@ -233,6 +233,27 @@ func TestLoadBalanceApplyTrafficPolicy(t *testing.T) {
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
config: &Ingress{
|
||||
LoadBalance: &LoadBalanceConfig{
|
||||
other: &consistentHashByOther{
|
||||
useSourceIp: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
input: &networking.TrafficPolicy_PortTrafficPolicy{},
|
||||
expect: &networking.TrafficPolicy_PortTrafficPolicy{
|
||||
LoadBalancer: &networking.LoadBalancerSettings{
|
||||
LbPolicy: &networking.LoadBalancerSettings_ConsistentHash{
|
||||
ConsistentHash: &networking.LoadBalancerSettings_ConsistentHashLB{
|
||||
HashKey: &networking.LoadBalancerSettings_ConsistentHashLB_UseSourceIp{
|
||||
UseSourceIp: true,
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
for _, inputCase := range inputCases {
|
||||
|
||||
Reference in New Issue
Block a user