diff --git a/common/url.go b/common/url.go index 10bbf8ff210d61101a5f64015533cc11c44bee85..9c3f065497f58cdac03f9e3bb57ae5c7f02ae1df 100644 --- a/common/url.go +++ b/common/url.go @@ -25,6 +25,8 @@ import ( "net/url" "strconv" "strings" + + "github.com/apache/dubbo-go/common/logger" ) import ( @@ -177,7 +179,11 @@ func WithToken(token string) option { if len(token) > 0 { value := token if strings.ToLower(token) == "true" || strings.ToLower(token) == "default" { - value = uuid.NewV4().String() + u, err := uuid.NewV4() + if err != nil { + logger.Errorf("could not generator UUID: %v", err) + } + value = u.String() } url.SetParam(constant.TOKEN_KEY, value) } diff --git a/config/base_config.go b/config/base_config.go index f04a09f498133a84be4043aada7c5821dfe98b56..c6bc3543073a628afc8c612a76f46d161865c4f9 100644 --- a/config/base_config.go +++ b/config/base_config.go @@ -43,8 +43,11 @@ type multiConfiger interface { // BaseConfig is the event configuration for provider and consumer type BaseConfig struct { ConfigCenterConfig *ConfigCenterConfig `yaml:"config_center" json:"config_center,omitempty"` + + // since 1.5.0 version Remotes map[string]*RemoteConfig `yaml:"remote" json:"remote,omitempty"` ServiceDiscoveries map[string]*ServiceDiscoveryConfig `yaml:"service_discovery" json:"service_discovery,omitempty"` + MetadataReportConfig *MetadataReportConfig `yaml:"metadata_report" json:"metadata_report,omitempty" property:"metadata_report"` Registry *RegistryConfig `yaml:"registry" json:"registry,omitempty" property:"registry"` Registries map[string]*RegistryConfig `yaml:"registries" json:"registries,omitempty" property:"registries"` diff --git a/config/config_loader.go b/config/config_loader.go index 90eb354cf53fe8009b73f67d35e0827e4b11ecbc..10a3387015144913f5f6b631818d8617d0710d7d 100644 --- a/config/config_loader.go +++ b/config/config_loader.go @@ -146,9 +146,9 @@ func loadConsumerConfig() { checkok = false count++ if count > maxWait { - errMsg := fmt.Sprintf("Failed to check the status of the service %v . No provider available for the service to the consumer use dubbo version %v", refconfig.InterfaceName, constant.Version) - logger.Error(errMsg) - panic(errMsg) + // errMsg := fmt.Sprintf("Failed to check the status of the service %v . No provider available for the service to the consumer use dubbo version %v", refconfig.InterfaceName, constant.Version) + // logger.Error(errMsg) + // panic(errMsg) } time.Sleep(time.Second * 1) break @@ -223,7 +223,7 @@ func Load() { extension.SetAndInitGlobalDispatcher(GetBaseConfig().EventDispatcherType) // start the metadata report if config set - if err := startMetadataReport(GetApplicationConfig().MetadataType, GetProviderConfig().MetadataReportConfig); err != nil { + if err := startMetadataReport(GetApplicationConfig().MetadataType, GetBaseConfig().MetadataReportConfig); err != nil { logger.Errorf("Provider starts metadata report error, and the error is {%#v}", err) return } diff --git a/config/provider_config.go b/config/provider_config.go index 99c532a383ad75285edc7e7200f6edbeac936f9d..c021c9d220c193e7e2338c37f785327700290a84 100644 --- a/config/provider_config.go +++ b/config/provider_config.go @@ -40,8 +40,6 @@ type ProviderConfig struct { BaseConfig `yaml:",inline"` Filter string `yaml:"filter" json:"filter,omitempty" property:"filter"` ProxyFactory string `yaml:"proxy_factory" default:"default" json:"proxy_factory,omitempty" property:"proxy_factory"` - // metadata-report - MetadataReportConfig *MetadataReportConfig `yaml:"metadata_report" json:"metadata_report,omitempty" property:"metadata_report"` Services map[string]*ServiceConfig `yaml:"services" json:"services,omitempty" property:"services"` Protocols map[string]*ProtocolConfig `yaml:"protocols" json:"protocols,omitempty" property:"protocols"` ProtocolConf interface{} `yaml:"protocol_conf" json:"protocol_conf,omitempty" property:"protocol_conf" ` diff --git a/config_center/nacos/impl.go b/config_center/nacos/impl.go index b4a7a5467978404387c0c9667dc308a2e68d59ed..18873f7c4ac2766d53001718521a8fd11cc3bff8 100644 --- a/config_center/nacos/impl.go +++ b/config_center/nacos/impl.go @@ -125,7 +125,7 @@ func (n *nacosDynamicConfiguration) GetConfigKeysByGroup(group string) (*gxset.H return result, perrors.WithMessage(err, "can not find the client config") } for _, itm := range page.PageItems { - result.Add(itm.Appname) + result.Add(itm.DataId) } return result, nil } diff --git a/config_center/nacos/listener.go b/config_center/nacos/listener.go index de74cff8f64683a47278825b670352a04b69b791..fdf5a20d2ff4b97c1e0de40c8b5a0e573214fea4 100644 --- a/config_center/nacos/listener.go +++ b/config_center/nacos/listener.go @@ -46,7 +46,9 @@ func (n *nacosDynamicConfiguration) addListener(key string, listener config_cent go callback(listener, namespace, group, dataId, data) }, }) - logger.Errorf("nacos : listen config fail, error:%v ", err) + if err != nil { + logger.Errorf("nacos : listen config fail, error:%v ", err) + } newListener := make(map[config_center.ConfigurationListener]context.CancelFunc) newListener[listener] = cancel n.keyListeners.Store(key, newListener) diff --git a/go.mod b/go.mod index 0fc3599813b1cb96a5988119d27d4596f115e386..5a7efac66d900d7bcab0256cd927088e2543fd69 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/opentracing/opentracing-go v1.1.0 github.com/pkg/errors v0.9.1 github.com/prometheus/client_golang v1.1.0 - github.com/satori/go.uuid v1.2.0 + github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b github.com/smartystreets/goconvey v0.0.0-20190710185942-9d28bd7c0945 // indirect github.com/soheilhy/cmux v0.1.4 // indirect github.com/stretchr/testify v1.5.1 @@ -56,3 +56,5 @@ require ( ) go 1.13 + +replace github.com/nacos-group/nacos-sdk-go => /Users/mindeng/go-workspace/src/nacos-sdk-go diff --git a/go.sum b/go.sum index a26694e75f08e37ed963831edbd7700f1f773393..65f2b7c7b11a8eef8da5885d6f0f0b742cda9622 100644 --- a/go.sum +++ b/go.sum @@ -459,6 +459,8 @@ github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735 h1:7YvPJVmEeFHR1T github.com/ryanuber/go-glob v0.0.0-20170128012129-256dc444b735/go.mod h1:807d1WSdnB0XRJzKNil9Om6lcp/3a0v4qIHxIXzX/Yc= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b h1:gQZ0qzfKHQIybLANtM3mBXNUtOfsCFXeTsnBqCsx1KM= +github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/shirou/gopsutil v0.0.0-20181107111621-48177ef5f880 h1:1Ge4j/3uB2rxzPWD3TC+daeCw+w91z8UCUL/7WH5gn8= diff --git a/metadata/definition/definition.go b/metadata/definition/definition.go index fa195d09d7efe022be9bdf40658e355a44b8705e..c3b3bd2769ae984112250d3103aebc490e739507 100644 --- a/metadata/definition/definition.go +++ b/metadata/definition/definition.go @@ -97,13 +97,21 @@ func BuildServiceDefinition(service common.Service, url common.URL) *ServiceDefi for k, m := range service.Method() { var paramTypes []string - for _, t := range m.ArgsType() { - paramTypes = append(paramTypes, t.Kind().String()) + if len(m.ArgsType()) > 0 { + for _, t := range m.ArgsType() { + paramTypes = append(paramTypes, t.Kind().String()) + } } + + var returnType string + if m.ReplyType() != nil { + returnType = m.ReplyType().Kind().String() + } + methodD := MethodDefinition{ Name: k, ParameterTypes: paramTypes, - ReturnType: m.ReplyType().Kind().String(), + ReturnType: returnType, } sd.Methods = append(sd.Methods, methodD) } diff --git a/metadata/identifier/service_metadata_identifier.go b/metadata/identifier/service_metadata_identifier.go index 7cdb55e53db6fdc6092f17e2688bf8078559cbec..7a1bc283dcfbcdc978ea9144caf226511df28461 100644 --- a/metadata/identifier/service_metadata_identifier.go +++ b/metadata/identifier/service_metadata_identifier.go @@ -41,7 +41,7 @@ func NewServiceMetadataIdentifier(url common.URL) *ServiceMetadataIdentifier { } } -// GetIdentifierKey will return string format as service:Version:Group:Side:Protocol:"revision"+Revision +// GetIdentifierKey will return string format as service:Version:Group:Side:Protocol:"revision-"+Revision func (mdi *ServiceMetadataIdentifier) GetIdentifierKey() string { return mdi.BaseMetadataIdentifier.getIdentifierKey(mdi.Protocol, constant.KEY_REVISON_PREFIX+mdi.Revision) } diff --git a/metadata/report/delegate/delegate_report.go b/metadata/report/delegate/delegate_report.go index 1ab7e4e7c32c0e987a56069c5a5e25653423466a..a91c973ed07cade931295462407fa87ad9877617 100644 --- a/metadata/report/delegate/delegate_report.go +++ b/metadata/report/delegate/delegate_report.go @@ -268,7 +268,7 @@ func (mr *MetadataReport) doHandlerMetadataCollection(metadataMap map[*identifie } for e := range metadataMap { if common.RoleType(common.PROVIDER).Role() == e.Side { - mr.StoreProviderMetadata(e, metadataMap[e].(*definition.FullServiceDefinition)) + mr.StoreProviderMetadata(e, metadataMap[e].(*definition.ServiceDefinition)) } else if common.RoleType(common.CONSUMER).Role() == e.Side { mr.StoreConsumerMetadata(e, metadataMap[e].(map[string]string)) } diff --git a/metadata/report/nacos/report.go b/metadata/report/nacos/report.go index 6b838187b7b5518296255814c48aaf665540b827..a119e0651fa1e0248b11b2252e36677f90cf1832 100644 --- a/metadata/report/nacos/report.go +++ b/metadata/report/nacos/report.go @@ -51,6 +51,7 @@ type nacosMetadataReport struct { } // StoreProviderMetadata will store the metadata +// metadata including the basic info of the server, provider info, and other user custom info func (n *nacosMetadataReport) StoreProviderMetadata(providerIdentifier *identifier.MetadataIdentifier, serviceDefinitions string) error { return n.storeMetadata(vo.ConfigParam{ DataId: providerIdentifier.GetIdentifierKey(), @@ -60,6 +61,7 @@ func (n *nacosMetadataReport) StoreProviderMetadata(providerIdentifier *identifi } // StoreConsumerMetadata will store the metadata +// metadata including the basic info of the server, consumer info, and other user custom info func (n *nacosMetadataReport) StoreConsumerMetadata(consumerMetadataIdentifier *identifier.MetadataIdentifier, serviceParameterString string) error { return n.storeMetadata(vo.ConfigParam{ DataId: consumerMetadataIdentifier.GetIdentifierKey(), @@ -69,6 +71,7 @@ func (n *nacosMetadataReport) StoreConsumerMetadata(consumerMetadataIdentifier * } // SaveServiceMetadata will store the metadata +// metadata including the basic info of the server, service info, and other user custom info func (n *nacosMetadataReport) SaveServiceMetadata(metadataIdentifier *identifier.ServiceMetadataIdentifier, url common.URL) error { return n.storeMetadata(vo.ConfigParam{ DataId: metadataIdentifier.GetIdentifierKey(), diff --git a/metadata/report/nacos/report_test.go b/metadata/report/nacos/report_test.go index 88aec72a0b3fcefc70bb919345fc93bbf137777e..153242f8e019c04ea3f5ef8e5ed090c1f23e9d41 100644 --- a/metadata/report/nacos/report_test.go +++ b/metadata/report/nacos/report_test.go @@ -20,9 +20,13 @@ package nacos import ( "strconv" "testing" +) +import ( "github.com/stretchr/testify/assert" +) +import ( "github.com/apache/dubbo-go/common" "github.com/apache/dubbo-go/common/constant" "github.com/apache/dubbo-go/common/extension" diff --git a/metadata/service/remote/service.go b/metadata/service/remote/service.go index e1127f72db9d5700616d4daed44fe05909d57082..1915b7be7d5f11429c36ff8bfe99189d0d2acf21 100644 --- a/metadata/service/remote/service.go +++ b/metadata/service/remote/service.go @@ -121,7 +121,8 @@ func (mts *MetadataService) PublishServiceDefinition(url common.URL) error { 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, "test"), + Group: url.GetParam(constant.GROUP_KEY, constant.DUBBO), + Side: url.GetParam(constant.SIDE_KEY, "provider"), }, } mts.delegateReport.StoreProviderMetadata(id, sd) diff --git a/registry/event/protocol_ports_metadata_customizer.go b/registry/event/protocol_ports_metadata_customizer.go index bf16fa8e2fd0a9fc02f377b8ee8c2d8bcca69396..dd7f7678fc7f61bc85866a5642984835c9f91674 100644 --- a/registry/event/protocol_ports_metadata_customizer.go +++ b/registry/event/protocol_ports_metadata_customizer.go @@ -54,7 +54,7 @@ func (p *ProtocolPortsMetadataCustomizer) Customize(instance registry.ServiceIns list, err := metadataService.GetExportedURLs(constant.ANY_VALUE, constant.ANY_VALUE, constant.ANY_VALUE, constant.ANY_VALUE) if err != nil || len(list) == 0 { - logger.Errorf("Could not find exported urls", err) + logger.Debugf("Could not find exported urls", err) return } diff --git a/registry/servicediscovery/service_discovery_registry.go b/registry/servicediscovery/service_discovery_registry.go index 41054824a24ab68fe2d18ac47e03d0e6532aae0f..9a6570f14db9a746db2542e59adf442ce526baa7 100644 --- a/registry/servicediscovery/service_discovery_registry.go +++ b/registry/servicediscovery/service_discovery_registry.go @@ -177,10 +177,17 @@ func (s *serviceDiscoveryRegistry) Register(url common.URL) error { if err != nil { return perrors.WithMessage(err, "could not create servcie instance, please check your service url") } + + err = s.serviceDiscovery.Register(ins) if err != nil { return perrors.WithMessage(err, "register the service failed") } + + err = s.metaDataService.PublishServiceDefinition(url) + if err != nil { + return perrors.WithMessage(err, "publish the service definition failed. ") + } return s.serviceNameMapping.Map(url.GetParam(constant.INTERFACE_KEY, ""), url.GetParam(constant.GROUP_KEY, ""), url.GetParam(constant.Version, ""), diff --git a/remoting/nacos/builder.go b/remoting/nacos/builder.go index 16325f88cc7af959f5a129d158c54cf9db5b81f6..545a1e268cabe5cef829ff1cf44ef40b1161d590 100644 --- a/remoting/nacos/builder.go +++ b/remoting/nacos/builder.go @@ -72,7 +72,10 @@ func getNacosConfig(url *common.URL) (map[string]interface{}, error) { if err != nil { return nil, perrors.WithMessagef(err, "split [%s] ", addr) } - port, _ := strconv.Atoi(portStr) + port, err := strconv.Atoi(portStr) + if err != nil { + return configMap, perrors.WithMessage(err, "the port string is invalid. "+portStr) + } serverConfigs = append(serverConfigs, nacosConstant.ServerConfig{ IpAddr: ip, Port: uint64(port), @@ -80,18 +83,21 @@ func getNacosConfig(url *common.URL) (map[string]interface{}, error) { } configMap["serverConfigs"] = serverConfigs - var clientConfig nacosConstant.ClientConfig timeout, err := time.ParseDuration(url.GetParam(constant.REGISTRY_TIMEOUT_KEY, constant.DEFAULT_REG_TIMEOUT)) if err != nil { return nil, err } - clientConfig.TimeoutMs = uint64(timeout.Seconds() * 1000) - clientConfig.ListenInterval = 2 * clientConfig.TimeoutMs - clientConfig.CacheDir = url.GetParam(constant.NACOS_CACHE_DIR_KEY, "") - clientConfig.LogDir = url.GetParam(constant.NACOS_LOG_DIR_KEY, "") - clientConfig.Endpoint = url.GetParam(constant.NACOS_ENDPOINT, "") - clientConfig.NotLoadCacheAtStart = true - configMap["clientConfig"] = clientConfig + + timeoutMs := uint64(timeout.Nanoseconds() / constant.MsToNanoRate) + + configMap["clientConfig"] = nacosConstant.ClientConfig{ + TimeoutMs: timeoutMs, + ListenInterval: 2 * timeoutMs, + CacheDir: url.GetParam(constant.NACOS_CACHE_DIR_KEY, ""), + LogDir: url.GetParam(constant.NACOS_LOG_DIR_KEY, ""), + Endpoint: url.GetParam(constant.NACOS_ENDPOINT, ""), + NotLoadCacheAtStart: true, + } return configMap, nil } diff --git a/remoting/zookeeper/client.go b/remoting/zookeeper/client.go index 92ea76046f002cbdf6dbe754453ef8ebb4a14de2..f4aea5903d534a008e3c94bb04f127a67988132b 100644 --- a/remoting/zookeeper/client.go +++ b/remoting/zookeeper/client.go @@ -51,7 +51,7 @@ var ( type ZookeeperClient struct { name string ZkAddrs []string - sync.Mutex // for conn + sync.RWMutex // for conn Conn *zk.Conn Timeout time.Duration exit chan struct{} @@ -275,7 +275,7 @@ LOOP: break LOOP case (int)(zk.EventNodeDataChanged), (int)(zk.EventNodeChildrenChanged): logger.Infof("zkClient{%s} get zk node changed event{path:%s}", z.name, event.Path) - z.Lock() + z.RLock() for p, a := range z.eventRegistry { if strings.HasPrefix(p, event.Path) { logger.Infof("send event{state:zk.EventNodeDataChange, Path:%s} notify event to path{%s} related listener", @@ -285,7 +285,7 @@ LOOP: } } } - z.Unlock() + z.RUnlock() case (int)(zk.StateConnecting), (int)(zk.StateConnected), (int)(zk.StateHasSession): if state == (int)(zk.StateHasSession) { continue @@ -368,11 +368,11 @@ func (z *ZookeeperClient) ZkConnValid() bool { } valid := true - z.Lock() + z.RLock() if z.Conn == nil { valid = false } - z.Unlock() + z.RUnlock() return valid } @@ -413,15 +413,15 @@ func (z *ZookeeperClient) CreateWithValue(basePath string, value []byte) error { ) logger.Debugf("zookeeperClient.Create(basePath{%s})", basePath) + conn := z.getConn() + err = errNilZkClientConn + if conn == nil { + return perrors.WithMessagef(err, "zk.Create(path:%s)", basePath) + } + for _, str := range strings.Split(basePath, "/")[1:] { tmpPath = path.Join(tmpPath, "/", str) - err = errNilZkClientConn - z.Lock() - conn := z.Conn - z.Unlock() - if conn != nil { - _, err = conn.Create(tmpPath, value, 0, zk.WorldACL(zk.PermAll)) - } + _, err = conn.Create(tmpPath, value, 0, zk.WorldACL(zk.PermAll)) if err != nil { if err == zk.ErrNodeExists { @@ -443,9 +443,7 @@ func (z *ZookeeperClient) Delete(basePath string) error { ) err = errNilZkClientConn - z.Lock() - conn := z.Conn - z.Unlock() + conn := z.getConn() if conn != nil { err = conn.Delete(basePath, -1) } @@ -465,9 +463,7 @@ func (z *ZookeeperClient) RegisterTemp(basePath string, node string) (string, er err = errNilZkClientConn data = []byte("") zkPath = path.Join(basePath) + "/" + node - z.Lock() - conn := z.Conn - z.Unlock() + conn := z.getConn() if conn != nil { tmpPath, err = conn.Create(zkPath, data, zk.FlagEphemeral, zk.WorldACL(zk.PermAll)) } @@ -490,9 +486,7 @@ func (z *ZookeeperClient) RegisterTempSeq(basePath string, data []byte) (string, ) err = errNilZkClientConn - z.Lock() - conn := z.Conn - z.Unlock() + conn := z.getConn() if conn != nil { tmpPath, err = conn.Create( path.Join(basePath)+"/", @@ -523,9 +517,7 @@ func (z *ZookeeperClient) GetChildrenW(path string) ([]string, <-chan zk.Event, ) err = errNilZkClientConn - z.Lock() - conn := z.Conn - z.Unlock() + conn := z.getConn() if conn != nil { children, stat, watcher, err = conn.ChildrenW(path) } @@ -559,9 +551,7 @@ func (z *ZookeeperClient) GetChildren(path string) ([]string, error) { ) err = errNilZkClientConn - z.Lock() - conn := z.Conn - z.Unlock() + conn := z.getConn() if conn != nil { children, stat, err = conn.Children(path) } @@ -592,9 +582,7 @@ func (z *ZookeeperClient) ExistW(zkPath string) (<-chan zk.Event, error) { ) err = errNilZkClientConn - z.Lock() - conn := z.Conn - z.Unlock() + conn := z.getConn() if conn != nil { exist, _, watcher, err = conn.ExistsW(zkPath) } @@ -615,3 +603,10 @@ func (z *ZookeeperClient) ExistW(zkPath string) (<-chan zk.Event, error) { func (z *ZookeeperClient) GetContent(zkPath string) ([]byte, *zk.Stat, error) { return z.Conn.Get(zkPath) } + +// getConn gets zookeeper connection safely +func (z *ZookeeperClient) getConn() *zk.Conn { + z.RLock() + defer z.RUnlock() + return z.Conn +}