diff --git a/cluster/directory/base_directory.go b/cluster/directory/base_directory.go
index e93efbac7c62e267937152f7ba798a35018b6dd6..0e79cc40112c48288c7eb549d0fc5532cf0926e6 100644
--- a/cluster/directory/base_directory.go
+++ b/cluster/directory/base_directory.go
@@ -49,6 +49,10 @@ func (dir *BaseDirectory) RouterChain() router.Chain {
 	return dir.routerChain
 }
 
+func (dir *BaseDirectory) SetRouterChain(routerChain router.Chain) {
+	dir.routerChain = routerChain
+}
+
 func GetRouterURLSet() *gxset.HashSet {
 	return routerURLSet
 }
diff --git a/cluster/router/chain/factory.go b/cluster/router/chain/factory.go
deleted file mode 100644
index 1f24e6df7d3e1615960638a0d021a772229096f3..0000000000000000000000000000000000000000
--- a/cluster/router/chain/factory.go
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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 chain
-
-import (
-	"github.com/apache/dubbo-go/cluster/router"
-	"github.com/apache/dubbo-go/common"
-	"github.com/apache/dubbo-go/common/extension"
-)
-
-func init() {
-	extension.SetRouterChainsFactory("chain", NewRouterChainFactory)
-}
-
-type RouterChainFactory struct{}
-
-func (c RouterChainFactory) Router(url *common.URL) (router.Chain, error) {
-	return NewRouterChain(url)
-}
-
-func NewRouterChainFactory() router.ChainFactory {
-	return RouterChainFactory{}
-}
diff --git a/cluster/router/router.go b/cluster/router/router.go
index 6c833cab8483e9a1168a2f63112001060d71e723..48c88a95d259b0b1a8e7355f6641d16bfda715b3 100644
--- a/cluster/router/router.go
+++ b/cluster/router/router.go
@@ -29,11 +29,6 @@ type RouterFactory interface {
 	Router(*common.URL) (Router, error)
 }
 
-// ChainFactory Extension - Router Chain
-type ChainFactory interface {
-	Router(*common.URL) (Chain, error)
-}
-
 type Router interface {
 	Route([]protocol.Invoker, *common.URL, protocol.Invocation) []protocol.Invoker
 	Priority() int64
diff --git a/common/extension/router_factory.go b/common/extension/router_factory.go
index e6a1cec1ab8f52a612a686546281dc46d242c36b..8f916339e2d1ad059d58a82825026d3bd6ad68a9 100644
--- a/common/extension/router_factory.go
+++ b/common/extension/router_factory.go
@@ -22,8 +22,7 @@ import (
 )
 
 var (
-	routers      = make(map[string]func() router.RouterFactory)
-	routerChains = make(map[string]func() router.ChainFactory)
+	routers = make(map[string]func() router.RouterFactory)
 )
 
 func SetRouterFactory(name string, fun func() router.RouterFactory) {
@@ -37,17 +36,6 @@ func GetRouterFactory(name string) router.RouterFactory {
 	return routers[name]()
 }
 
-func SetRouterChainsFactory(name string, fun func() router.ChainFactory) {
-	routerChains[name] = fun
-}
-
-func GetRouterChainsFactory(name string) router.ChainFactory {
-	if routers[name] == nil {
-		panic("router_chain_factory for " + name + " is not existing, make sure you have import the package.")
-	}
-	return routerChains[name]()
-}
-
 func GetRouters() map[string]func() router.RouterFactory {
 	return routers
 }
diff --git a/registry/directory/directory.go b/registry/directory/directory.go
index 73adf2d92ebcf21f133ca1f71c9e90b7f592f13e..2001cb163be575df41cb54babb05c41a723369ba 100644
--- a/registry/directory/directory.go
+++ b/registry/directory/directory.go
@@ -31,6 +31,7 @@ import (
 import (
 	"github.com/apache/dubbo-go/cluster/directory"
 	"github.com/apache/dubbo-go/cluster/router"
+	"github.com/apache/dubbo-go/cluster/router/chain"
 	"github.com/apache/dubbo-go/common"
 	"github.com/apache/dubbo-go/common/constant"
 	"github.com/apache/dubbo-go/common/extension"
@@ -180,7 +181,7 @@ func toRouters(urls []*common.URL) []router.Router {
 			continue
 		}
 		url.Protocol = routerKey
-		factory := extension.GetRouterFactory(url.GetParam(constant.ROUTER_KEY, "condition"))
+		factory := extension.GetRouterFactory(url.GetParam(constant.ROUTER_KEY, routerKey))
 		router, e := factory.Router(url)
 		if e != nil {
 			logger.Error("factory.Router(url){%s} , error : %s", url, e)
@@ -219,18 +220,34 @@ func (dir *registryDirectory) toGroupInvokers() []protocol.Invoker {
 		//len is 1 it means no group setting ,so do not need cluster again
 		for _, invokers := range groupInvokersMap {
 			groupInvokersList = invokers
+			dir.buildRouterChain(invokers)
 		}
 	} else {
 		for _, invokers := range groupInvokersMap {
 			staticDir := directory.NewStaticDirectory(invokers)
 			cluster := extension.GetCluster(dir.GetUrl().SubURL.GetParam(constant.CLUSTER_KEY, constant.DEFAULT_CLUSTER))
 			groupInvokersList = append(groupInvokersList, cluster.Join(staticDir))
+
+			dir.buildRouterChain(invokers)
 		}
 	}
 
 	return groupInvokersList
 }
 
+func (dir *registryDirectory) buildRouterChain(invokers []protocol.Invoker) error {
+	if len(invokers) == 0 {
+		return perrors.Errorf("invokers == null")
+	}
+	url := invokers[0].GetUrl()
+	routerChain, e := chain.NewRouterChain(&url)
+	if e != nil {
+		return e
+	}
+	dir.SetRouterChain(routerChain)
+	return nil
+}
+
 func (dir *registryDirectory) uncacheInvoker(url *common.URL) {
 	logger.Debugf("service will be deleted in cache invokers: invokers key is  %s!", url.Key())
 	dir.cacheInvokersMap.Delete(url.Key())