diff --git a/common/extension/metadata_service.go b/common/extension/metadata_service.go
index e35677d148eee121c3a6c018a128b5d372c6f2c7..cf8b286c66e8f229ab03955de44288cb7f2c7fd6 100644
--- a/common/extension/metadata_service.go
+++ b/common/extension/metadata_service.go
@@ -26,12 +26,15 @@ import (
)
import (
+ "github.com/apache/dubbo-go/common/logger"
"github.com/apache/dubbo-go/metadata/service"
)
var (
// there will be two types: local or remote
metadataServiceInsMap = make(map[string]func() (service.MetadataService, error), 2)
+ // remoteMetadataService
+ remoteMetadataService service.MetadataService
)
// SetMetadataService will store the msType => creator pair
@@ -48,3 +51,17 @@ func GetMetadataService(msType string) (service.MetadataService, error) {
"local - github.com/apache/dubbo-go/metadata/service/inmemory, \n"+
"remote - github.com/apache/dubbo-go/metadata/service/remote", msType))
}
+
+// GetRemoteMetadataService will get a RemoteMetadataService instance
+func GetRemoteMetadataService() (service.MetadataService, error) {
+ if remoteMetadataService != nil {
+ return remoteMetadataService, nil
+ }
+ if creator, ok := metadataServiceInsMap["remote"]; ok {
+ var err error
+ remoteMetadataService, err = creator()
+ return remoteMetadataService, err
+ }
+ logger.Info("could not find the metadata service creator for metadataType: remote")
+ return nil, perrors.New(fmt.Sprintf("could not find the metadata service creator for metadataType: remote"))
+}
diff --git a/config/reference_config.go b/config/reference_config.go
index 05df3477362561644a841b147d67a660536ffdbc..f78d45af725b57942a70f4cbaa826342f2a40e06 100644
--- a/config/reference_config.go
+++ b/config/reference_config.go
@@ -164,7 +164,8 @@ func (c *ReferenceConfig) Refer(_ interface{}) {
// FailoverClusterInvoker(RegistryDirectory, routing happens here) -> Invoker
c.invoker = cluster.Join(directory.NewStaticDirectory(invokers))
}
-
+ // publish consumer metadata
+ publishConsumerDefinition(cfgURL)
// create proxy
if c.Async {
callback := GetCallback(c.id)
@@ -248,3 +249,9 @@ func (c *ReferenceConfig) GenericLoad(id string) {
c.Refer(genericService)
c.Implement(genericService)
}
+
+func publishConsumerDefinition(url *common.URL) {
+ if remoteMetadataService, err := extension.GetRemoteMetadataService(); err == nil && remoteMetadataService != nil {
+ remoteMetadataService.PublishServiceDefinition(url)
+ }
+}
diff --git a/config/service_config.go b/config/service_config.go
index 8aa59380ffaa905b799974c6ce296782f386c133..f718b00a7fcefcc74462105e82ca927dd2a1f0e3 100644
--- a/config/service_config.go
+++ b/config/service_config.go
@@ -40,13 +40,10 @@ import (
"github.com/apache/dubbo-go/common/constant"
"github.com/apache/dubbo-go/common/extension"
"github.com/apache/dubbo-go/common/logger"
- "github.com/apache/dubbo-go/metadata/service"
"github.com/apache/dubbo-go/protocol"
"github.com/apache/dubbo-go/protocol/protocolwrapper"
)
-var remoteMetadataService service.MetadataService
-
// ServiceConfig is the configuration of the service provider
type ServiceConfig struct {
context context.Context
@@ -338,15 +335,7 @@ func (c *ServiceConfig) GetExportedUrls() []*common.URL {
}
func publishServiceDefinition(url *common.URL) {
- if remoteMetadataService == nil {
- var err error
- if remoteMetadataService, err = extension.GetMetadataService("remote"); err != nil {
- logger.Warnf("get remote metadataService fail. %v", err)
- return
- } else if remoteMetadataService == nil {
- logger.Info("get remote metadataService will nil.")
- return
- }
+ if remoteMetadataService, err := extension.GetRemoteMetadataService(); err == nil && remoteMetadataService != nil {
+ remoteMetadataService.PublishServiceDefinition(url)
}
- remoteMetadataService.PublishServiceDefinition(url)
}
diff --git a/metadata/report/delegate/delegate_report.go b/metadata/report/delegate/delegate_report.go
index 836a8f9ef4aac23558e44c1c9c5adedd585d6da4..3c345456587324a9eaf896593566f4d4d23f2934 100644
--- a/metadata/report/delegate/delegate_report.go
+++ b/metadata/report/delegate/delegate_report.go
@@ -109,6 +109,10 @@ type MetadataReport struct {
// NewMetadataReport will create a MetadataReport with initiation
func NewMetadataReport() (*MetadataReport, error) {
url := instance.GetMetadataReportUrl()
+ if url == nil {
+ logger.Warn("the metadataReport URL is not configured, you should configure it.")
+ return nil, perrors.New("the metadataReport URL is not configured, you should configure it.")
+ }
bmr := &MetadataReport{
reportUrl: url,
syncReport: url.GetParamBool(constant.SYNC_REPORT_KEY, false),
diff --git a/metadata/service/remote/service.go b/metadata/service/remote/service.go
index efd16bdc6dad555f5a99bc4b2a02ee2a08202537..7e49ee817af6178582c6f9dd570bf1b5ad139e01 100644
--- a/metadata/service/remote/service.go
+++ b/metadata/service/remote/service.go
@@ -114,22 +114,42 @@ func (mts *MetadataService) UnsubscribeURL(url *common.URL) error {
func (mts *MetadataService) PublishServiceDefinition(url *common.URL) error {
interfaceName := url.GetParam(constant.INTERFACE_KEY, "")
isGeneric := url.GetParamBool(constant.GENERIC_KEY, false)
- if len(interfaceName) > 0 && !isGeneric {
- sv := common.ServiceMap.GetServiceByServiceKey(url.Protocol, url.ServiceKey())
- sd := definition.BuildServiceDefinition(*sv, url)
+ if common.RoleType(common.PROVIDER).Role() == url.GetParam(constant.SIDE_KEY, "") {
+ if len(interfaceName) > 0 && !isGeneric {
+ sv := common.ServiceMap.GetServiceByServiceKey(url.Protocol, url.ServiceKey())
+ sd := definition.BuildServiceDefinition(*sv, url)
+ id := &identifier.MetadataIdentifier{
+ BaseMetadataIdentifier: identifier.BaseMetadataIdentifier{
+ ServiceInterface: interfaceName,
+ Version: url.GetParam(constant.VERSION_KEY, ""),
+ // Group: url.GetParam(constant.GROUP_KEY, constant.SERVICE_DISCOVERY_DEFAULT_GROUP),
+ Group: url.GetParam(constant.GROUP_KEY, constant.DUBBO),
+ Side: url.GetParam(constant.SIDE_KEY, "provider"),
+ },
+ }
+ mts.delegateReport.StoreProviderMetadata(id, sd)
+ return nil
+ }
+ logger.Errorf("publishProvider interfaceName is empty . providerUrl:%v ", url)
+ } else {
+ params := make(map[string]string, len(url.GetParams()))
+ url.RangeParams(func(key, value string) bool {
+ params[key] = value
+ return true
+ })
id := &identifier.MetadataIdentifier{
BaseMetadataIdentifier: identifier.BaseMetadataIdentifier{
ServiceInterface: interfaceName,
Version: url.GetParam(constant.VERSION_KEY, ""),
// Group: url.GetParam(constant.GROUP_KEY, constant.SERVICE_DISCOVERY_DEFAULT_GROUP),
Group: url.GetParam(constant.GROUP_KEY, constant.DUBBO),
- Side: url.GetParam(constant.SIDE_KEY, "provider"),
+ Side: url.GetParam(constant.SIDE_KEY, "consumer"),
},
}
- mts.delegateReport.StoreProviderMetadata(id, sd)
+ mts.delegateReport.StoreConsumerMetadata(id, params)
return nil
}
- logger.Errorf("publishProvider interfaceName is empty . providerUrl:%v ", url)
+
return nil
}