diff --git a/common/constant/default.go b/common/constant/default.go index 3c889158e460031f06b9401008c80f55200a46e4..6b9d914c87d3d7c1018647756c59aa874e1d63f1 100644 --- a/common/constant/default.go +++ b/common/constant/default.go @@ -74,3 +74,7 @@ const ( const ( COMMA_SPLIT_PATTERN = "\\s*[,]+\\s*" ) + +const ( + SIMPLE_METADATA_SERVICE_NAME = "MetadataService" +) diff --git a/config/instance/metedata_report.go b/config/instance/metedata_report.go index 70e6ffc23d7b809140154f70045a855f0fb5df47..8e833dd70bcc0db8e65cd8703f2bc1859432a887 100644 --- a/config/instance/metedata_report.go +++ b/config/instance/metedata_report.go @@ -33,20 +33,20 @@ var ( once sync.Once ) -// InitMetadataReportInstance will create the metadata report instance by the specified metadata report url -func InitMetadataReportInstance(url *common.URL) report.MetadataReport { +// GetMetadataReportInstance will return the instance in lazy mode. Be careful the instance create will only +// execute once. +func GetMetadataReportInstance(selectiveUrl ...*common.URL) report.MetadataReport { once.Do(func() { - instance = extension.GetMetadataReportFactory(url.Protocol).CreateMetadataReport(url) - reportUrl = *url + var url *common.URL + if len(selectiveUrl) > 0 { + url = selectiveUrl[0] + instance = extension.GetMetadataReportFactory(url.Protocol).CreateMetadataReport(url) + reportUrl = *url + } }) return instance } -// GetMetadataReportInstance will return the instance -func GetMetadataReportInstance() report.MetadataReport { - return instance -} - // GetMetadataReportUrl will return the report instance url func GetMetadataReportUrl() common.URL { return reportUrl diff --git a/config/metadata_report_config.go b/config/metadata_report_config.go index 95506462a2b6dccfcf270c25db9d19e8bd0a7edb..41fb6b4769e59784d8d18c3f82b956fd029d4ff7 100644 --- a/config/metadata_report_config.go +++ b/config/metadata_report_config.go @@ -101,7 +101,7 @@ func startMetadataReport(metadataType string, metadataReportConfig *MetadataRepo } if url, err := metadataReportConfig.ToUrl(); err == nil { - instance.InitMetadataReportInstance(url) + instance.GetMetadataReportInstance(url) } else { return perrors.New("MetadataConfig is invalid!") } diff --git a/go.mod b/go.mod index 5de123bdb38b69f14ece848a9fb6453bccdb3241..ba3cf3e2190de476592278c13ba09c9adaaf947d 100644 --- a/go.mod +++ b/go.mod @@ -14,9 +14,7 @@ require ( github.com/dubbogo/go-zookeeper v1.0.0 github.com/dubbogo/gost v1.9.0 github.com/emicklei/go-restful/v3 v3.0.0 - github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 // indirect github.com/go-co-op/gocron v0.1.1 - github.com/go-errors/errors v1.0.1 // indirect github.com/go-resty/resty/v2 v2.1.0 github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 // indirect github.com/golang/mock v1.3.1 diff --git a/go.sum b/go.sum index 5e07006205d6403c67a2595a502a523642159a01..eb84bde1fb26d84ff5a3a3e36ebe178a63cfb4c9 100644 --- a/go.sum +++ b/go.sum @@ -35,11 +35,8 @@ github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 h1:rFw4nCn9iMW+Vaj github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190802083043-4cd0c391755e h1:MSuLXx/mveDbpDNhVrcWTMeV4lbYWKcyO4rH+jAxmX0= -github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190802083043-4cd0c391755e/go.mod h1:myCDvQSzCW+wB1WAlocEru4wMGJxy+vlxHdhegi1CDQ= github.com/aliyun/alibaba-cloud-sdk-go v1.61.18 h1:zOVTBdCKFd9JbCKz9/nt+FovbjPFmb7mUnp8nH9fQBA= github.com/aliyun/alibaba-cloud-sdk-go v1.61.18/go.mod h1:v8ESoHo4SyHmuB4b1tJqDHxfTGEciD+yhvOU/5s1Rfk= -github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190307165228-86c17b95fcd5/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= github.com/apache/dubbo-go-hessian2 v1.5.0 h1:fzulDG5G7nX0ccgKdiN9XipJ7tZ4WXKgmk4stdlDS6s= github.com/apache/dubbo-go-hessian2 v1.5.0/go.mod h1:VwEnsOMidkM1usya2uPfGpSLO9XUF//WQcWn3y+jFz8= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e h1:QEF07wC0T1rKkctt1RINW/+RMTVmiwxETico2l3gxJA= @@ -53,7 +50,6 @@ github.com/asaskevich/govalidator v0.0.0-20180319081651-7d2e70ef918f h1:/8NcnxL6 github.com/asaskevich/govalidator v0.0.0-20180319081651-7d2e70ef918f/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/aws/aws-sdk-go v1.15.24 h1:xLAdTA/ore6xdPAljzZRed7IGqQgC+nY+ERS5vaj4Ro= github.com/aws/aws-sdk-go v1.15.24/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= -github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -392,8 +388,6 @@ github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/nacos-group/nacos-sdk-go v0.0.0-20191128082542-fe1b325b125c h1:WoCa3AvgQMVKNs+RIFlWPRgY9QVJwUxJDrGxHs0fcRo= -github.com/nacos-group/nacos-sdk-go v0.0.0-20191128082542-fe1b325b125c/go.mod h1:CEkSvEpoveoYjA81m4HNeYQ0sge0LFGKSEqO3JKHllo= github.com/nacos-group/nacos-sdk-go v0.3.1 h1:MI7bNDAN5m9UFcRRUTSPfJi4dCQo+TYG85qVB1rCHeg= github.com/nacos-group/nacos-sdk-go v0.3.1/go.mod h1:ESKb6yF0gxSc8GuS+0jaMBe+n8rJ5/k4ya6LyFG2xi8= github.com/nicolai86/scaleway-sdk v1.10.2-0.20180628010248-798f60e20bb2 h1:BQ1HW7hr4IVovMwWg0E0PYcyW8CzqDcVmaew9cujU4s= diff --git a/metadata/definition/definition.go b/metadata/definition/definition.go index 18578cb2c18a162dbd4c96fe3b7ece6dbba486d1..11e137a14be574f0607f146def873552ebf1a501 100644 --- a/metadata/definition/definition.go +++ b/metadata/definition/definition.go @@ -21,6 +21,7 @@ import ( "bytes" "encoding/json" "fmt" + "strings" ) import ( @@ -43,29 +44,26 @@ type ServiceDefinition struct { func (def ServiceDefinition) ToBytes() ([]byte, error) { return json.Marshal(def) - } func (def ServiceDefinition) String() string { - var methodStr string + var methodStr strings.Builder for _, m := range def.Methods { - var paramType string + var paramType strings.Builder for _, p := range m.ParameterTypes { - paramType = paramType + fmt.Sprintf("{type:%v}", p) + paramType.WriteString(fmt.Sprintf("{type:%v}", p)) } - var param string + var param strings.Builder for _, d := range m.Parameters { - param = param + fmt.Sprintf("{id:%v,type:%v,builderName:%v}", d.Id, d.Type, d.TypeBuilderName) + param.WriteString(fmt.Sprintf("{id:%v,type:%v,builderName:%v}", d.Id, d.Type, d.TypeBuilderName)) } - methodStr = methodStr + fmt.Sprintf("{name:%v,parameterTypes:[%v],returnType:%v,params:[%v] }", m.Name, paramType, m.ReturnType, param) - + methodStr.WriteString(fmt.Sprintf("{name:%v,parameterTypes:[%v],returnType:%v,params:[%v] }", m.Name, paramType.String(), m.ReturnType, param.String())) } - var types string + var types strings.Builder for _, d := range def.Types { - types = types + fmt.Sprintf("{id:%v,type:%v,builderName:%v}", d.Id, d.Type, d.TypeBuilderName) + types.WriteString(fmt.Sprintf("{id:%v,type:%v,builderName:%v}", d.Id, d.Type, d.TypeBuilderName)) } - - return fmt.Sprintf("{canonicalName:%v, codeSource:%v, methods:[%v], types:[%v]}", def.CanonicalName, def.CodeSource, methodStr, types) + return fmt.Sprintf("{canonicalName:%v, codeSource:%v, methods:[%v], types:[%v]}", def.CanonicalName, def.CodeSource, methodStr.String(), types.String()) } // FullServiceDefinition is the describer of service definition with parameters diff --git a/metadata/report/delegate/delegate_report.go b/metadata/report/delegate/delegate_report.go index 870625b9cb5aaeaea5cfa042d98fecf47e3756d2..a363047988458fd09abf63956f6157dc91a69633 100644 --- a/metadata/report/delegate/delegate_report.go +++ b/metadata/report/delegate/delegate_report.go @@ -202,7 +202,6 @@ func (bmr *MetadataReport) storeMetadataTask(role int, identifier *identifier.Me logger.Errorf("storeProviderMetadataTask error in stage call metadata report to StoreProviderMetadata, msg is %v", err) panic(err) } - } // StoreConsumerMetadata will delegate to call remote metadata's sdk to store consumer side service definition diff --git a/metadata/report/delegate/delegate_report_test.go b/metadata/report/delegate/delegate_report_test.go index b5f8551a1a34ad97b5d46d156cd978d8ceb82d8e..0e8da607004e213e9bc0220a97af1664f5e431e2 100644 --- a/metadata/report/delegate/delegate_report_test.go +++ b/metadata/report/delegate/delegate_report_test.go @@ -25,6 +25,7 @@ import ( import ( "github.com/stretchr/testify/assert" + "go.uber.org/atomic" ) import ( @@ -37,10 +38,10 @@ import ( ) func TestMetadataReport_MetadataReportRetry(t *testing.T) { - counter := 1 + counter := atomic.NewInt64(1) retry, err := newMetadataReportRetry(1, 10, func() bool { - counter++ + counter.Add(1) return true }) assert.NoError(t, err) @@ -49,16 +50,16 @@ func TestMetadataReport_MetadataReportRetry(t *testing.T) { select { case <-itsTime: retry.scheduler.Clear() - assert.Equal(t, counter, 3) + assert.Equal(t, counter.Load(), int64(3)) logger.Info("over") } } func TestMetadataReport_MetadataReportRetryWithLimit(t *testing.T) { - counter := 1 + counter := atomic.NewInt64(1) retry, err := newMetadataReportRetry(1, 1, func() bool { - counter++ + counter.Add(1) return true }) assert.NoError(t, err) @@ -67,10 +68,9 @@ func TestMetadataReport_MetadataReportRetryWithLimit(t *testing.T) { select { case <-itsTime: retry.scheduler.Clear() - assert.Equal(t, counter, 2) + assert.Equal(t, counter.Load(), int64(2)) logger.Info("over") } - } func mockNewMetadataReport(t *testing.T) *MetadataReport { diff --git a/metadata/service/exporter/configurable/exporter.go b/metadata/service/exporter/configurable/exporter.go index 3d12e0ecd4def4b9d99f346a4f556fc3d781d1b2..ec3f8ec2d0a6f5baacfe962d06fe50fcf634a981 100644 --- a/metadata/service/exporter/configurable/exporter.go +++ b/metadata/service/exporter/configurable/exporter.go @@ -49,7 +49,7 @@ func NewMetadataServiceExporter(metadataService service.MetadataService) exporte func (exporter *MetadataServiceExporter) Export() error { if !exporter.IsExported() { - serviceConfig := config.NewServiceConfig("MetadataService", context.Background()) + serviceConfig := config.NewServiceConfig(constant.SIMPLE_METADATA_SERVICE_NAME, context.Background()) serviceConfig.Protocol = constant.DEFAULT_PROTOCOL serviceConfig.Protocols = map[string]*config.ProtocolConfig{ constant.DEFAULT_PROTOCOL: generateMetadataProtocol(), diff --git a/metadata/service/inmemory/service.go b/metadata/service/inmemory/service.go index df0ec7a4a79fe33cced839a8470982e799854c25..4b6f4330a1b88ecaad094df052bb7b53a96c6413 100644 --- a/metadata/service/inmemory/service.go +++ b/metadata/service/inmemory/service.go @@ -33,6 +33,9 @@ import ( "github.com/apache/dubbo-go/metadata/service" ) +// version will be used by Version func +const version = "1.0.0" + // MetadataService is store and query the metadata info in memory when each service registry type MetadataService struct { service.BaseMetadataService @@ -118,7 +121,7 @@ func (mts *MetadataService) getAllService(services *sync.Map) *skip.SkipList { urls := value.(*skip.SkipList) for i := uint64(0); i < urls.Len(); i++ { url := common.URL(urls.ByPosition(i).(Comparator)) - if url.GetParam(constant.INTERFACE_KEY, url.Path) != "MetadataService" { + if url.GetParam(constant.INTERFACE_KEY, url.Path) != constant.SIMPLE_METADATA_SERVICE_NAME { skipList.Insert(Comparator(url)) } } @@ -227,5 +230,5 @@ func (mts *MetadataService) RefreshMetadata(exportedRevision string, subscribedR // Version will return the version of metadata service func (mts *MetadataService) Version() string { - return "1.0.0" + return version } diff --git a/metadata/service/remote/service.go b/metadata/service/remote/service.go index 706f2f919c851dc1eaf6a6345b9f2865e4490ed1..f4587638ef45d414f9b74007720cf7a628624415 100644 --- a/metadata/service/remote/service.go +++ b/metadata/service/remote/service.go @@ -34,6 +34,9 @@ import ( "github.com/apache/dubbo-go/metadata/service/inmemory" ) +// version will be used by Version func +const version = "1.0.0" + // MetadataService is a implement of metadata service which will delegate the remote metadata report type MetadataService struct { service.BaseMetadataService @@ -145,7 +148,6 @@ func (mts *MetadataService) RefreshMetadata(exportedRevision string, subscribedR logger.Errorf("Error occur when execute remote.MetadataService.RefreshMetadata, error message is %v", err) result = false } - } } @@ -174,7 +176,7 @@ func (mts *MetadataService) RefreshMetadata(exportedRevision string, subscribedR // Version will return the remote service version func (MetadataService) Version() string { - return "1.0.0" + return version } // convertUrls will convert the skip list to slice diff --git a/metadata/service/remote/service_test.go b/metadata/service/remote/service_test.go index 05378cb8b1172078d258b7a5ee5ece47a677054c..308c631e413be9c3c6735f31c56da2e8f0697333 100644 --- a/metadata/service/remote/service_test.go +++ b/metadata/service/remote/service_test.go @@ -96,7 +96,7 @@ func TestMetadataService(t *testing.T) { u, err := common.NewURL(fmt.Sprintf( "mock://127.0.0.1:20000/?sync.report=true")) assert.NoError(t, err) - instance.InitMetadataReportInstance(&u) + instance.GetMetadataReportInstance(&u) mts, err := NewMetadataService() assert.NoError(t, err) mts.setInMemoryMetadataService(mockInmemoryProc(t)) diff --git a/metadata/service/service.go b/metadata/service/service.go index a1b812c0ac4d3bff5a097e91900878afdbb32dfc..13464087ed83a79064410e5b37cde79e09317c38 100644 --- a/metadata/service/service.go +++ b/metadata/service/service.go @@ -23,6 +23,7 @@ import ( import ( "github.com/apache/dubbo-go/common" + "github.com/apache/dubbo-go/common/constant" "github.com/apache/dubbo-go/config" ) @@ -66,5 +67,5 @@ func (mts *BaseMetadataService) ServiceName() (string, error) { // Version will return the version of metadata service func (mts *BaseMetadataService) Reference() string { - return "MetadataService" + return constant.SIMPLE_METADATA_SERVICE_NAME }