This is an automated email from the ASF dual-hosted git repository.
alexstocks pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git
The following commit(s) were added to refs/heads/develop by this push:
new bd0c8ed93 refactor(router): replace config package (#3186)
bd0c8ed93 is described below
commit bd0c8ed93fa14cf9e6e2e9029cf6bd9b89541e32
Author: zbchi <[email protected]>
AuthorDate: Wed Feb 11 21:22:13 2026 +0800
refactor(router): replace config package (#3186)
* refactor(router): replace config package
---------
Co-authored-by: Copilot <[email protected]>
---
cluster/router/condition/dynamic_router.go | 15 ++++++++++-----
cluster/router/condition/factory.go | 4 ++--
cluster/router/condition/route.go | 14 +++++++-------
cluster/router/condition/router_test.go | 20 ++++++++++----------
cluster/router/script/router.go | 6 +++---
global/router_config.go | 26 ++++++++++++++++++++++++++
6 files changed, 58 insertions(+), 27 deletions(-)
diff --git a/cluster/router/condition/dynamic_router.go
b/cluster/router/condition/dynamic_router.go
index 7b52e5353..4bdc34c3e 100644
--- a/cluster/router/condition/dynamic_router.go
+++ b/cluster/router/condition/dynamic_router.go
@@ -35,8 +35,8 @@ import (
"dubbo.apache.org/dubbo-go/v3/common"
conf "dubbo.apache.org/dubbo-go/v3/common/config"
"dubbo.apache.org/dubbo-go/v3/common/constant"
- "dubbo.apache.org/dubbo-go/v3/config"
"dubbo.apache.org/dubbo-go/v3/config_center"
+ "dubbo.apache.org/dubbo-go/v3/global"
"dubbo.apache.org/dubbo-go/v3/protocol/base"
"dubbo.apache.org/dubbo-go/v3/remoting"
)
@@ -322,14 +322,19 @@ type ApplicationRouter struct {
currentApplication string
}
-func NewApplicationRouter() *ApplicationRouter {
- applicationName := config.GetApplicationConfig().Name
+func NewApplicationRouter(url *common.URL) *ApplicationRouter {
+ // get application name from url param
+ applicationName := url.GetParam(constant.ApplicationKey, "")
+ if applicationName == "" && url.SubURL != nil {
+ applicationName = url.SubURL.GetParam(constant.ApplicationKey,
"")
+ }
+
a := &ApplicationRouter{
currentApplication: applicationName,
}
dynamicConfiguration := conf.GetEnvInstance().GetDynamicConfiguration()
- if dynamicConfiguration != nil {
+ if dynamicConfiguration != nil && applicationName != "" {
dynamicConfiguration.AddListener(strings.Join([]string{applicationName,
constant.ConditionRouterRuleSuffix}, ""), a)
}
return a
@@ -382,7 +387,7 @@ func (a *ApplicationRouter) Notify(invokers []base.Invoker)
{
}
}
-func removeDuplicates(rules []*config.ConditionRule) {
+func removeDuplicates(rules []*global.ConditionRule) {
for i := 0; i < len(rules); i++ {
if rules[i] == nil {
continue
diff --git a/cluster/router/condition/factory.go
b/cluster/router/condition/factory.go
index c297f59c9..16f5b957a 100644
--- a/cluster/router/condition/factory.go
+++ b/cluster/router/condition/factory.go
@@ -52,6 +52,6 @@ func NewAppConditionRouterFactory()
router.PriorityRouterFactory {
}
// NewPriorityRouter constructs a new ApplicationRouter
-func (a *AppConditionRouterFactory) NewPriorityRouter(_ *common.URL)
(router.PriorityRouter, error) {
- return NewApplicationRouter(), nil
+func (a *AppConditionRouterFactory) NewPriorityRouter(url *common.URL)
(router.PriorityRouter, error) {
+ return NewApplicationRouter(url), nil
}
diff --git a/cluster/router/condition/route.go
b/cluster/router/condition/route.go
index 63e7e284f..8c89cd2ef 100644
--- a/cluster/router/condition/route.go
+++ b/cluster/router/condition/route.go
@@ -37,7 +37,7 @@ import (
"dubbo.apache.org/dubbo-go/v3/cluster/router/condition/matcher"
"dubbo.apache.org/dubbo-go/v3/common"
"dubbo.apache.org/dubbo-go/v3/common/constant"
- "dubbo.apache.org/dubbo-go/v3/config"
+ "dubbo.apache.org/dubbo-go/v3/global"
"dubbo.apache.org/dubbo-go/v3/protocol/base"
)
@@ -289,9 +289,9 @@ func (a byPriority) Len() int { return len(a) }
func (a byPriority) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a byPriority) Less(i, j int) bool { return a[i].Priority() <
a[j].Priority() }
-func parseConditionRoute(routeContent string) (*config.RouterConfig, error) {
+func parseConditionRoute(routeContent string) (*global.RouterConfig, error) {
routeDecoder := yaml.NewDecoder(strings.NewReader(routeContent))
- routerConfig := &config.RouterConfig{}
+ routerConfig := &global.RouterConfig{}
err := routeDecoder.Decode(routerConfig)
if err != nil {
return nil, err
@@ -439,9 +439,9 @@ func NewConditionMultiDestRouter(url *common.URL)
(*MultiDestRouter, error) {
if !ok {
return nil, errors.Errorf("Condition Router can't get the rule
key")
}
- condConf, ok := rawCondConf.(*config.ConditionRule)
+ condConf, ok := rawCondConf.(*global.ConditionRule)
if !ok {
- return nil, errors.Errorf("Condition Router get the rule key
invaild , got %T", rawCondConf)
+ return nil, errors.Errorf("Condition Router get the rule key
invalid , got %T", rawCondConf)
}
// ensure config effective
if (len(condConf.To) == 0) && condConf.From.Match == "" {
@@ -469,9 +469,9 @@ func NewConditionMultiDestRouter(url *common.URL)
(*MultiDestRouter, error) {
return c, nil
}
-func parseMultiConditionRoute(routeContent string) (*config.ConditionRouter,
error) {
+func parseMultiConditionRoute(routeContent string) (*global.ConditionRouter,
error) {
routeDecoder := yaml.NewDecoder(strings.NewReader(routeContent))
- routerConfig := &config.ConditionRouter{}
+ routerConfig := &global.ConditionRouter{}
err := routeDecoder.Decode(routerConfig)
if err != nil {
return nil, err
diff --git a/cluster/router/condition/router_test.go
b/cluster/router/condition/router_test.go
index 14938baae..0750a5df9 100644
--- a/cluster/router/condition/router_test.go
+++ b/cluster/router/condition/router_test.go
@@ -32,9 +32,9 @@ import (
commonConfig "dubbo.apache.org/dubbo-go/v3/common/config"
"dubbo.apache.org/dubbo-go/v3/common/constant"
"dubbo.apache.org/dubbo-go/v3/common/extension"
- "dubbo.apache.org/dubbo-go/v3/config"
"dubbo.apache.org/dubbo-go/v3/config_center"
"dubbo.apache.org/dubbo-go/v3/config_center/configurator"
+ "dubbo.apache.org/dubbo-go/v3/global"
"dubbo.apache.org/dubbo-go/v3/protocol/base"
"dubbo.apache.org/dubbo-go/v3/protocol/invocation"
"dubbo.apache.org/dubbo-go/v3/remoting"
@@ -800,7 +800,7 @@ conditions:
dc, _ := mockFactory.GetDynamicConfiguration(ccURL)
commonConfig.GetEnvInstance().SetDynamicConfiguration(dc)
- router := NewApplicationRouter()
+ router := NewApplicationRouter(consumerURL)
router.Notify(invokerList)
rpcInvocation := invocation.NewRPCInvocation("sayHello", nil, nil)
@@ -874,7 +874,7 @@ func Test_parseMultiConditionRoute(t *testing.T) {
tests := []struct {
name string
args args
- want *config.ConditionRouter
+ want *global.ConditionRouter
wantErr assert.ErrorAssertionFunc
}{
{name: "testParseConfig", args: args{`configVersion: v3.1
@@ -898,21 +898,21 @@ conditions:
- from:
match: version=v1
to:
- - match: version=v1`}, want: &config.ConditionRouter{
+ - match: version=v1`}, want: &global.ConditionRouter{
Scope: "service",
Key: "org.apache.dubbo.samples.CommentService",
Force: false,
Runtime: true,
Enabled: true,
- Conditions: []*config.ConditionRule{
+ Conditions: []*global.ConditionRule{
{
- From: config.ConditionRuleFrom{Match:
"tag=tag1"},
+ From: global.ConditionRuleFrom{Match:
"tag=tag1"},
To: nil,
}, {
- From: config.ConditionRuleFrom{
+ From: global.ConditionRuleFrom{
Match: `tag=gray`,
},
- To: []config.ConditionRuleTo{{
+ To: []global.ConditionRuleTo{{
Match: `tag!=gray`,
Weight: 100,
}, {
@@ -920,10 +920,10 @@ conditions:
Weight: 900,
}},
}, {
- From: config.ConditionRuleFrom{
+ From: global.ConditionRuleFrom{
Match: `version=v1`,
},
- To: []config.ConditionRuleTo{{
+ To: []global.ConditionRuleTo{{
Match: `version=v1`,
Weight: 0,
}},
diff --git a/cluster/router/script/router.go b/cluster/router/script/router.go
index 856e63e56..a65fac354 100644
--- a/cluster/router/script/router.go
+++ b/cluster/router/script/router.go
@@ -33,8 +33,8 @@ import (
"dubbo.apache.org/dubbo-go/v3/common"
conf "dubbo.apache.org/dubbo-go/v3/common/config"
"dubbo.apache.org/dubbo-go/v3/common/constant"
- "dubbo.apache.org/dubbo-go/v3/config"
"dubbo.apache.org/dubbo-go/v3/config_center"
+ "dubbo.apache.org/dubbo-go/v3/global"
"dubbo.apache.org/dubbo-go/v3/protocol/base"
"dubbo.apache.org/dubbo-go/v3/remoting"
)
@@ -56,9 +56,9 @@ func NewScriptRouter() *ScriptRouter {
}
}
-func parseRoute(routeContent string) (*config.RouterConfig, error) {
+func parseRoute(routeContent string) (*global.RouterConfig, error) {
routeDecoder := yaml.NewDecoder(strings.NewReader(routeContent))
- routerConfig := &config.RouterConfig{}
+ routerConfig := &global.RouterConfig{}
err := routeDecoder.Decode(routerConfig)
if err != nil {
return nil, err
diff --git a/global/router_config.go b/global/router_config.go
index 948cb5631..ff0a50495 100644
--- a/global/router_config.go
+++ b/global/router_config.go
@@ -17,6 +17,10 @@
package global
+import (
+ "reflect"
+)
+
import (
"dubbo.apache.org/dubbo-go/v3/common"
)
@@ -53,6 +57,28 @@ type ConditionRule struct {
To []ConditionRuleTo `yaml:"to" json:"to,omitempty" property:"to"`
}
+// Equal checks if two ConditionRule instances are equal.
+func (x *ConditionRule) Equal(t *ConditionRule) bool {
+ if x == nil || t == nil {
+ return x == t
+ }
+ if !reflect.DeepEqual(x.From, t.From) {
+ return false
+ }
+ if len(x.To) != len(t.To) {
+ return false
+ }
+ if len(x.To) == 0 {
+ return true
+ }
+ for i := range x.To {
+ if !reflect.DeepEqual(x.To[i], t.To[i]) {
+ return false
+ }
+ }
+ return true
+}
+
type ConditionRuleFrom struct {
Match string `yaml:"match" json:"match,omitempty" property:"match"`
}