diff --git a/common/extension/event_dispatcher.go b/common/extension/event_dispatcher.go
new file mode 100644
index 0000000000000000000000000000000000000000..3f7fcee17cddcdc5427baf9c095483e264e3973f
--- /dev/null
+++ b/common/extension/event_dispatcher.go
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package extension
+
+import (
+	"github.com/apache/dubbo-go/common/logger"
+	"github.com/apache/dubbo-go/common/observer"
+)
+
+var globalEventDispatcher observer.EventDispatcher
+
+var initEventListeners []observer.EventListener
+
+var (
+	dispatchers = make(map[string]func() observer.EventDispatcher, 8)
+)
+
+// SetEventDispatcher by name
+func SetEventDispatcher(name string, v func() observer.EventDispatcher) {
+	dispatchers[name] = v
+}
+
+// SetAndInitGlobalDispatcher
+func SetAndInitGlobalDispatcher(name string) {
+	if len(name) == 0 {
+		name = "direct"
+	}
+	if globalEventDispatcher != nil {
+		logger.Warnf("EventDispatcher already init. It will be replaced")
+	}
+	if dp, ok := dispatchers[name]; !ok || dp == nil {
+		panic("EventDispatcher for " + name + " is not existing, make sure you have import the package.")
+	}
+	globalEventDispatcher = dispatchers[name]()
+	globalEventDispatcher.AddEventListeners(initEventListeners)
+}
+
+// GetGlobalDispatcher
+func GetGlobalDispatcher() observer.EventDispatcher {
+	return globalEventDispatcher
+}
+
+// AddEventListener it will be added in global event dispatcher
+func AddEventListener(listener observer.EventListener) {
+	initEventListeners = append(initEventListeners, listener)
+}
diff --git a/common/observer/dispatcher/direct_event_dispatcher.go b/common/observer/dispatcher/direct_event_dispatcher.go
index b539ef92d5597d3f101bc2c3dbe3a768598ed015..2b7567b47ed40caa8867901ff0a05e0a2497cd31 100644
--- a/common/observer/dispatcher/direct_event_dispatcher.go
+++ b/common/observer/dispatcher/direct_event_dispatcher.go
@@ -22,12 +22,13 @@ import (
 )
 
 import (
+	"github.com/apache/dubbo-go/common/extension"
 	"github.com/apache/dubbo-go/common/logger"
 	"github.com/apache/dubbo-go/common/observer"
 )
 
 func init() {
-	observer.SetEventDispatcher("direct", NewDirectEventDispatcher)
+	extension.SetEventDispatcher("direct", NewDirectEventDispatcher)
 }
 
 // DirectEventDispatcher is align with DirectEventDispatcher interface in Java.
diff --git a/common/observer/event_dispatcher.go b/common/observer/event_dispatcher.go
index 8513818041b824645d97fbb39f0665d53b8798ae..17745e68c07065f954d456914fb276fadf6d975d 100644
--- a/common/observer/event_dispatcher.go
+++ b/common/observer/event_dispatcher.go
@@ -17,14 +17,6 @@
 
 package observer
 
-import (
-	"github.com/apache/dubbo-go/common/logger"
-)
-
-var globalEventDispatcher EventDispatcher
-
-var allEventListeners []EventListener
-
 // EventDispatcher is align with EventDispatcher interface in Java.
 // it's the top abstraction
 // Align with 2.7.5
@@ -33,37 +25,3 @@ type EventDispatcher interface {
 	// Dispatch event
 	Dispatch(event Event)
 }
-
-var (
-	dispatchers = make(map[string]func() EventDispatcher, 8)
-)
-
-// SetEventDispatcher by name
-func SetEventDispatcher(name string, v func() EventDispatcher) {
-	dispatchers[name] = v
-}
-
-// SetAndInitGlobalDispatcher
-func SetAndInitGlobalDispatcher(name string) {
-	if len(name) == 0 {
-		name = "direct"
-	}
-	if globalEventDispatcher != nil {
-		logger.Warnf("EventDispatcher already init. It will be replaced")
-	}
-	if dp, ok := dispatchers[name]; !ok || dp == nil {
-		panic("EventDispatcher for " + name + " is not existing, make sure you have import the package.")
-	}
-	globalEventDispatcher = dispatchers[name]()
-	globalEventDispatcher.AddEventListeners(allEventListeners)
-}
-
-// GetGlobalDispatcher
-func GetGlobalDispatcher() EventDispatcher {
-	return globalEventDispatcher
-}
-
-// AddEventListener it will be added in global event dispatcher
-func AddEventListener(listener EventListener) {
-	allEventListeners = append(allEventListeners, listener)
-}
diff --git a/config/config_loader.go b/config/config_loader.go
index b2ae9d2cc31b2c1d9108a5dd6ef274c402856d38..50b6043ed6606d2f0db48837fe55b7acf5d050a1 100644
--- a/config/config_loader.go
+++ b/config/config_loader.go
@@ -33,7 +33,6 @@ import (
 	"github.com/apache/dubbo-go/common/constant"
 	"github.com/apache/dubbo-go/common/extension"
 	"github.com/apache/dubbo-go/common/logger"
-	"github.com/apache/dubbo-go/common/observer"
 	_ "github.com/apache/dubbo-go/common/observer/dispatcher"
 )
 
@@ -102,7 +101,7 @@ func Load() {
 		eventDispatcherType = providerConfig.eventDispatcherType
 	}
 	// init EventDispatcher should before everything
-	observer.SetAndInitGlobalDispatcher(eventDispatcherType)
+	extension.SetAndInitGlobalDispatcher(eventDispatcherType)
 
 	// reference config
 	if consumerConfig == nil {
diff --git a/registry/listener/ServiceInstancesChangedListener.go b/registry/listener/ServiceInstancesChangedListener.go
index 3e3a5283de8fbe9d8c5d2ca41d2a79fba40190ec..0ad66a4b1045e343b809e90f6d4b4a5675eaa25a 100644
--- a/registry/listener/ServiceInstancesChangedListener.go
+++ b/registry/listener/ServiceInstancesChangedListener.go
@@ -26,10 +26,6 @@ import (
 	"github.com/apache/dubbo-go/common/observer/event"
 )
 
-func init() {
-	observer.AddEventListener(&ServiceInstancesChangedListener{})
-}
-
 // TODO (implement ConditionalEventListener)
 type ServiceInstancesChangedListener struct {
 	observer.EventListener