This is an automated email from the ASF dual-hosted git repository.

alexstocks pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git


The following commit(s) were added to refs/heads/3.0 by this push:
     new 75fc696  Nacos client (#1255)
75fc696 is described below

commit 75fc69650a261b9573fe61be387bb3c92d084fce
Author: 赵云兴 <[email protected]>
AuthorDate: Mon Jun 14 15:35:31 2021 +0800

    Nacos client (#1255)
    
    * build(deps): bump actions/cache from v2.1.4 to v2.1.5
    
    Bumps [actions/cache](https://github.com/actions/cache) from v2.1.4 to 
v2.1.5.
    - [Release notes](https://github.com/actions/cache/releases)
    - 
[Commits](https://github.com/actions/cache/compare/v2.1.4...1a9e2138d905efd099035b49d8b7a3888c653ca8)
    
    Signed-off-by: dependabot[bot] <[email protected]>
    
    * improve etcd version and change create to put (#1203)
    
    * up:remoting nacos
    
    * add:nacos service discovery
    
    * up:设置默认值
    
    * up:nacos registroy client
    
    * up:nacon config client
    
    * up:go fmt
    
    * up:nacos config client
    
    * up:test
    
    * up:修改初æ测试方法
    
    * up:fmt
    
    * up:triple version
    
    * up:修改配置操作
    
    Co-authored-by: dependabot[bot] 
<49699333+dependabot[bot]@users.noreply.github.com>
    Co-authored-by: Xin.Zh <[email protected]>
    Co-authored-by: AlexStocks <[email protected]>
    Co-authored-by: randy <[email protected]>
---
 config_center/nacos/client.go            | 112 +++++++------------------------
 config_center/nacos/client_test.go       |  49 ++++++--------
 config_center/nacos/facade.go            |  54 ++-------------
 config_center/nacos/impl.go              |  31 ++++-----
 config_center/nacos/impl_test.go         | 112 +++++++------------------------
 config_center/nacos/listener.go          |   2 +-
 metadata/report/nacos/report.go          |  12 ++--
 registry/nacos/listener.go               |  17 +++--
 registry/nacos/registry.go               |  73 ++------------------
 registry/nacos/registry_test.go          |  11 +--
 registry/nacos/service_discovery.go      |  33 +++++----
 registry/nacos/service_discovery_test.go |   5 +-
 remoting/nacos/builder.go                | 104 ++++++++++++++++------------
 remoting/nacos/builder_test.go           |  46 +++++++++++++
 14 files changed, 243 insertions(+), 418 deletions(-)

diff --git a/config_center/nacos/client.go b/config_center/nacos/client.go
index c26717f..f53c629 100644
--- a/config_center/nacos/client.go
+++ b/config_center/nacos/client.go
@@ -18,46 +18,43 @@
 package nacos
 
 import (
-       "strconv"
        "strings"
        "sync"
        "time"
 )
 
 import (
-       "github.com/nacos-group/nacos-sdk-go/clients"
-       "github.com/nacos-group/nacos-sdk-go/clients/config_client"
-       nacosconst "github.com/nacos-group/nacos-sdk-go/common/constant"
+       nacosClient "github.com/dubbogo/gost/database/kv/nacos"
        perrors "github.com/pkg/errors"
 )
 
 import (
-       "dubbo.apache.org/dubbo-go/v3/common"
        "dubbo.apache.org/dubbo-go/v3/common/constant"
        "dubbo.apache.org/dubbo-go/v3/common/logger"
+       "dubbo.apache.org/dubbo-go/v3/remoting/nacos"
 )
 
-// NacosClient Nacos client
+// NacosClient Nacos configClient
 type NacosClient struct {
-       name       string
-       NacosAddrs []string
-       sync.Mutex // for Client
-       client     *config_client.IConfigClient
-       exit       chan struct{}
-       Timeout    time.Duration
-       once       sync.Once
-       onceClose  func()
+       name         string
+       NacosAddrs   []string
+       sync.Mutex   // for Client
+       configClient *nacosClient.NacosConfigClient
+       exit         chan struct{}
+       Timeout      time.Duration
+       once         sync.Once
+       onceClose    func()
 }
 
 // Client Get Client
-func (n *NacosClient) Client() *config_client.IConfigClient {
-       return n.client
+func (n *NacosClient) Client() *nacosClient.NacosConfigClient {
+       return n.configClient
 }
 
-// SetClient Set client
-func (n *NacosClient) SetClient(client *config_client.IConfigClient) {
+// SetClient Set configClient
+func (n *NacosClient) SetClient(configClient *nacosClient.NacosConfigClient) {
        n.Lock()
-       n.client = client
+       n.configClient = configClient
        n.Unlock()
 }
 
@@ -65,7 +62,7 @@ type option func(*options)
 
 type options struct {
        nacosName string
-       // client    *NacosClient
+       // configClient    *NacosClient
 }
 
 // WithNacosName Set nacos name
@@ -75,7 +72,7 @@ func WithNacosName(name string) option {
        }
 }
 
-// ValidateNacosClient Validate nacos client , if null then create it
+// ValidateNacosClient Validate nacos configClient , if null then create it
 func ValidateNacosClient(container nacosClientFacade, opts ...option) error {
        if container == nil {
                return perrors.Errorf("container can not be null")
@@ -95,7 +92,7 @@ func ValidateNacosClient(container nacosClientFacade, opts 
...option) error {
        nacosAddresses := strings.Split(url.Location, ",")
        if container.NacosClient() == nil {
                // in dubbo ,every registry only connect one node ,so this is 
[]string{r.Address}
-               newClient, err := newNacosClient(os.nacosName, nacosAddresses, 
timeout, url)
+               newClient, err := nacos.NewNacosConfigClientByUrl(url)
                if err != nil {
                        logger.Errorf("newNacosClient(name{%s}, nacos 
address{%v}, timeout{%d}) = error{%v}",
                                os.nacosName, url.Location, timeout.String(), 
err)
@@ -105,79 +102,18 @@ func ValidateNacosClient(container nacosClientFacade, 
opts ...option) error {
        }
 
        if container.NacosClient().Client() == nil {
-               configClient, err := initNacosConfigClient(nacosAddresses, 
timeout, url)
+               configClient, err := nacos.NewNacosConfigClientByUrl(url)
                if err != nil {
                        
logger.Errorf("initNacosConfigClient(addr:%+v,timeout:%v,url:%v) = err %+v",
                                nacosAddresses, timeout.String(), url, err)
                        return perrors.WithMessagef(err, 
"newNacosClient(address:%+v)", url.Location)
                }
-               container.NacosClient().SetClient(&configClient)
-
+               container.NacosClient().SetClient(configClient.Client())
        }
-
        return perrors.WithMessagef(nil, "newNacosClient(address:%+v)", 
url.PrimitiveURL)
 }
 
-func newNacosClient(name string, nacosAddrs []string, timeout time.Duration, 
url *common.URL) (*NacosClient, error) {
-       var (
-               err error
-               n   *NacosClient
-       )
-
-       n = &NacosClient{
-               name:       name,
-               NacosAddrs: nacosAddrs,
-               Timeout:    timeout,
-               exit:       make(chan struct{}),
-               onceClose: func() {
-                       close(n.exit)
-               },
-       }
-
-       configClient, err := initNacosConfigClient(nacosAddrs, timeout, url)
-       if err != nil {
-               
logger.Errorf("initNacosConfigClient(addr:%+v,timeout:%v,url:%v) = err %+v",
-                       nacosAddrs, timeout.String(), url, err)
-               return n, perrors.WithMessagef(err, 
"newNacosClient(address:%+v)", url.Location)
-       }
-       n.SetClient(&configClient)
-
-       return n, nil
-}
-
-func initNacosConfigClient(nacosAddrs []string, timeout time.Duration, url 
*common.URL) (config_client.IConfigClient, error) {
-       var svrConfList []nacosconst.ServerConfig
-       for _, nacosAddr := range nacosAddrs {
-               split := strings.Split(nacosAddr, ":")
-               port, err := strconv.ParseUint(split[1], 10, 64)
-               if err != nil {
-                       logger.Errorf("strconv.ParseUint(nacos addr port:%+v) = 
error %+v", split[1], err)
-                       continue
-               }
-               svrconf := nacosconst.ServerConfig{
-                       IpAddr: split[0],
-                       Port:   port,
-               }
-               svrConfList = append(svrConfList, svrconf)
-       }
-
-       return clients.CreateConfigClient(map[string]interface{}{
-               "serverConfigs": svrConfList,
-               "clientConfig": nacosconst.ClientConfig{
-                       TimeoutMs:           uint64(int32(timeout / 
time.Millisecond)),
-                       ListenInterval:      uint64(int32(timeout / 
time.Millisecond)),
-                       NotLoadCacheAtStart: true,
-                       LogDir:              
url.GetParam(constant.NACOS_LOG_DIR_KEY, ""),
-                       CacheDir:            
url.GetParam(constant.NACOS_CACHE_DIR_KEY, ""),
-                       Endpoint:            
url.GetParam(constant.NACOS_ENDPOINT, ""),
-                       Username:            
url.GetParam(constant.NACOS_USERNAME, ""),
-                       Password:            
url.GetParam(constant.NACOS_PASSWORD, ""),
-                       NamespaceId:         
url.GetParam(constant.NACOS_NAMESPACE_ID, ""),
-               },
-       })
-}
-
-// Done Get nacos client exit signal
+// Done Get nacos configClient exit signal
 func (n *NacosClient) Done() <-chan struct{} {
        return n.exit
 }
@@ -193,7 +129,7 @@ func (n *NacosClient) stop() bool {
        return false
 }
 
-// NacosClientValid Get nacos client valid status
+// NacosClientValid Get nacos configClient valid status
 func (n *NacosClient) NacosClientValid() bool {
        select {
        case <-n.exit:
@@ -211,7 +147,7 @@ func (n *NacosClient) NacosClientValid() bool {
        return valid
 }
 
-// Close Close nacos client , then set null
+// Close Close nacos configClient , then set null
 func (n *NacosClient) Close() {
        if n == nil {
                return
diff --git a/config_center/nacos/client_test.go 
b/config_center/nacos/client_test.go
index 3ae19f6..458f2d9 100644
--- a/config_center/nacos/client_test.go
+++ b/config_center/nacos/client_test.go
@@ -18,7 +18,6 @@
 package nacos
 
 import (
-       "strings"
        "testing"
        "time"
 )
@@ -32,9 +31,10 @@ import (
 )
 
 func TestNewNacosClient(t *testing.T) {
-       server := mockCommonNacosServer()
-       nacosURL := strings.ReplaceAll(server.URL, "http", "registry")
+
+       nacosURL := "registry://127.0.0.1:8848"
        registryUrl, _ := common.NewURL(nacosURL)
+
        c := &nacosDynamicConfiguration{
                url:  registryUrl,
                done: make(chan struct{}),
@@ -44,52 +44,41 @@ func TestNewNacosClient(t *testing.T) {
        c.wg.Add(1)
        go HandleClientRestart(c)
        go func() {
-               // c.client.Close() and <-c.client.Done() have order 
requirements.
-               // If c.client.Close() is called first.It is possible that "go 
HandleClientRestart(c)"
-               // sets c.client to nil before calling c.client.Done().
+               // c.configClient.Close() and <-c.configClient.Done() have 
order requirements.
+               // If c.configClient.Close() is called first.It is possible 
that "go HandleClientRestart(c)"
+               // sets c.configClient to nil before calling 
c.configClient.Done().
                time.Sleep(time.Second)
                c.client.Close()
        }()
-       <-c.client.Done()
+       //<-c.client.Done()
        c.Destroy()
 }
 
 func TestSetNacosClient(t *testing.T) {
-       server := mockCommonNacosServer()
-       nacosURL := "registry://" + server.Listener.Addr().String()
+       nacosURL := "registry://127.0.0.1:8848"
        registryUrl, _ := common.NewURL(nacosURL)
+
        c := &nacosDynamicConfiguration{
                url:  registryUrl,
                done: make(chan struct{}),
        }
-       var client *NacosClient
-       client = &NacosClient{
-               name:       nacosClientName,
-               NacosAddrs: []string{nacosURL},
-               Timeout:    15 * time.Second,
-               exit:       make(chan struct{}),
-               onceClose: func() {
-                       close(client.exit)
-               },
-       }
-       c.SetNacosClient(client)
+
        err := ValidateNacosClient(c, WithNacosName(nacosClientName))
        assert.NoError(t, err)
        c.wg.Add(1)
        go HandleClientRestart(c)
        go func() {
-               // c.client.Close() and <-c.client.Done() have order 
requirements.
-               // If c.client.Close() is called first.It is possible that "go 
HandleClientRestart(c)"
-               // sets c.client to nil before calling c.client.Done().
+               // c.configClient.Close() and <-c.configClient.Done() have 
order requirements.
+               // If c.configClient.Close() is called first.It is possible 
that "go HandleClientRestart(c)"
+               // sets c.configClient to nil before calling 
c.configClient.Done().
                time.Sleep(time.Second)
                c.client.Close()
        }()
-       <-c.client.Done()
        c.Destroy()
 }
 
 func TestNewNacosClient_connectError(t *testing.T) {
-       nacosURL := "registry://127.0.0.1:8888"
+       nacosURL := "registry://127.0.0.1:8848"
        registryUrl, err := common.NewURL(nacosURL)
        assert.NoError(t, err)
        c := &nacosDynamicConfiguration{
@@ -101,14 +90,14 @@ func TestNewNacosClient_connectError(t *testing.T) {
        c.wg.Add(1)
        go HandleClientRestart(c)
        go func() {
-               // c.client.Close() and <-c.client.Done() have order 
requirements.
-               // If c.client.Close() is called first.It is possible that "go 
HandleClientRestart(c)"
-               // sets c.client to nil before calling c.client.Done().
+               // c.configClient.Close() and <-c.configClient.Done() have 
order requirements.
+               // If c.configClient.Close() is called first.It is possible 
that "go HandleClientRestart(c)"
+               // sets c.configClient to nil before calling 
c.configClient.Done().
                time.Sleep(time.Second)
                c.client.Close()
        }()
-       <-c.client.Done()
-       // let client do retry
+       // <-c.client.Done()
+       // let configClient do retry
        time.Sleep(5 * time.Second)
        c.Destroy()
 }
diff --git a/config_center/nacos/facade.go b/config_center/nacos/facade.go
index 298bef9..6141e1e 100644
--- a/config_center/nacos/facade.go
+++ b/config_center/nacos/facade.go
@@ -19,12 +19,10 @@ package nacos
 
 import (
        "sync"
-       "time"
 )
 
 import (
-       "github.com/apache/dubbo-getty"
-       perrors "github.com/pkg/errors"
+       nacosClient "github.com/dubbogo/gost/database/kv/nacos"
 )
 
 import (
@@ -32,62 +30,24 @@ import (
        "dubbo.apache.org/dubbo-go/v3/common/logger"
 )
 
-const (
-       connDelay    = 3
-       maxFailTimes = 15
-)
-
 type nacosClientFacade interface {
-       NacosClient() *NacosClient
-       SetNacosClient(*NacosClient)
-       // WaitGroup for wait group control, zk client listener & zk client 
container
+       NacosClient() *nacosClient.NacosConfigClient
+       SetNacosClient(*nacosClient.NacosConfigClient)
+       // WaitGroup for wait group control, zk configClient listener & zk 
configClient container
        WaitGroup() *sync.WaitGroup
-       // GetDone For nacos client control     RestartCallBack() bool
+       // GetDone For nacos configClient control       RestartCallBack() bool
        GetDone() chan struct{}
        common.Node
 }
 
-// HandleClientRestart Restart client handler
+// HandleClientRestart Restart configClient handler
 func HandleClientRestart(r nacosClientFacade) {
-       var (
-               err       error
-               failTimes int
-       )
-
        defer r.WaitGroup().Done()
-LOOP:
        for {
                select {
                case <-r.GetDone():
                        
logger.Warnf("(NacosProviderRegistry)reconnectNacosRegistry goroutine exit 
now...")
-                       break LOOP
-                       // re-register all services
-               case <-r.NacosClient().Done():
-                       r.NacosClient().Close()
-                       nacosName := r.NacosClient().name
-                       nacosAddress := r.NacosClient().NacosAddrs
-                       r.SetNacosClient(nil)
-
-                       // Connect nacos until success.
-                       failTimes = 0
-                       for {
-                               select {
-                               case <-r.GetDone():
-                                       
logger.Warnf("(NacosProviderRegistry)reconnectZkRegistry goroutine exit now...")
-                                       break LOOP
-                               case 
<-getty.GetTimeWheel().After(time.Duration(failTimes*connDelay) * time.Second): 
// Prevent crazy reconnection nacos.
-                               }
-                               err = ValidateNacosClient(r, 
WithNacosName(nacosName))
-                               
logger.Infof("NacosProviderRegistry.validateNacosClient(nacosAddr{%s}) = 
error{%#v}",
-                                       nacosAddress, perrors.WithStack(err))
-                               if err == nil {
-                                       break
-                               }
-                               failTimes++
-                               if maxFailTimes <= failTimes {
-                                       failTimes = maxFailTimes
-                               }
-                       }
+                       return
                }
        }
 }
diff --git a/config_center/nacos/impl.go b/config_center/nacos/impl.go
index 6085ed0..50e1094 100644
--- a/config_center/nacos/impl.go
+++ b/config_center/nacos/impl.go
@@ -24,6 +24,7 @@ import (
 
 import (
        gxset "github.com/dubbogo/gost/container/set"
+       nacosClient "github.com/dubbogo/gost/database/kv/nacos"
        "github.com/nacos-group/nacos-sdk-go/vo"
        perrors "github.com/pkg/errors"
 )
@@ -53,7 +54,7 @@ type nacosDynamicConfiguration struct {
        wg           sync.WaitGroup
        cltLock      sync.Mutex
        done         chan struct{}
-       client       *NacosClient
+       client       *nacosClient.NacosConfigClient
        keyListeners sync.Map
        parser       parser.ConfigurationParser
 }
@@ -66,7 +67,7 @@ func newNacosDynamicConfiguration(url *common.URL) 
(*nacosDynamicConfiguration,
        }
        err := ValidateNacosClient(c, WithNacosName(nacosClientName))
        if err != nil {
-               logger.Errorf("nacos client start error ,error message is %v", 
err)
+               logger.Errorf("nacos configClient start error ,error message is 
%v", err)
                return nil, err
        }
        c.wg.Add(1)
@@ -98,7 +99,7 @@ func (n *nacosDynamicConfiguration) GetInternalProperty(key 
string, opts ...conf
 func (n *nacosDynamicConfiguration) PublishConfig(key string, group string, 
value string) error {
        group = n.resolvedGroup(group)
 
-       ok, err := (*n.client.Client()).PublishConfig(vo.ConfigParam{
+       ok, err := n.client.Client().PublishConfig(vo.ConfigParam{
                DataId:  key,
                Group:   group,
                Content: value,
@@ -115,7 +116,7 @@ func (n *nacosDynamicConfiguration) PublishConfig(key 
string, group string, valu
 // GetConfigKeysByGroup will return all keys with the group
 func (n *nacosDynamicConfiguration) GetConfigKeysByGroup(group string) 
(*gxset.HashSet, error) {
        group = n.resolvedGroup(group)
-       page, err := (*n.client.Client()).SearchConfig(vo.SearchConfigParam{
+       page, err := n.client.Client().SearchConfig(vo.SearchConfigParam{
                Search: "accurate",
                Group:  group,
                PageNo: 1,
@@ -125,7 +126,7 @@ func (n *nacosDynamicConfiguration) 
GetConfigKeysByGroup(group string) (*gxset.H
 
        result := gxset.NewSet()
        if err != nil {
-               return result, perrors.WithMessage(err, "can not find the 
client config")
+               return result, perrors.WithMessage(err, "can not find the 
configClient config")
        }
        for _, itm := range page.PageItems {
                result.Add(itm.DataId)
@@ -139,7 +140,7 @@ func (n *nacosDynamicConfiguration) GetRule(key string, 
opts ...config_center.Op
        for _, opt := range opts {
                opt(tmpOpts)
        }
-       content, err := (*n.client.Client()).GetConfig(vo.ConfigParam{
+       content, err := n.client.Client().GetConfig(vo.ConfigParam{
                DataId: key,
                Group:  n.resolvedGroup(tmpOpts.Group),
        })
@@ -161,23 +162,23 @@ func (n *nacosDynamicConfiguration) SetParser(p 
parser.ConfigurationParser) {
 }
 
 // NacosClient Get Nacos Client
-func (n *nacosDynamicConfiguration) NacosClient() *NacosClient {
+func (n *nacosDynamicConfiguration) NacosClient() 
*nacosClient.NacosConfigClient {
        return n.client
 }
 
 // SetNacosClient Set Nacos Client
-func (n *nacosDynamicConfiguration) SetNacosClient(client *NacosClient) {
+func (n *nacosDynamicConfiguration) SetNacosClient(client 
*nacosClient.NacosConfigClient) {
        n.cltLock.Lock()
        n.client = client
        n.cltLock.Unlock()
 }
 
-// WaitGroup for wait group control, zk client listener & zk client container
+// WaitGroup for wait group control, zk configClient listener & zk 
configClient container
 func (n *nacosDynamicConfiguration) WaitGroup() *sync.WaitGroup {
        return &n.wg
 }
 
-// GetDone For nacos client control    RestartCallBack() bool
+// GetDone For nacos configClient control      RestartCallBack() bool
 func (n *nacosDynamicConfiguration) GetDone() chan struct{} {
        return n.done
 }
@@ -214,11 +215,7 @@ func (n *nacosDynamicConfiguration) IsAvailable() bool {
 }
 
 func (n *nacosDynamicConfiguration) closeConfigs() {
-       n.cltLock.Lock()
-       client := n.client
-       n.client = nil
-       n.cltLock.Unlock()
-       // Close the old client first to close the tmp node
-       client.Close()
-       logger.Infof("begin to close provider n client")
+       // Close the old configClient first to close the tmp node
+       n.client.Close()
+       logger.Infof("begin to close provider n configClient")
 }
diff --git a/config_center/nacos/impl_test.go b/config_center/nacos/impl_test.go
index f32920b..eb699e6 100644
--- a/config_center/nacos/impl_test.go
+++ b/config_center/nacos/impl_test.go
@@ -18,10 +18,6 @@
 package nacos
 
 import (
-       "fmt"
-       "net/http"
-       "net/http/httptest"
-       "strings"
        "sync"
        "testing"
        "time"
@@ -37,104 +33,46 @@ import (
        "dubbo.apache.org/dubbo-go/v3/config_center/parser"
 )
 
-// run mock config server
-func runMockConfigServer(configHandler func(http.ResponseWriter, 
*http.Request),
-       configListenHandler func(http.ResponseWriter, *http.Request)) 
*httptest.Server {
-       uriHandlerMap := make(map[string]func(http.ResponseWriter, 
*http.Request))
-
-       uriHandlerMap["/nacos/v1/cs/configs"] = configHandler
-       uriHandlerMap["/nacos/v1/cs/configs/listener"] = configListenHandler
-
-       ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r 
*http.Request) {
-               uri := r.RequestURI
-               for path, handler := range uriHandlerMap {
-                       if uri == path {
-                               handler(w, r)
-                               break
-                       }
-               }
-       }))
-
-       return ts
-}
-
-func mockCommonNacosServer() *httptest.Server {
-       return runMockConfigServer(func(writer http.ResponseWriter, _ 
*http.Request) {
-               data := "true"
-               fmt.Fprintf(writer, "%s", data)
-       }, func(writer http.ResponseWriter, _ *http.Request) {
-               data := 
`dubbo.properties%02dubbo%02dubbo.service.com.ikurento.user.UserProvider.cluster=failback`
-               fmt.Fprintf(writer, "%s", data)
-       })
+func getNacosConfig(t *testing.T) config_center.DynamicConfiguration {
+       registryUrl, err := common.NewURL("registry://console.nacos.io:80")
+       assert.Nil(t, err)
+       nacosConfig, err := newNacosDynamicConfiguration(registryUrl)
+       assert.Nil(t, err)
+       return nacosConfig
 }
 
-func initNacosData(t *testing.T) (*nacosDynamicConfiguration, error) {
-       server := mockCommonNacosServer()
-       nacosURL := strings.ReplaceAll(server.URL, "http", "registry")
-       regurl, _ := common.NewURL(nacosURL)
-       factory := &nacosDynamicConfigurationFactory{}
-       nacosConfiguration, err := factory.GetDynamicConfiguration(regurl)
-       assert.NoError(t, err)
-
-       nacosConfiguration.SetParser(&parser.DefaultConfigurationParser{})
-
-       return nacosConfiguration.(*nacosDynamicConfiguration), err
+func TestPublishConfig(t *testing.T) {
+       nacosConfig := getNacosConfig(t)
+       data := `dubbo.protocol.name=dubbo`
+       err := nacosConfig.PublishConfig("dubbo.properties", "dubbo-go", data)
+       assert.Nil(t, err)
 }
 
 func TestGetConfig(t *testing.T) {
-       nacos, err := initNacosData(t)
-       assert.NoError(t, err)
-       configs, err := nacos.GetProperties("dubbo.properties", 
config_center.WithGroup("dubbo"))
-       assert.Empty(t, configs)
-       assert.NoError(t, err)
-       _, err = nacos.Parser().Parse(configs)
-       assert.NoError(t, err)
-}
+       nacosConfig := getNacosConfig(t)
+       nacosConfig.SetParser(&parser.DefaultConfigurationParser{})
 
-func TestNacosDynamicConfiguration_GetConfigKeysByGroup(t *testing.T) {
-       data := `
-{
-    "PageItems": [
-        {
-            "dataId": "application"
-        }
-    ]
-}
-`
-       ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r 
*http.Request) {
-               _, err := w.Write([]byte(data))
-               assert.Nil(t, err)
-       }))
-
-       nacosURL := strings.ReplaceAll(ts.URL, "http", "registry")
-       regurl, _ := common.NewURL(nacosURL)
-       nacosConfiguration, err := newNacosDynamicConfiguration(regurl)
+       config, err := nacosConfig.GetProperties("dubbo.properties", 
config_center.WithGroup("dubbo-go"))
+       assert.NotEmpty(t, config)
        assert.NoError(t, err)
 
-       nacosConfiguration.SetParser(&parser.DefaultConfigurationParser{})
-
-       configs, err := nacosConfiguration.GetConfigKeysByGroup("dubbo")
-       assert.Nil(t, err)
-       assert.Equal(t, 1, configs.Size())
-       assert.True(t, configs.Contains("application"))
+       parse, err := nacosConfig.Parser().Parse(config)
+       assert.NoError(t, err)
+       assert.Equal(t, parse["dubbo.protocol.name"], "dubbo")
 }
 
-func TestNacosDynamicConfigurationPublishConfig(t *testing.T) {
-       nacos, err := initNacosData(t)
-       assert.Nil(t, err)
-       key := "myKey"
-       group := "/custom/a/b"
-       value := "MyValue"
-       err = nacos.PublishConfig(key, group, value)
-       assert.Nil(t, err)
+func TestGetConfigKeysByGroup(t *testing.T) {
+       nacosConfig := getNacosConfig(t)
+       config, err := nacosConfig.GetConfigKeysByGroup("dubbo-go")
+       assert.NoError(t, err)
+       assert.True(t, config.Contains("dubbo.properties"))
 }
 
 func TestAddListener(t *testing.T) {
-       nacos, err := initNacosData(t)
-       assert.NoError(t, err)
+       nacosConfig := getNacosConfig(t)
        listener := &mockDataListener{}
        time.Sleep(time.Second * 2)
-       nacos.AddListener("dubbo.properties", listener)
+       nacosConfig.AddListener("dubbo.properties", listener)
 }
 
 func TestRemoveListener(_ *testing.T) {
diff --git a/config_center/nacos/listener.go b/config_center/nacos/listener.go
index 2e5eca8..258e730 100644
--- a/config_center/nacos/listener.go
+++ b/config_center/nacos/listener.go
@@ -38,7 +38,7 @@ func callback(listener config_center.ConfigurationListener, 
_, _, dataId, data s
 func (n *nacosDynamicConfiguration) addListener(key string, listener 
config_center.ConfigurationListener) {
        _, loaded := n.keyListeners.Load(key)
        if !loaded {
-               err := (*n.client.Client()).ListenConfig(vo.ConfigParam{
+               err := n.client.Client().ListenConfig(vo.ConfigParam{
                        DataId: key,
                        Group:  "dubbo",
                        OnChange: func(namespace, group, dataId, data string) {
diff --git a/metadata/report/nacos/report.go b/metadata/report/nacos/report.go
index d881771..a351726 100644
--- a/metadata/report/nacos/report.go
+++ b/metadata/report/nacos/report.go
@@ -23,7 +23,7 @@ import (
 )
 
 import (
-       "github.com/nacos-group/nacos-sdk-go/clients/config_client"
+       nacosClient "github.com/dubbogo/gost/database/kv/nacos"
        "github.com/nacos-group/nacos-sdk-go/vo"
        perrors "github.com/pkg/errors"
 )
@@ -48,7 +48,7 @@ func init() {
 // nacosMetadataReport is the implementation
 // of MetadataReport based on nacos.
 type nacosMetadataReport struct {
-       client config_client.IConfigClient
+       client *nacosClient.NacosConfigClient
 }
 
 // GetAppMetadata get metadata info from nacos
@@ -152,7 +152,7 @@ func (n *nacosMetadataReport) 
GetServiceDefinition(metadataIdentifier *identifie
 // storeMetadata will publish the metadata to Nacos
 // if failed or error is not nil, error will be returned
 func (n *nacosMetadataReport) storeMetadata(param vo.ConfigParam) error {
-       res, err := n.client.PublishConfig(param)
+       res, err := n.client.Client().PublishConfig(param)
        if err != nil {
                return perrors.WithMessage(err, "Could not publish the 
metadata")
        }
@@ -164,7 +164,7 @@ func (n *nacosMetadataReport) storeMetadata(param 
vo.ConfigParam) error {
 
 // deleteMetadata will delete the metadata
 func (n *nacosMetadataReport) deleteMetadata(param vo.ConfigParam) error {
-       res, err := n.client.DeleteConfig(param)
+       res, err := n.client.Client().DeleteConfig(param)
        if err != nil {
                return perrors.WithMessage(err, "Could not delete the metadata")
        }
@@ -196,7 +196,7 @@ func (n *nacosMetadataReport) getConfigAsArray(param 
vo.ConfigParam) ([]string,
 
 // getConfig will read the config
 func (n *nacosMetadataReport) getConfig(param vo.ConfigParam) (string, error) {
-       cfg, err := n.client.GetConfig(param)
+       cfg, err := n.client.Client().GetConfig(param)
        if err != nil {
                logger.Errorf("Finding the configuration failed: %v", param)
                return "", err
@@ -208,7 +208,7 @@ type nacosMetadataReportFactory struct{}
 
 // nolint
 func (n *nacosMetadataReportFactory) CreateMetadataReport(url *common.URL) 
report.MetadataReport {
-       client, err := nacos.NewNacosConfigClient(url)
+       client, err := nacos.NewNacosConfigClientByUrl(url)
        if err != nil {
                logger.Errorf("Could not create nacos metadata report. URL: 
%s", url.String())
                return nil
diff --git a/registry/nacos/listener.go b/registry/nacos/listener.go
index 19beaa5..3a538cc 100644
--- a/registry/nacos/listener.go
+++ b/registry/nacos/listener.go
@@ -26,7 +26,7 @@ import (
 )
 
 import (
-       "github.com/nacos-group/nacos-sdk-go/clients/naming_client"
+       nacosClient "github.com/dubbogo/gost/database/kv/nacos"
        "github.com/nacos-group/nacos-sdk-go/model"
        "github.com/nacos-group/nacos-sdk-go/vo"
        perrors "github.com/pkg/errors"
@@ -42,7 +42,7 @@ import (
 )
 
 type nacosListener struct {
-       namingClient   naming_client.INamingClient
+       namingClient   *nacosClient.NacosNamingClient
        listenUrl      *common.URL
        events         chan *config_center.ConfigChangeEvent
        instanceMap    map[string]model.Instance
@@ -51,8 +51,8 @@ type nacosListener struct {
        subscribeParam *vo.SubscribeParam
 }
 
-// NewRegistryDataListener creates a data listener for nacos
-func NewNacosListener(url *common.URL, namingClient 
naming_client.INamingClient) (*nacosListener, error) {
+// NewNacosListener creates a data listener for nacos
+func NewNacosListener(url *common.URL, namingClient 
*nacosClient.NacosNamingClient) (*nacosListener, error) {
        listener := &nacosListener{
                namingClient: namingClient,
                listenUrl:    url, events: make(chan 
*config_center.ConfigChangeEvent, 32),
@@ -150,7 +150,6 @@ func (nl *nacosListener) Callback(services 
[]model.SubscribeService, err error)
        }
 
        nl.instanceMap = newInstanceMap
-
        for i := range addInstances {
                newUrl := generateUrl(addInstances[i])
                if newUrl != nil {
@@ -184,18 +183,18 @@ func getSubscribeName(url *common.URL) string {
 
 func (nl *nacosListener) startListen() error {
        if nl.namingClient == nil {
-               return perrors.New("nacos naming client stopped")
+               return perrors.New("nacos naming namingClient stopped")
        }
        serviceName := getSubscribeName(nl.listenUrl)
        nl.subscribeParam = &vo.SubscribeParam{ServiceName: serviceName, 
SubscribeCallback: nl.Callback}
        go func() {
-               _ = nl.namingClient.Subscribe(nl.subscribeParam)
+               _ = nl.namingClient.Client().Subscribe(nl.subscribeParam)
        }()
        return nil
 }
 
 func (nl *nacosListener) stopListen() error {
-       return nl.namingClient.Unsubscribe(nl.subscribeParam)
+       return nl.namingClient.Client().Unsubscribe(nl.subscribeParam)
 }
 
 func (nl *nacosListener) process(configType *config_center.ConfigChangeEvent) {
@@ -219,6 +218,6 @@ func (nl *nacosListener) Next() (*registry.ServiceEvent, 
error) {
 
 // nolint
 func (nl *nacosListener) Close() {
-       nl.stopListen()
+       _ = nl.stopListen()
        close(nl.done)
 }
diff --git a/registry/nacos/registry.go b/registry/nacos/registry.go
index 479c5d6..b29f97f 100644
--- a/registry/nacos/registry.go
+++ b/registry/nacos/registry.go
@@ -19,16 +19,14 @@ package nacos
 
 import (
        "bytes"
-       "net"
        "strconv"
        "strings"
        "time"
 )
 
 import (
-       "github.com/nacos-group/nacos-sdk-go/clients"
-       "github.com/nacos-group/nacos-sdk-go/clients/naming_client"
-       nacosConstant "github.com/nacos-group/nacos-sdk-go/common/constant"
+       "dubbo.apache.org/dubbo-go/v3/remoting/nacos"
+       nacosClient "github.com/dubbogo/gost/database/kv/nacos"
        "github.com/nacos-group/nacos-sdk-go/vo"
        perrors "github.com/pkg/errors"
 )
@@ -55,7 +53,7 @@ func init() {
 
 type nacosRegistry struct {
        *common.URL
-       namingClient naming_client.INamingClient
+       namingClient *nacosClient.NacosNamingClient
        registryUrls []*common.URL
 }
 
@@ -119,7 +117,7 @@ func createRegisterParam(url *common.URL, serviceName 
string) vo.RegisterInstanc
 func (nr *nacosRegistry) Register(url *common.URL) error {
        serviceName := getServiceName(url)
        param := createRegisterParam(url, serviceName)
-       isRegistry, err := nr.namingClient.RegisterInstance(param)
+       isRegistry, err := nr.namingClient.Client().RegisterInstance(param)
        if err != nil {
                return err
        }
@@ -149,7 +147,7 @@ func createDeregisterParam(url *common.URL, serviceName 
string) vo.DeregisterIns
 func (nr *nacosRegistry) DeRegister(url *common.URL) error {
        serviceName := getServiceName(url)
        param := createDeregisterParam(url, serviceName)
-       isDeRegistry, err := nr.namingClient.DeregisterInstance(param)
+       isDeRegistry, err := nr.namingClient.Client().DeregisterInstance(param)
        if err != nil {
                return err
        }
@@ -199,11 +197,9 @@ func (nr *nacosRegistry) Subscribe(url *common.URL, 
notifyListener registry.Noti
                                listener.Close()
                                return err
                        }
-
                        logger.Infof("update begin, service event: %v", 
serviceEvent.String())
                        notifyListener.Notify(serviceEvent)
                }
-
        }
 }
 
@@ -237,69 +233,14 @@ func (nr *nacosRegistry) Destroy() {
 
 // newNacosRegistry will create new instance
 func newNacosRegistry(url *common.URL) (registry.Registry, error) {
-       nacosConfig, err := getNacosConfig(url)
-       if err != nil {
-               return &nacosRegistry{}, err
-       }
-       client, err := clients.CreateNamingClient(nacosConfig)
+       namingClient, err := nacos.NewNacosClientByUrl(url)
        if err != nil {
                return &nacosRegistry{}, err
        }
        tmpRegistry := &nacosRegistry{
                URL:          url,
-               namingClient: client,
+               namingClient: namingClient,
                registryUrls: []*common.URL{},
        }
        return tmpRegistry, nil
 }
-
-// getNacosConfig will return the nacos config
-// TODO support RemoteRef
-func getNacosConfig(url *common.URL) (map[string]interface{}, error) {
-       if url == nil {
-               return nil, perrors.New("url is empty!")
-       }
-       if len(url.Location) == 0 {
-               return nil, perrors.New("url.location is empty!")
-       }
-       configMap := make(map[string]interface{}, 2)
-
-       addresses := strings.Split(url.Location, ",")
-       serverConfigs := make([]nacosConstant.ServerConfig, 0, len(addresses))
-       for _, addr := range addresses {
-               ip, portStr, err := net.SplitHostPort(addr)
-               if err != nil {
-                       return nil, perrors.WithMessagef(err, "split [%s] ", 
addr)
-               }
-               port, _ := strconv.Atoi(portStr)
-               serverConfigs = append(serverConfigs, 
nacosConstant.ServerConfig{
-                       IpAddr: ip,
-                       Port:   uint64(port),
-               })
-       }
-       configMap[nacosConstant.KEY_SERVER_CONFIGS] = 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.NamespaceId = url.GetParam(constant.NACOS_NAMESPACE_ID, "")
-
-       // enable local cache when nacos can not connect.
-       notLoadCache, err := 
strconv.ParseBool(url.GetParam(constant.NACOS_NOT_LOAD_LOCAL_CACHE, "false"))
-       if err != nil {
-               logger.Errorf("ParseBool - error: %v", err)
-               notLoadCache = false
-       }
-       clientConfig.NotLoadCacheAtStart = notLoadCache
-
-       configMap[nacosConstant.KEY_CLIENT_CONFIG] = clientConfig
-
-       return configMap, nil
-}
diff --git a/registry/nacos/registry_test.go b/registry/nacos/registry_test.go
index b95d3d5..17829d6 100644
--- a/registry/nacos/registry_test.go
+++ b/registry/nacos/registry_test.go
@@ -37,7 +37,7 @@ import (
 )
 
 func TestNacosRegistry_Register(t *testing.T) {
-       t.Skip()
+       //t.Skip()
        if !checkNacosServerAlive() {
                return
        }
@@ -66,8 +66,9 @@ func TestNacosRegistry_Register(t *testing.T) {
                t.Errorf("register error:%s \n", err.Error())
                return
        }
+       time.Sleep(5 * time.Second)
        nacosReg := reg.(*nacosRegistry)
-       service, _ := 
nacosReg.namingClient.GetService(vo.GetServiceParam{ServiceName: 
"providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc"})
+       service, _ := 
nacosReg.namingClient.Client().GetService(vo.GetServiceParam{ServiceName: 
"providers:com.ikurento.user.UserProvider:1.0.0:guangzhou-idc"})
        data, _ := json.Marshal(service)
        t.Logf(string(data))
        assert.Equal(t, 1, len(service.Hosts))
@@ -85,11 +86,11 @@ func TestNacosRegistry_Subscribe(t *testing.T) {
        urlMap := url.Values{}
        urlMap.Set(constant.GROUP_KEY, "guangzhou-idc")
        urlMap.Set(constant.ROLE_KEY, strconv.Itoa(common.PROVIDER))
-       urlMap.Set(constant.INTERFACE_KEY, "com.ikurento.user.UserProvider")
+       urlMap.Set(constant.INTERFACE_KEY, "com.dubbo.user.UserProvider")
        urlMap.Set(constant.VERSION_KEY, "1.0.0")
        urlMap.Set(constant.CLUSTER_KEY, "mock")
        urlMap.Set(constant.NACOS_PATH_KEY, "")
-       testUrl, _ := 
common.NewURL("dubbo://127.0.0.1:20000/com.ikurento.user.UserProvider", 
common.WithParams(urlMap), common.WithMethods([]string{"GetUser", "AddUser"}))
+       testUrl, _ := 
common.NewURL("dubbo://127.0.0.1:20000/com.dubbo.user.UserProvider", 
common.WithParams(urlMap), common.WithMethods([]string{"GetUser", "AddUser"}))
 
        reg, _ := newNacosRegistry(regurl)
        err := reg.Register(testUrl)
@@ -179,7 +180,7 @@ func TestNacosRegistry_Subscribe_del(t *testing.T) {
 
        nacosReg := reg.(*nacosRegistry)
        // deregister instance to mock instance offline
-       _, err = 
nacosReg.namingClient.DeregisterInstance(vo.DeregisterInstanceParam{
+       _, err = 
nacosReg.namingClient.Client().DeregisterInstance(vo.DeregisterInstanceParam{
                Ip: "127.0.0.2", Port: 20000,
                ServiceName: 
"providers:com.ikurento.user.UserProvider:2.0.0:guangzhou-idc",
        })
diff --git a/registry/nacos/service_discovery.go 
b/registry/nacos/service_discovery.go
index 93cf2cb..def1996 100644
--- a/registry/nacos/service_discovery.go
+++ b/registry/nacos/service_discovery.go
@@ -24,8 +24,8 @@ import (
 
 import (
        "github.com/dubbogo/gost/container/set"
+       nacosClient "github.com/dubbogo/gost/database/kv/nacos"
        "github.com/dubbogo/gost/hash/page"
-       "github.com/nacos-group/nacos-sdk-go/clients/naming_client"
        "github.com/nacos-group/nacos-sdk-go/model"
        "github.com/nacos-group/nacos-sdk-go/vo"
        perrors "github.com/pkg/errors"
@@ -51,21 +51,21 @@ func init() {
 }
 
 // nacosServiceDiscovery is the implementation of service discovery based on 
nacos.
-// There is a problem, the go client for nacos does not support the id field.
+// There is a problem, the go namingClient for nacos does not support the id 
field.
 // we will use the metadata to store the id of ServiceInstance
 type nacosServiceDiscovery struct {
        group string
        // descriptor is a short string about the basic information of this 
instance
        descriptor string
 
-       // namingClient is the Nacos' client
-       namingClient naming_client.INamingClient
+       // namingClient is the Nacos' namingClient
+       namingClient *nacosClient.NacosNamingClient
        // cache registry instances
        registryInstances []registry.ServiceInstance
 }
 
 // Destroy will close the service discovery.
-// Actually, it only marks the naming client as null and then return
+// Actually, it only marks the naming namingClient as null and then return
 func (n *nacosServiceDiscovery) Destroy() error {
        for _, inst := range n.registryInstances {
                err := n.Unregister(inst)
@@ -74,14 +74,14 @@ func (n *nacosServiceDiscovery) Destroy() error {
                        logger.Errorf("Unregister nacos instance:%+v, err:%+v", 
inst, err)
                }
        }
-       n.namingClient = nil
+       n.namingClient.Close()
        return nil
 }
 
 // Register will register the service to nacos
 func (n *nacosServiceDiscovery) Register(instance registry.ServiceInstance) 
error {
        ins := n.toRegisterInstance(instance)
-       ok, err := n.namingClient.RegisterInstance(ins)
+       ok, err := n.namingClient.Client().RegisterInstance(ins)
        if err != nil || !ok {
                return perrors.WithMessage(err, "Could not register the 
instance. "+instance.GetServiceName())
        }
@@ -104,7 +104,7 @@ func (n *nacosServiceDiscovery) Update(instance 
registry.ServiceInstance) error
 
 // Unregister will unregister the instance
 func (n *nacosServiceDiscovery) Unregister(instance registry.ServiceInstance) 
error {
-       ok, err := 
n.namingClient.DeregisterInstance(n.toDeregisterInstance(instance))
+       ok, err := 
n.namingClient.Client().DeregisterInstance(n.toDeregisterInstance(instance))
        if err != nil || !ok {
                return perrors.WithMessage(err, "Could not unregister the 
instance. "+instance.GetServiceName())
        }
@@ -118,7 +118,7 @@ func (n *nacosServiceDiscovery) GetDefaultPageSize() int {
 
 // GetServices will return the all services
 func (n *nacosServiceDiscovery) GetServices() *gxset.HashSet {
-       services, err := 
n.namingClient.GetAllServicesInfo(vo.GetAllServiceInfoParam{
+       services, err := 
n.namingClient.Client().GetAllServicesInfo(vo.GetAllServiceInfoParam{
                GroupName: n.group,
        })
 
@@ -136,7 +136,7 @@ func (n *nacosServiceDiscovery) GetServices() 
*gxset.HashSet {
 
 // GetInstances will return the instances of serviceName and the group
 func (n *nacosServiceDiscovery) GetInstances(serviceName string) 
[]registry.ServiceInstance {
-       instances, err := 
n.namingClient.SelectAllInstances(vo.SelectAllInstancesParam{
+       instances, err := 
n.namingClient.Client().SelectAllInstances(vo.SelectAllInstancesParam{
                ServiceName: serviceName,
                GroupName:   n.group,
        })
@@ -162,12 +162,11 @@ func (n *nacosServiceDiscovery) GetInstances(serviceName 
string) []registry.Serv
                        Metadata:    metadata,
                })
        }
-
        return res
 }
 
 // GetInstancesByPage will return the instances
-// Due to nacos client does not support pagination, so we have to query all 
instances and then return part of them
+// Due to nacos namingClient does not support pagination, so we have to query 
all instances and then return part of them
 func (n *nacosServiceDiscovery) GetInstancesByPage(serviceName string, offset 
int, pageSize int) gxpage.Pager {
        all := n.GetInstances(serviceName)
        res := make([]interface{}, 0, pageSize)
@@ -179,7 +178,7 @@ func (n *nacosServiceDiscovery) 
GetInstancesByPage(serviceName string, offset in
 }
 
 // GetHealthyInstancesByPage will return the instance
-// The nacos client has an API SelectInstances, which has a parameter call 
HealthyOnly.
+// The nacos namingClient has an API SelectInstances, which has a parameter 
call HealthyOnly.
 // However, the healthy parameter in this method maybe false. So we can not 
use that API.
 // Thus, we must query all instances and then do filter
 func (n *nacosServiceDiscovery) GetHealthyInstancesByPage(serviceName string, 
offset int, pageSize int, healthy bool) gxpage.Pager {
@@ -202,7 +201,7 @@ func (n *nacosServiceDiscovery) 
GetHealthyInstancesByPage(serviceName string, of
 }
 
 // GetRequestInstances will return the instances
-// The nacos client doesn't have batch API, so we should query those 
serviceNames one by one.
+// The nacos namingClient doesn't have batch API, so we should query those 
serviceNames one by one.
 func (n *nacosServiceDiscovery) GetRequestInstances(serviceNames []string, 
offset int, requestedSize int) map[string]gxpage.Pager {
        res := make(map[string]gxpage.Pager, len(serviceNames))
        for _, name := range serviceNames {
@@ -215,7 +214,7 @@ func (n *nacosServiceDiscovery) 
GetRequestInstances(serviceNames []string, offse
 func (n *nacosServiceDiscovery) AddListener(listener 
registry.ServiceInstancesChangedListener) error {
        for _, t := range listener.GetServiceNames().Values() {
                serviceName := t.(string)
-               err := n.namingClient.Subscribe(&vo.SubscribeParam{
+               err := n.namingClient.Client().Subscribe(&vo.SubscribeParam{
                        ServiceName: serviceName,
                        SubscribeCallback: func(services 
[]model.SubscribeService, err error) {
                                if err != nil {
@@ -283,7 +282,7 @@ func (n *nacosServiceDiscovery) toRegisterInstance(instance 
registry.ServiceInst
                Ip:          instance.GetHost(),
                Port:        uint64(instance.GetPort()),
                Metadata:    metadata,
-               // We must specify the weight since Java nacos client will 
ignore the instance whose weight is 0
+               // We must specify the weight since Java nacos namingClient 
will ignore the instance whose weight is 0
                Weight:    1,
                Enable:    instance.IsEnable(),
                Healthy:   instance.IsHealthy(),
@@ -338,7 +337,7 @@ func newNacosServiceDiscovery(name string) 
(registry.ServiceDiscovery, error) {
 
        client, err := nacos.NewNacosClient(remoteConfig)
        if err != nil {
-               return nil, perrors.WithMessage(err, "create nacos client 
failed.")
+               return nil, perrors.WithMessage(err, "create nacos namingClient 
failed.")
        }
 
        descriptor := fmt.Sprintf("nacos-service-discovery[%s]", 
remoteConfig.Address)
diff --git a/registry/nacos/service_discovery_test.go 
b/registry/nacos/service_discovery_test.go
index 0e60499..03b1b9c 100644
--- a/registry/nacos/service_discovery_test.go
+++ b/registry/nacos/service_discovery_test.go
@@ -113,11 +113,12 @@ func TestNacosServiceDiscovery_CRUD(t *testing.T) {
        assert.Nil(t, err)
 
        err = serviceDiscovery.Register(instance)
+
        assert.Nil(t, err)
 
        // sometimes nacos may be failed to push update of instance,
        // so it need 10s to pull, we sleep 10 second to make sure instance has 
been update
-       time.Sleep(11 * time.Second)
+       time.Sleep(5 * time.Second)
        page := serviceDiscovery.GetHealthyInstancesByPage(serviceName, 0, 10, 
true)
        assert.NotNil(t, page)
        assert.Equal(t, 0, page.GetOffset())
@@ -125,6 +126,7 @@ func TestNacosServiceDiscovery_CRUD(t *testing.T) {
        assert.Equal(t, 1, page.GetDataSize())
 
        instance = page.GetData()[0].(*registry.DefaultServiceInstance)
+       instance.ServiceName = serviceName
        assert.NotNil(t, instance)
        assert.Equal(t, id, instance.GetID())
        assert.Equal(t, host, instance.GetHost())
@@ -173,7 +175,6 @@ func TestNacosServiceDiscovery_Destroy(t *testing.T) {
        assert.NotNil(t, serviceDiscovery)
        err = serviceDiscovery.Destroy()
        assert.Nil(t, err)
-       assert.Nil(t, serviceDiscovery.(*nacosServiceDiscovery).namingClient)
 }
 
 func prepareData() {
diff --git a/remoting/nacos/builder.go b/remoting/nacos/builder.go
index 4367bab..4624061 100644
--- a/remoting/nacos/builder.go
+++ b/remoting/nacos/builder.go
@@ -25,9 +25,7 @@ import (
 )
 
 import (
-       "github.com/nacos-group/nacos-sdk-go/clients"
-       "github.com/nacos-group/nacos-sdk-go/clients/config_client"
-       "github.com/nacos-group/nacos-sdk-go/clients/naming_client"
+       nacosClient "github.com/dubbogo/gost/database/kv/nacos"
        nacosConstant "github.com/nacos-group/nacos-sdk-go/common/constant"
        perrors "github.com/pkg/errors"
 )
@@ -38,94 +36,114 @@ import (
        "dubbo.apache.org/dubbo-go/v3/config"
 )
 
-// NewNacosConfigClient read the config from url and build an instance
-func NewNacosConfigClient(url *common.URL) (config_client.IConfigClient, 
error) {
-       nacosConfig, err := getNacosConfig(url)
+// NewNacosConfigClientByUrl read the config from url and build an instance
+func NewNacosConfigClientByUrl(url *common.URL) 
(*nacosClient.NacosConfigClient, error) {
+       sc, cc, err := GetNacosConfig(url)
        if err != nil {
                return nil, err
        }
-       return clients.CreateConfigClient(nacosConfig)
+       return nacosClient.NewNacosConfigClient(getNacosClientName(), true, sc, 
cc)
 }
 
-// getNacosConfig will return the nacos config
-func getNacosConfig(url *common.URL) (map[string]interface{}, error) {
+// GetNacosConfig will return the nacos config
+func GetNacosConfig(url *common.URL) ([]nacosConstant.ServerConfig, 
nacosConstant.ClientConfig, error) {
        if url == nil {
-               return nil, perrors.New("url is empty!")
+               return []nacosConstant.ServerConfig{}, 
nacosConstant.ClientConfig{}, perrors.New("url is empty!")
        }
+
        if len(url.Location) == 0 {
-               return nil, perrors.New("url.location is empty!")
+               return []nacosConstant.ServerConfig{}, 
nacosConstant.ClientConfig{},
+                       perrors.New("url.location is empty!")
        }
-       configMap := make(map[string]interface{}, 2)
 
        addresses := strings.Split(url.Location, ",")
        serverConfigs := make([]nacosConstant.ServerConfig, 0, len(addresses))
        for _, addr := range addresses {
                ip, portStr, err := net.SplitHostPort(addr)
                if err != nil {
-                       return nil, perrors.WithMessagef(err, "split [%s] ", 
addr)
+                       return []nacosConstant.ServerConfig{}, 
nacosConstant.ClientConfig{},
+                               perrors.WithMessagef(err, "split [%s] ", addr)
                }
                port, _ := strconv.Atoi(portStr)
-               serverConfigs = append(serverConfigs, 
nacosConstant.ServerConfig{
-                       IpAddr: ip,
-                       Port:   uint64(port),
-               })
+               serverConfigs = append(serverConfigs, 
nacosConstant.ServerConfig{IpAddr: ip, Port: uint64(port)})
        }
-       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
+               return []nacosConstant.ServerConfig{}, 
nacosConstant.ClientConfig{}, err
+       }
+       //enable local cache when nacos can not connect.
+       notLoadCache, err := 
strconv.ParseBool(url.GetParam(constant.NACOS_NOT_LOAD_LOCAL_CACHE, "true"))
+       if err != nil {
+               notLoadCache = false
        }
        clientConfig.TimeoutMs = uint64(timeout.Seconds() * 1000)
-       clientConfig.ListenInterval = 2 * clientConfig.TimeoutMs
+       // 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.NamespaceId = url.GetParam(constant.NACOS_NAMESPACE_ID, "")
        clientConfig.Username = url.GetParam(constant.NACOS_USERNAME, "")
        clientConfig.Password = url.GetParam(constant.NACOS_PASSWORD, "")
-       clientConfig.NamespaceId = url.GetParam(constant.NACOS_NAMESPACE_ID, "")
-       clientConfig.NotLoadCacheAtStart = true
-       configMap["clientConfig"] = clientConfig
+       clientConfig.NotLoadCacheAtStart = notLoadCache
 
-       return configMap, nil
+       return serverConfigs, clientConfig, nil
 }
 
-// NewNacosClient creates an instance with the config
-func NewNacosClient(rc *config.RemoteConfig) (naming_client.INamingClient, 
error) {
+// NewNacosClient create an instance with the config
+func NewNacosClient(rc *config.RemoteConfig) (*nacosClient.NacosNamingClient, 
error) {
        if len(rc.Address) == 0 {
                return nil, perrors.New("nacos address is empty!")
        }
-       configMap := make(map[string]interface{}, 2)
-
        addresses := strings.Split(rc.Address, ",")
-       serverConfigs := make([]nacosConstant.ServerConfig, 0, len(addresses))
+       scs := make([]nacosConstant.ServerConfig, 0, len(addresses))
        for _, addr := range addresses {
                ip, portStr, err := net.SplitHostPort(addr)
                if err != nil {
                        return nil, perrors.WithMessagef(err, "split [%s] ", 
addr)
                }
                port, _ := strconv.Atoi(portStr)
-               serverConfigs = append(serverConfigs, 
nacosConstant.ServerConfig{
+               scs = append(scs, nacosConstant.ServerConfig{
                        IpAddr: ip,
                        Port:   uint64(port),
                })
        }
-       configMap["serverConfigs"] = serverConfigs
 
-       var clientConfig nacosConstant.ClientConfig
+       var cc nacosConstant.ClientConfig
        timeout := rc.Timeout()
-       clientConfig.TimeoutMs = uint64(timeout.Nanoseconds() / 
constant.MsToNanoRate)
-       clientConfig.ListenInterval = 2 * clientConfig.TimeoutMs
-       clientConfig.CacheDir = rc.GetParam(constant.NACOS_CACHE_DIR_KEY, "")
-       clientConfig.LogDir = rc.GetParam(constant.NACOS_LOG_DIR_KEY, "")
-       clientConfig.Endpoint = rc.Address
-       clientConfig.Username = rc.Username
-       clientConfig.Password = rc.Password
-       clientConfig.NotLoadCacheAtStart = true
-       clientConfig.NamespaceId = rc.GetParam(constant.NACOS_NAMESPACE_ID, "")
-       configMap["clientConfig"] = clientConfig
+       //enable local cache when nacos can not connect.
+       notLoadCache, err := 
strconv.ParseBool(rc.GetParam(constant.NACOS_NOT_LOAD_LOCAL_CACHE, "true"))
+       if err != nil {
+               notLoadCache = false
+       }
+       cc.TimeoutMs = uint64(timeout.Nanoseconds() / constant.MsToNanoRate)
+       // cc.ListenInterval = 2 * cc.TimeoutMs
+       cc.CacheDir = rc.GetParam(constant.NACOS_CACHE_DIR_KEY, "")
+       cc.LogDir = rc.GetParam(constant.NACOS_LOG_DIR_KEY, "")
+       cc.Endpoint = rc.GetParam(constant.NACOS_ENDPOINT, "")
+       cc.NamespaceId = rc.GetParam(constant.NACOS_NAMESPACE_ID, "")
+       cc.Username = rc.Username
+       cc.Password = rc.Password
+       cc.NotLoadCacheAtStart = notLoadCache
 
-       return clients.CreateNamingClient(configMap)
+       return nacosClient.NewNacosNamingClient(getNacosClientName(), true, 
scs, cc)
+}
+
+// NewNacosClientByUrl created
+func NewNacosClientByUrl(url *common.URL) (*nacosClient.NacosNamingClient, 
error) {
+       scs, cc, err := GetNacosConfig(url)
+       if err != nil {
+               return nil, err
+       }
+       return nacosClient.NewNacosNamingClient(getNacosClientName(), true, 
scs, cc)
+}
+
+// getNacosClientName get nacos client name
+func getNacosClientName() string {
+       name := config.GetApplicationConfig().Name
+       if len(name) > 0 {
+               return name
+       }
+       return "nacos-client"
 }
diff --git a/remoting/nacos/builder_test.go b/remoting/nacos/builder_test.go
index 1f7fa81..0d43ed0 100644
--- a/remoting/nacos/builder_test.go
+++ b/remoting/nacos/builder_test.go
@@ -18,6 +18,8 @@
 package nacos
 
 import (
+       "net/url"
+       "strconv"
        "testing"
 )
 
@@ -26,6 +28,8 @@ import (
 )
 
 import (
+       "dubbo.apache.org/dubbo-go/v3/common"
+       "dubbo.apache.org/dubbo-go/v3/common/constant"
        "dubbo.apache.org/dubbo-go/v3/config"
 )
 
@@ -49,3 +53,45 @@ func TestNewNacosClient(t *testing.T) {
        assert.NotNil(t, client)
        assert.Nil(t, err)
 }
+
+func TestGetNacosConfig(t *testing.T) {
+       regurl := getRegUrl()
+       sc, cc, err := GetNacosConfig(regurl)
+
+       assert.Nil(t, err)
+       assert.NotNil(t, sc)
+       assert.NotNil(t, cc)
+       assert.Equal(t, cc.TimeoutMs, uint64(5000))
+}
+
+func TestNewNacosConfigClient(t *testing.T) {
+
+       regurl := getRegUrl()
+       client, err := NewNacosConfigClientByUrl(regurl)
+
+       assert.Nil(t, err)
+       assert.NotNil(t, client)
+}
+
+func TestNewNacosClientByUrl(t *testing.T) {
+       regurl := getRegUrl()
+       client, err := NewNacosClientByUrl(regurl)
+
+       assert.Nil(t, err)
+       assert.NotNil(t, client)
+}
+
+func getRegUrl() *common.URL {
+
+       regurlMap := url.Values{}
+       regurlMap.Set(constant.ROLE_KEY, strconv.Itoa(common.PROVIDER))
+       regurlMap.Set(constant.NACOS_NOT_LOAD_LOCAL_CACHE, "true")
+       // regurlMap.Set(constant.NACOS_USERNAME, "nacos")
+       // regurlMap.Set(constant.NACOS_PASSWORD, "nacos")
+       regurlMap.Set(constant.NACOS_NAMESPACE_ID, "nacos")
+       regurlMap.Set(constant.REGISTRY_TIMEOUT_KEY, "5s")
+
+       regurl, _ := common.NewURL("registry://console.nacos.io:80", 
common.WithParams(regurlMap))
+
+       return regurl
+}

Reply via email to