diff --git a/cluster/router/chain/chain.go b/cluster/router/chain/chain.go
index 612c12d87d463a86c6f9f85d4167100f55bf25ab..f55cd07bc9b360d3d79a7004bcc46ee8e8bc0d89 100644
--- a/cluster/router/chain/chain.go
+++ b/cluster/router/chain/chain.go
@@ -65,6 +65,8 @@ type RouterChain struct {
 	notify chan struct{}
 	// Address cache
 	cache atomic.Value
+	// init
+	init sync.Once
 }
 
 // Route Loop routers in RouterChain and call Route method to determine the target invokers list.
@@ -111,6 +113,13 @@ func (c *RouterChain) SetInvokers(invokers []protocol.Invoker) {
 	c.invokers = invokers
 	c.mutex.Unlock()
 
+	// it should trigger init router for first call
+	c.init.Do(func() {
+		go func() {
+			c.notify <- struct{}{}
+		}()
+	})
+
 	c.count++
 	now := time.Now()
 	if c.count >= countThreshold && now.Sub(c.last) >= timeThreshold {
diff --git a/registry/directory/directory_test.go b/registry/directory/directory_test.go
index dde944d62410cee6429dbbc408eb364a354f1613..9008e6ecb79993626bac19a8fcf6870532386b01 100644
--- a/registry/directory/directory_test.go
+++ b/registry/directory/directory_test.go
@@ -124,7 +124,7 @@ func Test_Destroy(t *testing.T) {
 func Test_List(t *testing.T) {
 	registryDirectory, _ := normalRegistryDir()
 
-	time.Sleep(4e9)
+	time.Sleep(6e9)
 	assert.Len(t, registryDirectory.List(&invocation.RPCInvocation{}), 3)
 	assert.Equal(t, true, registryDirectory.IsAvailable())