diff --git a/config/config_loader_test.go b/config/config_loader_test.go index bcd42a678a81550ef29797b9b30343d8b0fa4b6e..6e9689c76322686fff0fab585dc08436a07cd55c 100644 --- a/config/config_loader_test.go +++ b/config/config_loader_test.go @@ -83,7 +83,34 @@ func TestLoad(t *testing.T) { consumerConfig = nil providerConfig = nil } +func TestWithNoRegLoad(t *testing.T) { + doInit() + doinit() + providerConfig.Services["MockService"].Registry = "" + consumerConfig.References["MockService"].Registry = "" + ms := &MockService{} + SetConsumerService(ms) + SetProviderService(ms) + + extension.SetProtocol("registry", GetProtocol) + extension.SetCluster("registryAware", cluster_impl.NewRegistryAwareCluster) + extension.SetProxyFactory("default", proxy_factory.NewDefaultProxyFactory) + + Load() + + assert.Equal(t, ms, GetRPCService(ms.Service())) + ms2 := &struct { + MockService + }{} + RPCService(ms2) + assert.NotEqual(t, ms2, GetRPCService(ms2.Service())) + conServices = map[string]common.RPCService{} + proServices = map[string]common.RPCService{} + common.ServiceMap.UnRegister("mock", "MockService") + consumerConfig = nil + providerConfig = nil +} func TestConfigLoaderWithConfigCenter(t *testing.T) { extension.SetConfigCenterFactory("mock", func() config_center.DynamicConfigurationFactory { return &config_center.MockDynamicConfigurationFactory{} diff --git a/config/reference_config.go b/config/reference_config.go index cd24b769a99fe11e59d3afee9808a403dec0c211..2c38d8aa4aa31576c94724d4537aa752df2fb96c 100644 --- a/config/reference_config.go +++ b/config/reference_config.go @@ -38,29 +38,27 @@ import ( type ReferenceConfig struct { context context.Context pxy *proxy.Proxy - InterfaceName string `required:"true" yaml:"interface" json:"interface,omitempty" property:"interface"` - Check *bool `yaml:"check" json:"check,omitempty" property:"check"` - Url string `yaml:"url" json:"url,omitempty" property:"url"` - Filter string `yaml:"filter" json:"filter,omitempty" property:"filter"` - Protocol string `yaml:"protocol" json:"protocol,omitempty" property:"protocol"` - //Registries []ConfigRegistry `required:"true" yaml:"registries" json:"registries,omitempty" property:"registries"` - Cluster string `yaml:"cluster" json:"cluster,omitempty" property:"cluster"` - Loadbalance string `yaml:"loadbalance" json:"loadbalance,omitempty" property:"loadbalance"` - Retries int64 `yaml:"retries" json:"retries,omitempty" property:"retries"` - Group string `yaml:"group" json:"group,omitempty" property:"group"` - Version string `yaml:"version" json:"version,omitempty" property:"version"` - Methods []*MethodConfig `yaml:"methods" json:"methods,omitempty" property:"methods"` - async bool `yaml:"async" json:"async,omitempty" property:"async"` - invoker protocol.Invoker - urls []*common.URL + InterfaceName string `required:"true" yaml:"interface" json:"interface,omitempty" property:"interface"` + Check *bool `yaml:"check" json:"check,omitempty" property:"check"` + Url string `yaml:"url" json:"url,omitempty" property:"url"` + Filter string `yaml:"filter" json:"filter,omitempty" property:"filter"` + Protocol string `yaml:"protocol" json:"protocol,omitempty" property:"protocol"` + Registry string `yaml:"registry" json:"registry,omitempty" property:"registry"` + Cluster string `yaml:"cluster" json:"cluster,omitempty" property:"cluster"` + Loadbalance string `yaml:"loadbalance" json:"loadbalance,omitempty" property:"loadbalance"` + Retries int64 `yaml:"retries" json:"retries,omitempty" property:"retries"` + Group string `yaml:"group" json:"group,omitempty" property:"group"` + Version string `yaml:"version" json:"version,omitempty" property:"version"` + Methods []*MethodConfig `yaml:"methods" json:"methods,omitempty" property:"methods"` + async bool `yaml:"async" json:"async,omitempty" property:"async"` + invoker protocol.Invoker + urls []*common.URL } func (c *ReferenceConfig) Prefix() string { return constant.ReferenceConfigPrefix + c.InterfaceName + "." } -type ConfigRegistry string - func NewReferenceConfig(ctx context.Context) *ReferenceConfig { return &ReferenceConfig{context: ctx} } @@ -102,7 +100,7 @@ func (refconfig *ReferenceConfig) Refer() { } } else { //2. assemble SubURL from register center's configuration妯″紡 - refconfig.urls = loadRegistries(consumerConfig.Registries, common.CONSUMER) + refconfig.urls = loadRegistries(refconfig.Registry, consumerConfig.Registries, common.CONSUMER) //set url to regUrls for _, regUrl := range refconfig.urls { diff --git a/config/reference_config_test.go b/config/reference_config_test.go index 16b23c86d70ee60919e736b9c101b267d26abdec..c41e2a16de1cdc347d204cfae9d36b0b54f12808 100644 --- a/config/reference_config_test.go +++ b/config/reference_config_test.go @@ -80,6 +80,7 @@ func doInit() { }, References: map[string]*ReferenceConfig{ "MockService": { + Registry: "shanghai_reg1,shanghai_reg2,hangzhou_reg1,hangzhou_reg2", InterfaceName: "MockService", Protocol: "mock", Cluster: "failover", diff --git a/config/registry_config.go b/config/registry_config.go index 8d6b1dc2b4d45a1230eff4d1bf4a419d4dd55bee..0c6b326a8077de571b4c6254c13f129eb5190b74 100644 --- a/config/registry_config.go +++ b/config/registry_config.go @@ -21,6 +21,7 @@ import ( "context" "net/url" "strconv" + "strings" ) import ( @@ -44,22 +45,42 @@ func (*RegistryConfig) Prefix() string { return constant.RegistryConfigPrefix } -func loadRegistries(registries map[string]*RegistryConfig, roleType common.RoleType) []*common.URL { +func loadRegistries(targetRegistries string, registries map[string]*RegistryConfig, roleType common.RoleType) []*common.URL { var urls []*common.URL - for k, registryConf := range registries { + trSlice := strings.Split(targetRegistries, ",") - url, err := common.NewURL( - context.TODO(), - constant.REGISTRY_PROTOCOL+"://"+registryConf.Address, - common.WithParams(registryConf.getUrlMap(roleType)), - common.WithUsername(registryConf.Username), - common.WithPassword(registryConf.Password), - ) + for k, registryConf := range registries { + target := false - if err != nil { - logger.Errorf("The registry id:%s url is invalid ,and will skip the registry, error: %#v", k, err) + // if user not config targetRegistries,default load all + // Notice:in func "func Split(s, sep string) []string" comment : if s does not contain sep and sep is not empty, SplitAfter returns a slice of length 1 whose only element is s. + // So we have to add the condition when targetRegistries string is not set (it will be "" when not set) + if len(trSlice) == 0 || (len(trSlice) == 1 && trSlice[0] == "") { + target = true } else { - urls = append(urls, &url) + // else if user config targetRegistries + for _, tr := range trSlice { + if tr == k { + target = true + break + } + } + } + + if target { + url, err := common.NewURL( + context.TODO(), + constant.REGISTRY_PROTOCOL+"://"+registryConf.Address, + common.WithParams(registryConf.getUrlMap(roleType)), + common.WithUsername(registryConf.Username), + common.WithPassword(registryConf.Password), + ) + + if err != nil { + logger.Errorf("The registry id:%s url is invalid ,and will skip the registry, error: %#v", k, err) + } else { + urls = append(urls, &url) + } } } diff --git a/config/service_config.go b/config/service_config.go index 73a0cc39b919bc979d608f7e5fcd01228395995c..79a29aa33058dfc47fca282a71ba28292a2b1ff3 100644 --- a/config/service_config.go +++ b/config/service_config.go @@ -43,17 +43,17 @@ import ( type ServiceConfig struct { context context.Context - Filter string `yaml:"filter" json:"filter,omitempty" property:"filter"` - Protocol string `required:"true" yaml:"protocol" json:"protocol,omitempty" property:"protocol"` //multi protocol support, split by ',' - InterfaceName string `required:"true" yaml:"interface" json:"interface,omitempty" property:"interface"` - Registries []ConfigRegistry `required:"true" yaml:"registries" json:"registries,omitempty" property:"registries"` - Cluster string `default:"failover" yaml:"cluster" json:"cluster,omitempty" property:"cluster"` - Loadbalance string `default:"random" yaml:"loadbalance" json:"loadbalance,omitempty" property:"loadbalance"` - Group string `yaml:"group" json:"group,omitempty" property:"group"` - Version string `yaml:"version" json:"version,omitempty" property:"version" ` - Methods []*MethodConfig `yaml:"methods" json:"methods,omitempty" property:"methods"` - Warmup string `yaml:"warmup" json:"warmup,omitempty" property:"warmup"` - Retries int64 `yaml:"retries" json:"retries,omitempty" property:"retries"` + Filter string `yaml:"filter" json:"filter,omitempty" property:"filter"` + Protocol string `required:"true" yaml:"protocol" json:"protocol,omitempty" property:"protocol"` //multi protocol support, split by ',' + InterfaceName string `required:"true" yaml:"interface" json:"interface,omitempty" property:"interface"` + Registry string `yaml:"registry" json:"registry,omitempty" property:"registry"` + Cluster string `default:"failover" yaml:"cluster" json:"cluster,omitempty" property:"cluster"` + Loadbalance string `default:"random" yaml:"loadbalance" json:"loadbalance,omitempty" property:"loadbalance"` + Group string `yaml:"group" json:"group,omitempty" property:"group"` + Version string `yaml:"version" json:"version,omitempty" property:"version" ` + Methods []*MethodConfig `yaml:"methods" json:"methods,omitempty" property:"methods"` + Warmup string `yaml:"warmup" json:"warmup,omitempty" property:"warmup"` + Retries int64 `yaml:"retries" json:"retries,omitempty" property:"retries"` unexported *atomic.Bool exported *atomic.Bool rpcService common.RPCService @@ -88,7 +88,7 @@ func (srvconfig *ServiceConfig) Export() error { return nil } - regUrls := loadRegistries(providerConfig.Registries, common.PROVIDER) + regUrls := loadRegistries(srvconfig.Registry, providerConfig.Registries, common.PROVIDER) urlMap := srvconfig.getUrlMap() for _, proto := range loadProtocol(srvconfig.Protocol, providerConfig.Protocols) { diff --git a/config/service_config_test.go b/config/service_config_test.go index 5107dea211c0eb23869203a748a97ef89e09be91..4e0b7f95d6b156eeda021e3c02e5457e8b52b244 100644 --- a/config/service_config_test.go +++ b/config/service_config_test.go @@ -76,7 +76,7 @@ func doinit() { "MockService": { InterfaceName: "MockService", Protocol: "mock", - Registries: []ConfigRegistry{"shanghai_reg1", "shanghai_reg2", "hangzhou_reg1", "hangzhou_reg2"}, + Registry: "shanghai_reg1,shanghai_reg2,hangzhou_reg1,hangzhou_reg2", Cluster: "failover", Loadbalance: "random", Retries: 3, diff --git a/config/testdata/consumer_config.yml b/config/testdata/consumer_config.yml index 2d8287853b568d272c1c64dbccaef5047c2ee388..08ff59f6fc403a0aa31e090fa8f9341a6e11d490 100644 --- a/config/testdata/consumer_config.yml +++ b/config/testdata/consumer_config.yml @@ -19,15 +19,13 @@ application_config: registries : "hangzhouzk": - id: "hangzhouzk" - type: "zookeeper" + protocol: "zookeeper" timeout : "3s" address: "127.0.0.1:2181" username: "" password: "" "shanghaizk": - id: "shanghaizk" - type: "zookeeper" + protocol: "zookeeper" timeout : "3s" address: "127.0.0.1:2182" username: "" @@ -35,6 +33,7 @@ registries : references: "UserProvider": + registry: "hangzhouzk,shanghaizk" filter: "" protocol : "dubbo" interface : "com.ikurento.user.UserProvider" diff --git a/config/testdata/consumer_config_with_configcenter.yml b/config/testdata/consumer_config_with_configcenter.yml index acaed2ade2306bcdef9ed62b0cb7b46ed49815f8..df896d2442ce6eb5cf0cc41bb92f39964325d885 100644 --- a/config/testdata/consumer_config_with_configcenter.yml +++ b/config/testdata/consumer_config_with_configcenter.yml @@ -5,6 +5,7 @@ config_center: address: "127.0.0.1" references: "UserProvider": + registry: "hangzhouzk,shanghaizk" filter: "" protocol : "dubbo" interface : "com.ikurento.user.UserProvider" diff --git a/config/testdata/provider_config.yml b/config/testdata/provider_config.yml index 56d658e954495e7dfd3f203d8f58d5fb02651964..38952220e270b2b0a929a7583d1f5650ecab0121 100644 --- a/config/testdata/provider_config.yml +++ b/config/testdata/provider_config.yml @@ -12,13 +12,13 @@ application_config: registries : "hangzhouzk": - type: "zookeeper" + protocol: "zookeeper" timeout : "3s" address: "127.0.0.1:2181" username: "" password: "" "shanghaizk": - type: "zookeeper" + protocol: "zookeeper" timeout : "3s" address: "127.0.0.1:2182" username: "" @@ -27,6 +27,7 @@ registries : services: "UserProvider": + registry: "hangzhouzk,shanghaizk" filter: "" protocol : "dubbo" # equivalent to interface of dubbo.xml diff --git a/examples/dubbo/go-client/profiles/dev/client.yml b/examples/dubbo/go-client/profiles/dev/client.yml index 3765305c66fcbd7111098aab6759f9705862d74c..1595f23c34d3a374c47678ecc7350696e1d8b2c9 100644 --- a/examples/dubbo/go-client/profiles/dev/client.yml +++ b/examples/dubbo/go-client/profiles/dev/client.yml @@ -33,6 +33,8 @@ registries : references: "UserProvider": + # 鍙互鎸囧畾澶氫釜registry锛屼娇鐢ㄩ€楀彿闅斿紑;涓嶆寚瀹氶粯璁ゅ悜鎵€鏈夋敞鍐屼腑蹇冩敞鍐� + registry: "hangzhouzk" protocol : "dubbo" interface : "com.ikurento.user.UserProvider" cluster: "failover" diff --git a/examples/dubbo/go-client/profiles/release/client.yml b/examples/dubbo/go-client/profiles/release/client.yml index 5fb148618ece154b1cde56a1cc68e2a49538914c..7a193ea64d783220f016c6b6220d602a5c586129 100644 --- a/examples/dubbo/go-client/profiles/release/client.yml +++ b/examples/dubbo/go-client/profiles/release/client.yml @@ -32,6 +32,8 @@ registries : references: "UserProvider": + # 鍙互鎸囧畾澶氫釜registry锛屼娇鐢ㄩ€楀彿闅斿紑;涓嶆寚瀹氶粯璁ゅ悜鎵€鏈夋敞鍐屼腑蹇冩敞鍐� + registry: "hangzhouzk" protocol : "dubbo" # version: "2.0" # group: "as" diff --git a/examples/dubbo/go-client/profiles/test/client.yml b/examples/dubbo/go-client/profiles/test/client.yml index 5f09d7302b4c8b5113ab0faf65f3d4d940d50256..24ede19d7d2365fb9c7d92d31bc312cfc7935388 100644 --- a/examples/dubbo/go-client/profiles/test/client.yml +++ b/examples/dubbo/go-client/profiles/test/client.yml @@ -32,6 +32,8 @@ registries : references: "UserProvider": + # 鍙互鎸囧畾澶氫釜registry锛屼娇鐢ㄩ€楀彿闅斿紑;涓嶆寚瀹氶粯璁ゅ悜鎵€鏈夋敞鍐屼腑蹇冩敞鍐� + registry: "hangzhouzk" protocol : "dubbo" # version: "2.0" # group: "as" diff --git a/examples/dubbo/go-server/profiles/dev/server.yml b/examples/dubbo/go-server/profiles/dev/server.yml index 58dd8a4cd5ed28f69e3efafce9b4e270ef78e303..bc4b288542322c8644c7af643dcb8dfafa099b1a 100644 --- a/examples/dubbo/go-server/profiles/dev/server.yml +++ b/examples/dubbo/go-server/profiles/dev/server.yml @@ -29,6 +29,8 @@ registries : services: "UserProvider": + # 鍙互鎸囧畾澶氫釜registry锛屼娇鐢ㄩ€楀彿闅斿紑;涓嶆寚瀹氶粯璁ゅ悜鎵€鏈夋敞鍐屼腑蹇冩敞鍐� + registry: "hangzhouzk" protocol : "dubbo" # 鐩稿綋浜巇ubbo.xml涓殑interface interface : "com.ikurento.user.UserProvider" diff --git a/examples/dubbo/go-server/profiles/release/server.yml b/examples/dubbo/go-server/profiles/release/server.yml index 9c9ad5c15cddb262f7d494aa784f01a17ca66fc8..3db12902f1d349e1703f2f977c682c61b0d35938 100644 --- a/examples/dubbo/go-server/profiles/release/server.yml +++ b/examples/dubbo/go-server/profiles/release/server.yml @@ -27,6 +27,8 @@ registries : services: "UserProvider": + # 鍙互鎸囧畾澶氫釜registry锛屼娇鐢ㄩ€楀彿闅斿紑;涓嶆寚瀹氶粯璁ゅ悜鎵€鏈夋敞鍐屼腑蹇冩敞鍐� + registry: "hangzhouzk" protocol : "dubbo" # 鐩稿綋浜巇ubbo.xml涓殑interface interface : "com.ikurento.user.UserProvider" diff --git a/examples/dubbo/go-server/profiles/test/server.yml b/examples/dubbo/go-server/profiles/test/server.yml index 69d68279d86a2a4dcd5b1ddaa98172a7b1088e57..12f10e004c6b1b5ea1afcf37fe79306bd4d10d82 100644 --- a/examples/dubbo/go-server/profiles/test/server.yml +++ b/examples/dubbo/go-server/profiles/test/server.yml @@ -27,6 +27,8 @@ registries : services: "UserProvider": + # 鍙互鎸囧畾澶氫釜registry锛屼娇鐢ㄩ€楀彿闅斿紑;涓嶆寚瀹氶粯璁ゅ悜鎵€鏈夋敞鍐屼腑蹇冩敞鍐� + registry: "hangzhouzk" protocol : "dubbo" # 鐩稿綋浜巇ubbo.xml涓殑interface interface : "com.ikurento.user.UserProvider" diff --git a/examples/jsonrpc/go-client/profiles/dev/client.yml b/examples/jsonrpc/go-client/profiles/dev/client.yml index 9f0b3ce0aac1663ca077dea9c788e891dc38e82b..8d4346510fac9f7350b3d680b07a3d258b84e521 100644 --- a/examples/jsonrpc/go-client/profiles/dev/client.yml +++ b/examples/jsonrpc/go-client/profiles/dev/client.yml @@ -31,6 +31,8 @@ registries : references: "UserProvider": + # 鍙互鎸囧畾澶氫釜registry锛屼娇鐢ㄩ€楀彿闅斿紑;涓嶆寚瀹氶粯璁ゅ悜鎵€鏈夋敞鍐屼腑蹇冩敞鍐� + registry: "hangzhouzk" protocol : "jsonrpc" # version : "2.0" # group: "as" diff --git a/examples/jsonrpc/go-client/profiles/release/client.yml b/examples/jsonrpc/go-client/profiles/release/client.yml index fa9c87f855004eb24105819918f10e3458c8c50e..3b82dd07bd0b41ace267721d151238c71beaa5a4 100644 --- a/examples/jsonrpc/go-client/profiles/release/client.yml +++ b/examples/jsonrpc/go-client/profiles/release/client.yml @@ -31,6 +31,8 @@ registries : references: "UserProvider": + # 鍙互鎸囧畾澶氫釜registry锛屼娇鐢ㄩ€楀彿闅斿紑;涓嶆寚瀹氶粯璁ゅ悜鎵€鏈夋敞鍐屼腑蹇冩敞鍐� + registry: "hangzhouzk" protocol : "jsonrpc" # version : "2.0" # group: "as" diff --git a/examples/jsonrpc/go-client/profiles/test/client.yml b/examples/jsonrpc/go-client/profiles/test/client.yml index 392b8496f8d6bcc113cdf3372b4943dd6ee7eb85..1b0529c455a9492d68d040632451bd13198552a4 100644 --- a/examples/jsonrpc/go-client/profiles/test/client.yml +++ b/examples/jsonrpc/go-client/profiles/test/client.yml @@ -31,6 +31,8 @@ registries : references: "UserProvider": + # 鍙互鎸囧畾澶氫釜registry锛屼娇鐢ㄩ€楀彿闅斿紑;涓嶆寚瀹氶粯璁ゅ悜鎵€鏈夋敞鍐屼腑蹇冩敞鍐� + registry: "hangzhouzk" protocol : "jsonrpc" # version : "2.0" # group: "as" diff --git a/examples/jsonrpc/go-server/profiles/dev/server.yml b/examples/jsonrpc/go-server/profiles/dev/server.yml index 94e92dcc6523a1485a0b8ec7832fed26627a4cd7..b5384a28a37535bf7493d6ae07166f6da3b4c440 100644 --- a/examples/jsonrpc/go-server/profiles/dev/server.yml +++ b/examples/jsonrpc/go-server/profiles/dev/server.yml @@ -26,8 +26,10 @@ registries : services: "UserProvider": + # 鍙互鎸囧畾澶氫釜registry锛屼娇鐢ㄩ€楀彿闅斿紑;涓嶆寚瀹氶粯璁ゅ悜鎵€鏈夋敞鍐屼腑蹇冩敞鍐� + registry: "hangzhouzk" protocol : "jsonrpc" - # 鐩稿綋浜巇ubbo.xml涓殑interface + # 鐩稿綋浜巇ubbo.xml涓殑interface interface : "com.ikurento.user.UserProvider" loadbalance: "random" warmup: "100" diff --git a/examples/jsonrpc/go-server/profiles/release/server.yml b/examples/jsonrpc/go-server/profiles/release/server.yml index 0b4f441f8cca7b19f11802c04b7640b3c85ddf7d..213d31d53eb2523e2e132810c7435b3696581a31 100644 --- a/examples/jsonrpc/go-server/profiles/release/server.yml +++ b/examples/jsonrpc/go-server/profiles/release/server.yml @@ -26,8 +26,10 @@ registries : services: "UserProvider": + # 鍙互鎸囧畾澶氫釜registry锛屼娇鐢ㄩ€楀彿闅斿紑;涓嶆寚瀹氶粯璁ゅ悜鎵€鏈夋敞鍐屼腑蹇冩敞鍐� + registry: "hangzhouzk" protocol : "jsonrpc" - # 鐩稿綋浜巇ubbo.xml涓殑interface + # 鐩稿綋浜巇ubbo.xml涓殑interface interface : "com.ikurento.user.UserProvider" loadbalance: "random" warmup: "100" @@ -37,7 +39,6 @@ services: retries: 1 loadbalance: "random" - protocols: #- name: "dubbo" # ip : "127.0.0.1" diff --git a/examples/jsonrpc/go-server/profiles/test/server.yml b/examples/jsonrpc/go-server/profiles/test/server.yml index e8d7135a82cdd767f37a20b97bdc86dbe2616072..9b6dcb0b5c4513cf12ec5a505be64be156593c94 100644 --- a/examples/jsonrpc/go-server/profiles/test/server.yml +++ b/examples/jsonrpc/go-server/profiles/test/server.yml @@ -26,8 +26,10 @@ registries : services: "UserProvider": + # 鍙互鎸囧畾澶氫釜registry锛屼娇鐢ㄩ€楀彿闅斿紑;涓嶆寚瀹氶粯璁ゅ悜鎵€鏈夋敞鍐屼腑蹇冩敞鍐� + registry: "hangzhouzk" protocol : "jsonrpc" - # 鐩稿綋浜巇ubbo.xml涓殑interface + # 鐩稿綋浜巇ubbo.xml涓殑interface interface : "com.ikurento.user.UserProvider" loadbalance: "random" warmup: "100"