diff --git a/registry/consul/registry.go b/registry/consul/registry.go
index 7f237a1f24330ac3c16d3ead392e0dbcc640d706..33bf6d2c3897b0e4c78d36198f09446d59f94a31 100644
--- a/registry/consul/registry.go
+++ b/registry/consul/registry.go
@@ -37,6 +37,7 @@ import (
 
 const (
 	registryConnDelay = 3
+	registryDestroyDefaultTimeout = time.Second
 )
 
 func init() {
@@ -55,6 +56,9 @@ type consulRegistry struct {
 	// Done field represents whether
 	// consul registry is closed.
 	done chan struct{}
+
+	// time wait when destroy
+	timeOut time.Duration
 }
 
 func newConsulRegistry(url *common.URL) (registry.Registry, error) {
@@ -68,6 +72,7 @@ func newConsulRegistry(url *common.URL) (registry.Registry, error) {
 		URL:    url,
 		client: client,
 		done:   make(chan struct{}),
+		timeOut: registryDestroyDefaultTimeout,
 	}
 
 	return r, nil
@@ -188,8 +193,25 @@ func (r *consulRegistry) IsAvailable() bool {
 // Destroy consul registry center
 func (r *consulRegistry) Destroy() {
 	if r.URL != nil{
-		if err := r.UnRegister(*r.URL); err != nil{
-			logger.Errorf("consul registry unregister with err: %s", err.Error())
+		done := make(chan struct{}, 1)
+		ticker := time.NewTicker(r.timeOut)
+		go func(){
+			defer func(){
+				if e := recover(); e != nil{
+					logger.Errorf("consulRegistry destory with panic: %v", e)
+				}
+				done <- struct{}{}
+			}()
+			if err := r.UnRegister(*r.URL); err != nil{
+				logger.Errorf("consul registry unregister with err: %s", err.Error())
+			}
+		}()
+		select {
+		case <- done:
+			logger.Infof("consulRegistry unregister done")
+		case <- ticker.C:
+			logger.Errorf("consul unregister timeout")
+			ticker.Stop()
 		}
 	}
 	close(r.done)
diff --git a/registry/consul/registry_test.go b/registry/consul/registry_test.go
index 94718f5ab657c198882f065a50e5d5a2c9d4bc6f..bc4fd400eba82b5f644426a922cf0018cf862d72 100644
--- a/registry/consul/registry_test.go
+++ b/registry/consul/registry_test.go
@@ -55,3 +55,19 @@ func (suite *consulRegistryTestSuite) testSubscribe() {
 	assert.NoError(suite.t, err)
 	suite.listener = listener
 }
+
+func (suite *consulRegistryTestSuite) testDestroy(){
+	consumerRegistryUrl := newConsumerRegistryUrl(registryHost, registryPort)
+	consumerRegistry, _ := newConsulRegistry(consumerRegistryUrl)
+	consulRegistryImp := consumerRegistry.(*consulRegistry)
+	assert.True(suite.t, consulRegistryImp.IsAvailable())
+	consulRegistryImp.Destroy()
+	assert.False(suite.t, consulRegistryImp.IsAvailable())
+
+	consumerRegistry, _ = newConsulRegistry(consumerRegistryUrl)
+	consulRegistryImp = consumerRegistry.(*consulRegistry)
+	consulRegistryImp.URL = nil
+	assert.True(suite.t, consulRegistryImp.IsAvailable())
+	consulRegistryImp.Destroy()
+	assert.False(suite.t, consulRegistryImp.IsAvailable())
+}
diff --git a/registry/consul/utils_test.go b/registry/consul/utils_test.go
index 939352dc088faa2c32be8173d0aa6f4516dfe503..819feb2916a958bd99f78d7ff33f7568b212c3bf 100644
--- a/registry/consul/utils_test.go
+++ b/registry/consul/utils_test.go
@@ -163,6 +163,7 @@ func test1(t *testing.T) {
 	suite.testListener(remoting.EventTypeAdd)
 	suite.testUnregister()
 	suite.testListener(remoting.EventTypeDel)
+	suite.testDestroy()
 }
 
 // subscribe -> register -> unregister
@@ -183,8 +184,11 @@ func test2(t *testing.T) {
 	suite.testListener(remoting.EventTypeAdd)
 	suite.testUnregister()
 	suite.testListener(remoting.EventTypeDel)
+	suite.testDestroy()
 }
 
+
+
 func TestConsulRegistry(t *testing.T) {
 	t.Run("test1", test1)
 	t.Run("test2", test2)