diff --git a/registry/consul/registry.go b/registry/consul/registry.go
index 869e1c1d75769447f8e3d2c0fb7817b1dc2db163..4d3718e58cd0f98b931ed525fe61f33713b6e71f 100644
--- a/registry/consul/registry.go
+++ b/registry/consul/registry.go
@@ -23,6 +23,7 @@ import (
 )
 
 import (
+	getty "github.com/apache/dubbo-getty"
 	consul "github.com/hashicorp/consul/api"
 	perrors "github.com/pkg/errors"
 )
@@ -56,6 +57,10 @@ type consulRegistry struct {
 	// Done field represents whether
 	// consul registry is closed.
 	done chan struct{}
+
+	// registeredURLs field represents all URLs that have been registered
+	// will be unregistered when destroyed
+	registeredURLs []*common.URL
 }
 
 func newConsulRegistry(url *common.URL) (registry.Registry, error) {
@@ -91,6 +96,7 @@ func (r *consulRegistry) Register(url *common.URL) error {
 
 // register actually register the @url
 func (r *consulRegistry) register(url *common.URL) error {
+	r.registeredURLs = append(r.registeredURLs, url.Clone())
 	service, err := buildService(url)
 	if err != nil {
 		return err
@@ -188,25 +194,26 @@ func (r *consulRegistry) IsAvailable() bool {
 
 // Destroy consul registry center
 func (r *consulRegistry) Destroy() {
-	if r.URL != nil {
-		done := make(chan struct{}, 1)
-		go func() {
-			defer func() {
-				if e := recover(); e != nil {
-					logger.Errorf("consulRegistry destroy with panic: %v", e)
-				}
-				done <- struct{}{}
-			}()
-			if err := r.UnRegister(r.URL); err != nil {
-				logger.Errorf("consul registry unregister with err: %s", err.Error())
+	done := make(chan struct{}, 1)
+	go func() {
+		defer func() {
+			if e := recover(); e != nil {
+				logger.Errorf("consulRegistry destroy with panic: %v", e)
 			}
+			done <- struct{}{}
 		}()
-		select {
-		case <-done:
-			logger.Infof("consulRegistry unregister done")
-		case <-time.After(registryDestroyDefaultTimeout):
-			logger.Errorf("consul unregister timeout")
+		for _, url := range r.registeredURLs {
+			if err := r.UnRegister(url); err != nil {
+				logger.Errorf("consul registry unregister with err: %s", err.Error())
+			}
 		}
+	}()
+	select {
+	case <-done:
+		logger.Infof("consulRegistry unregister done")
+	case <-getty.GetTimeWheel().After(registryDestroyDefaultTimeout):
+		logger.Errorf("consul unregister timeout")
 	}
+
 	close(r.done)
 }