diff --git a/common/constant/default.go b/common/constant/default.go
index 992fc32748bb4fc7777cffecc9137663c681c3f7..8ed645e84a724531080eff6efe5fdb0df5479e80 100644
--- a/common/constant/default.go
+++ b/common/constant/default.go
@@ -66,6 +66,7 @@ const (
 	DYNAMIC_CONFIGURATORS_CATEGORY     = "dynamicconfigurators"
 	APP_DYNAMIC_CONFIGURATORS_CATEGORY = "appdynamicconfigurators"
 	PROVIDER_CATEGORY                  = "providers"
+	CONSUMER_CATEGORY                  = "consumers"
 )
 
 const (
diff --git a/config/config_loader.go b/config/config_loader.go
index 875d1f6ddb84434d32296076cd31be96c1385b8a..d6be98b67d0ca1494082201ba2d0b06202cb357c 100644
--- a/config/config_loader.go
+++ b/config/config_loader.go
@@ -195,20 +195,20 @@ func GetApplicationConfig() *ApplicationConfig {
 
 // GetProviderConfig find the provider config
 // if not found, create new one
-func GetProviderConfig() ProviderConfig {
+func GetProviderConfig() *ProviderConfig {
 	if providerConfig == nil {
 		logger.Warnf("providerConfig is nil!")
-		return ProviderConfig{}
+		return &ProviderConfig{}
 	}
-	return *providerConfig
+	return providerConfig
 }
 
 // GetConsumerConfig find the consumer config
 // if not found, create new one
-func GetConsumerConfig() ConsumerConfig {
+func GetConsumerConfig() *ConsumerConfig {
 	if consumerConfig == nil {
 		logger.Warnf("consumerConfig is nil!")
-		return ConsumerConfig{}
+		return &ConsumerConfig{}
 	}
-	return *consumerConfig
+	return consumerConfig
 }
diff --git a/config/config_loader_test.go b/config/config_loader_test.go
index 498f82678070d194e3ffe1539064be7aec19f719..a25cccec4951818b21cd40d3d4cd5a32b87fdaa8 100644
--- a/config/config_loader_test.go
+++ b/config/config_loader_test.go
@@ -43,9 +43,9 @@ func TestConfigLoader(t *testing.T) {
 	assert.NoError(t, err)
 
 	assert.Nil(t, consumerConfig)
-	assert.Equal(t, ConsumerConfig{}, GetConsumerConfig())
+	assert.Equal(t, &ConsumerConfig{}, GetConsumerConfig())
 	assert.Nil(t, providerConfig)
-	assert.Equal(t, ProviderConfig{}, GetProviderConfig())
+	assert.Equal(t, &ProviderConfig{}, GetProviderConfig())
 
 	err = ConsumerInit(conPath)
 	assert.NoError(t, err)
@@ -53,9 +53,9 @@ func TestConfigLoader(t *testing.T) {
 	assert.NoError(t, err)
 
 	assert.NotNil(t, consumerConfig)
-	assert.NotEqual(t, ConsumerConfig{}, GetConsumerConfig())
+	assert.NotEqual(t, &ConsumerConfig{}, GetConsumerConfig())
 	assert.NotNil(t, providerConfig)
-	assert.NotEqual(t, ProviderConfig{}, GetProviderConfig())
+	assert.NotEqual(t, &ProviderConfig{}, GetProviderConfig())
 	assert.Equal(t, "soa.com.ikurento.user.UserProvider", GetConsumerConfig().References["UserProvider"].Params["serviceid"])
 }
 
@@ -155,9 +155,9 @@ func TestConfigLoaderWithConfigCenter(t *testing.T) {
 	assert.NoError(t, err)
 
 	assert.Nil(t, consumerConfig)
-	assert.Equal(t, ConsumerConfig{}, GetConsumerConfig())
+	assert.Equal(t, &ConsumerConfig{}, GetConsumerConfig())
 	assert.Nil(t, providerConfig)
-	assert.Equal(t, ProviderConfig{}, GetProviderConfig())
+	assert.Equal(t, &ProviderConfig{}, GetProviderConfig())
 
 	err = ConsumerInit(conPath)
 	configCenterRefreshConsumer()
@@ -167,9 +167,9 @@ func TestConfigLoaderWithConfigCenter(t *testing.T) {
 	assert.NoError(t, err)
 
 	assert.NotNil(t, consumerConfig)
-	assert.NotEqual(t, ConsumerConfig{}, GetConsumerConfig())
+	assert.NotEqual(t, &ConsumerConfig{}, GetConsumerConfig())
 	assert.NotNil(t, providerConfig)
-	assert.NotEqual(t, ProviderConfig{}, GetProviderConfig())
+	assert.NotEqual(t, &ProviderConfig{}, GetProviderConfig())
 
 	assert.Equal(t, "BDTService", consumerConfig.ApplicationConfig.Name)
 	assert.Equal(t, "127.0.0.1:2181", consumerConfig.Registries["hangzhouzk"].Address)
@@ -208,9 +208,9 @@ func TestConfigLoaderWithConfigCenterSingleRegistry(t *testing.T) {
 	assert.NoError(t, err)
 
 	assert.Nil(t, consumerConfig)
-	assert.Equal(t, ConsumerConfig{}, GetConsumerConfig())
+	assert.Equal(t, &ConsumerConfig{}, GetConsumerConfig())
 	assert.Nil(t, providerConfig)
-	assert.Equal(t, ProviderConfig{}, GetProviderConfig())
+	assert.Equal(t, &ProviderConfig{}, GetProviderConfig())
 
 	err = ConsumerInit(conPath)
 	checkApplicationName(consumerConfig.ApplicationConfig)
@@ -224,9 +224,9 @@ func TestConfigLoaderWithConfigCenterSingleRegistry(t *testing.T) {
 	assert.NoError(t, err)
 
 	assert.NotNil(t, consumerConfig)
-	assert.NotEqual(t, ConsumerConfig{}, GetConsumerConfig())
+	assert.NotEqual(t, &ConsumerConfig{}, GetConsumerConfig())
 	assert.NotNil(t, providerConfig)
-	assert.NotEqual(t, ProviderConfig{}, GetProviderConfig())
+	assert.NotEqual(t, &ProviderConfig{}, GetProviderConfig())
 
 	assert.Equal(t, "BDTService", consumerConfig.ApplicationConfig.Name)
 	assert.Equal(t, "mock://127.0.0.1:2182", consumerConfig.Registries[constant.DEFAULT_KEY].Address)
diff --git a/remoting/zookeeper/listener.go b/remoting/zookeeper/listener.go
index 4493c06dc3f13d59b9388268613fe9e08a14033e..9032e1bd029449ac45599b558d630b8abc4a8bdd 100644
--- a/remoting/zookeeper/listener.go
+++ b/remoting/zookeeper/listener.go
@@ -18,7 +18,9 @@
 package zookeeper
 
 import (
+	"github.com/apache/dubbo-go/common/constant"
 	"path"
+	"strings"
 	"sync"
 	"time"
 )
@@ -256,10 +258,14 @@ func (l *ZkEventListener) listenDirEvent(zkPath string, listener remoting.DataLi
 			}(dubboPath, listener)
 
 			//listen sub path recursive
-			go func(zkPath string, listener remoting.DataListener) {
-				l.listenDirEvent(zkPath, listener)
-				logger.Warnf("listenDirEvent(zkPath{%s}) goroutine exit now", zkPath)
-			}(dubboPath, listener)
+			//if zkPath is end of "providers/ & consumers/" we do not listen children dir
+			if strings.LastIndex(zkPath, constant.PROVIDER_CATEGORY) == -1 &&
+				strings.LastIndex(zkPath, constant.CONSUMER_CATEGORY) == -1 {
+				go func(zkPath string, listener remoting.DataListener) {
+					l.listenDirEvent(zkPath, listener)
+					logger.Warnf("listenDirEvent(zkPath{%s}) goroutine exit now", zkPath)
+				}(dubboPath, listener)
+			}
 		}
 		select {
 		case zkEvent = <-childEventCh: