You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2020/08/06 05:20:00 UTC

[dubbo-go] 01/01: Revert "Ftr: dynamic tag router"

This is an automated email from the ASF dual-hosted git repository.

alexstocks pushed a commit to branch revert-665-featrue/tagRouter
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git

commit 603ffc19b81dc56d6001fb15e898690630bddb54
Author: Xin.Zh <dr...@foxmail.com>
AuthorDate: Thu Aug 6 13:19:51 2020 +0800

    Revert "Ftr: dynamic tag router"
---
 before_ut.sh                                  |   3 -
 cluster/router/condition/app_router_test.go   |   2 +-
 cluster/router/condition/listenable_router.go |   2 +-
 cluster/router/tag/file.go                    |   2 +-
 cluster/router/tag/router_rule.go             |  71 ------
 cluster/router/tag/router_rule_test.go        |  55 +----
 cluster/router/tag/tag.go                     |  39 ---
 cluster/router/tag/tag_router.go              | 333 +-------------------------
 cluster/router/tag/tag_router_test.go         | 245 +------------------
 common/constant/key.go                        |   3 -
 10 files changed, 22 insertions(+), 733 deletions(-)

diff --git a/before_ut.sh b/before_ut.sh
index b55e424..210e9e7 100755
--- a/before_ut.sh
+++ b/before_ut.sh
@@ -36,8 +36,5 @@ cp ${zkJar} cluster/router/chain/zookeeper-4unittest/contrib/fatjar
 mkdir -p cluster/router/condition/zookeeper-4unittest/contrib/fatjar
 cp ${zkJar} cluster/router/condition/zookeeper-4unittest/contrib/fatjar
 
-mkdir -p cluster/router/tag/zookeeper-4unittest/contrib/fatjar
-cp ${zkJar} cluster/router/tag/zookeeper-4unittest/contrib/fatjar
-
 mkdir -p metadata/report/zookeeper/zookeeper-4unittest/contrib/fatjar
 cp ${zkJar} metadata/report/zookeeper/zookeeper-4unittest/contrib/fatjar
\ No newline at end of file
diff --git a/cluster/router/condition/app_router_test.go b/cluster/router/condition/app_router_test.go
index ea18604..8b38f2d 100644
--- a/cluster/router/condition/app_router_test.go
+++ b/cluster/router/condition/app_router_test.go
@@ -24,6 +24,7 @@ import (
 )
 
 import (
+	_ "github.com/apache/dubbo-go/config_center/zookeeper"
 	"github.com/stretchr/testify/assert"
 )
 
@@ -33,7 +34,6 @@ import (
 	"github.com/apache/dubbo-go/common/constant"
 	"github.com/apache/dubbo-go/common/extension"
 	"github.com/apache/dubbo-go/config_center"
-	_ "github.com/apache/dubbo-go/config_center/zookeeper"
 	"github.com/apache/dubbo-go/remoting"
 	"github.com/apache/dubbo-go/remoting/zookeeper"
 )
diff --git a/cluster/router/condition/listenable_router.go b/cluster/router/condition/listenable_router.go
index 7f4f14a..4ccc19e 100644
--- a/cluster/router/condition/listenable_router.go
+++ b/cluster/router/condition/listenable_router.go
@@ -85,7 +85,7 @@ func newListenableRouter(url *common.URL, ruleKey string) (*AppRouter, error) {
 	return l, nil
 }
 
-// Process Process config change event, generate routers and set them to the listenableRouter instance
+// Process Process config change event , generate routers and set them to the listenableRouter instance
 func (l *listenableRouter) Process(event *config_center.ConfigChangeEvent) {
 	logger.Infof("Notification of condition rule, change type is:[%s] , raw rule is:[%v]", event.ConfigType, event.Value)
 	if remoting.EventTypeDel == event.ConfigType {
diff --git a/cluster/router/tag/file.go b/cluster/router/tag/file.go
index 433abcb..8144c83 100644
--- a/cluster/router/tag/file.go
+++ b/cluster/router/tag/file.go
@@ -42,7 +42,7 @@ type FileTagRouter struct {
 	force      bool
 }
 
-// NewFileTagRouter Create file tag router instance with content (from config file)
+// NewFileTagRouter Create file tag router instance with content ( from config file)
 func NewFileTagRouter(content []byte) (*FileTagRouter, error) {
 	fileRouter := &FileTagRouter{}
 	rule, err := getRule(string(content))
diff --git a/cluster/router/tag/router_rule.go b/cluster/router/tag/router_rule.go
index 5fb7ab1..926446d 100644
--- a/cluster/router/tag/router_rule.go
+++ b/cluster/router/tag/router_rule.go
@@ -22,27 +22,9 @@ import (
 	"github.com/apache/dubbo-go/common/yaml"
 )
 
-/**
- * %YAML1.2
- * ---
- * force: true
- * runtime: false
- * enabled: true
- * priority: 1
- * key: demo-provider
- * tags:
- * - name: tag1
- * addresses: [ip1, ip2]
- * - name: tag2
- * addresses: [ip3, ip4]
- * ...
- */
 // RouterRule RouterRule config read from config file or config center
 type RouterRule struct {
 	router.BaseRouterRule `yaml:",inline""`
-	Tags                  []Tag
-	addressToTagNames     map[string][]string
-	tagNameToAddresses    map[string][]string
 }
 
 func getRule(rawRule string) (*RouterRule, error) {
@@ -52,58 +34,5 @@ func getRule(rawRule string) (*RouterRule, error) {
 		return r, err
 	}
 	r.RawRule = rawRule
-	r.init()
 	return r, nil
 }
-
-func (t *RouterRule) init() {
-	t.addressToTagNames = make(map[string][]string, 8)
-	t.tagNameToAddresses = make(map[string][]string, 8)
-	for _, tag := range t.Tags {
-		for _, address := range tag.Addresses {
-			t.addressToTagNames[address] = append(t.addressToTagNames[address], tag.Name)
-		}
-		t.tagNameToAddresses[tag.Name] = tag.Addresses
-	}
-}
-
-func (t *RouterRule) getAddresses() []string {
-	var result = make([]string, 0, 8*len(t.Tags))
-	for _, tag := range t.Tags {
-		result = append(result, tag.Addresses...)
-	}
-	return result
-}
-
-func (t *RouterRule) getTagNames() []string {
-	var result = make([]string, 0, len(t.Tags))
-	for _, tag := range t.Tags {
-		result = append(result, tag.Name)
-	}
-	return result
-}
-
-func (t *RouterRule) hasTag(tag string) bool {
-	for _, t := range t.Tags {
-		if tag == t.Name {
-			return true
-		}
-	}
-	return false
-}
-
-func (t *RouterRule) getAddressToTagNames() map[string][]string {
-	return t.addressToTagNames
-}
-
-func (t *RouterRule) getTagNameToAddresses() map[string][]string {
-	return t.tagNameToAddresses
-}
-
-func (t *RouterRule) getTags() []Tag {
-	return t.Tags
-}
-
-func (t *RouterRule) setTags(tags []Tag) {
-	t.Tags = tags
-}
diff --git a/cluster/router/tag/router_rule_test.go b/cluster/router/tag/router_rule_test.go
index 4e0f5b7..2df6519 100644
--- a/cluster/router/tag/router_rule_test.go
+++ b/cluster/router/tag/router_rule_test.go
@@ -22,56 +22,19 @@ import (
 )
 
 import (
-	"github.com/stretchr/testify/suite"
+	"github.com/stretchr/testify/assert"
 )
 
-type RuleTestSuite struct {
-	suite.Suite
-	rule *RouterRule
-}
-
-func (suite *RuleTestSuite) SetupTest() {
-	var err error
+func TestGetRule(t *testing.T) {
 	yml := `
 scope: application
+runtime: true
 force: true
-runtime: false
-enabled: true
-priority: 1
-key: demo-provider
-tags:
-  - name: tag1
-    addresses: [ip1, ip2]
-  - name: tag2
-    addresses: [ip3, ip4]
 `
-	suite.rule, err = getRule(yml)
-	suite.Nil(err)
-}
-
-func (suite *RuleTestSuite) TestGetRule() {
-	var err error
-	suite.Equal(true, suite.rule.Force)
-	suite.Equal(false, suite.rule.Runtime)
-	suite.Equal("application", suite.rule.Scope)
-	suite.Equal(1, suite.rule.Priority)
-	suite.Equal("demo-provider", suite.rule.Key)
-	suite.Nil(err)
-}
-
-func (suite *RuleTestSuite) TestGetTagNames() {
-	suite.Equal([]string{"tag1", "tag2"}, suite.rule.getTagNames())
-}
-
-func (suite *RuleTestSuite) TestGetAddresses() {
-	suite.Equal([]string{"ip1", "ip2", "ip3", "ip4"}, suite.rule.getAddresses())
-}
-
-func (suite *RuleTestSuite) TestHasTag() {
-	suite.Equal(true, suite.rule.hasTag("tag1"))
-	suite.Equal(false, suite.rule.hasTag("tag404"))
-}
-
-func TestRuleTestSuite(t *testing.T) {
-	suite.Run(t, new(RuleTestSuite))
+	rule, e := getRule(yml)
+	assert.Nil(t, e)
+	assert.NotNil(t, rule)
+	assert.Equal(t, true, rule.Force)
+	assert.Equal(t, true, rule.Runtime)
+	assert.Equal(t, "application", rule.Scope)
 }
diff --git a/cluster/router/tag/tag.go b/cluster/router/tag/tag.go
deleted file mode 100644
index 73d10b5..0000000
--- a/cluster/router/tag/tag.go
+++ /dev/null
@@ -1,39 +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 tag
-
-type Tag struct {
-	Name      string
-	Addresses []string
-}
-
-func (t *Tag) getName() string {
-	return t.Name
-}
-
-func (t *Tag) setName(name string) {
-	t.Name = name
-}
-
-func (t *Tag) getAddresses() []string {
-	return t.Addresses
-}
-
-func (t *Tag) setAddresses(addresses []string) {
-	t.Addresses = addresses
-}
diff --git a/cluster/router/tag/tag_router.go b/cluster/router/tag/tag_router.go
index ece950e..e1376fd 100644
--- a/cluster/router/tag/tag_router.go
+++ b/cluster/router/tag/tag_router.go
@@ -18,10 +18,7 @@
 package tag
 
 import (
-	"errors"
-	"net"
 	"strconv"
-	"strings"
 )
 
 import (
@@ -30,21 +27,15 @@ import (
 
 import (
 	"github.com/apache/dubbo-go/common"
-	"github.com/apache/dubbo-go/common/config"
 	"github.com/apache/dubbo-go/common/constant"
-	"github.com/apache/dubbo-go/common/logger"
-	"github.com/apache/dubbo-go/config_center"
 	"github.com/apache/dubbo-go/protocol"
-	"github.com/apache/dubbo-go/remoting"
 )
 
 // tagRouter defines url, enable and the priority
 type tagRouter struct {
-	url           *common.URL
-	tagRouterRule *RouterRule
-	enabled       bool
-	priority      int64
-	application   string
+	url      *common.URL
+	enabled  bool
+	priority int64
 }
 
 // NewTagRouter returns a tagRouter instance if url is not nil
@@ -64,15 +55,6 @@ func (c *tagRouter) isEnabled() bool {
 	return c.enabled
 }
 
-func (c *tagRouter) SetApplication(app string) {
-	c.application = app
-}
-
-func (c *tagRouter) tagRouterRuleCopy() RouterRule {
-	routerRule := *c.tagRouterRule
-	return routerRule
-}
-
 // Route gets a list of invoker
 func (c *tagRouter) Route(invokers []protocol.Invoker, url *common.URL, invocation protocol.Invocation) []protocol.Invoker {
 	if !c.isEnabled() {
@@ -81,152 +63,7 @@ func (c *tagRouter) Route(invokers []protocol.Invoker, url *common.URL, invocati
 	if len(invokers) == 0 {
 		return invokers
 	}
-	if c.tagRouterRule == nil || !c.tagRouterRule.Valid || !c.tagRouterRule.Enabled {
-		return filterUsingStaticTag(invokers, url, invocation)
-	}
-	// since the rule can be changed by config center, we should copy one to use.
-	tagRouterRuleCopy := c.tagRouterRuleCopy()
-	tag, ok := invocation.Attachments()[constant.Tagkey]
-	if !ok {
-		tag = url.GetParam(constant.Tagkey, "")
-	}
-	var (
-		result    []protocol.Invoker
-		addresses []string
-	)
-	// if we are requesting for a Provider with a specific tag
-	if len(tag) > 0 {
-		addresses, _ = tagRouterRuleCopy.getTagNameToAddresses()[tag]
-		// filter by dynamic tag group first
-		if len(addresses) > 0 {
-			filterAddressMatches := func(invoker protocol.Invoker) bool {
-				url := invoker.GetUrl()
-				if len(addresses) > 0 && checkAddressMatch(addresses, url.Ip, url.Port) {
-					return true
-				}
-				return false
-			}
-			result = filterInvoker(invokers, filterAddressMatches)
-			if len(result) > 0 || tagRouterRuleCopy.Force {
-				return result
-			}
-		} else {
-			// dynamic tag group doesn't have any item about the requested app OR it's null after filtered by
-			// dynamic tag group but force=false. check static tag
-			filter := func(invoker protocol.Invoker) bool {
-				if invoker.GetUrl().GetParam(constant.Tagkey, "") == tag {
-					return true
-				}
-				return false
-			}
-			result = filterInvoker(invokers, filter)
-		}
-		// If there's no tagged providers that can match the current tagged request. force.tag is set by default
-		// to false, which means it will invoke any providers without a tag unless it's explicitly disallowed.
-		if len(result) > 0 || isForceUseTag(url, invocation) {
-			return result
-		} else {
-			// FAILOVER: return all Providers without any tags.
-			filterAddressNotMatches := func(invoker protocol.Invoker) bool {
-				url := invoker.GetUrl()
-				if len(addresses) == 0 || !checkAddressMatch(tagRouterRuleCopy.getAddresses(), url.Ip, url.Port) {
-					return true
-				}
-				return false
-			}
-			filterTagIsEmpty := func(invoker protocol.Invoker) bool {
-				if invoker.GetUrl().GetParam(constant.Tagkey, "") == "" {
-					return true
-				}
-				return false
-			}
-			return filterInvoker(invokers, filterAddressNotMatches, filterTagIsEmpty)
-		}
-	} else {
-		// return all addresses in dynamic tag group.
-		addresses = tagRouterRuleCopy.getAddresses()
-		if len(addresses) > 0 {
-			filterAddressNotMatches := func(invoker protocol.Invoker) bool {
-				url := invoker.GetUrl()
-				if len(addresses) == 0 || !checkAddressMatch(addresses, url.Ip, url.Port) {
-					return true
-				}
-				return false
-			}
-			result = filterInvoker(invokers, filterAddressNotMatches)
-			// 1. all addresses are in dynamic tag group, return empty list.
-			if len(result) == 0 {
-				return result
-			}
-		}
-		// 2. if there are some addresses that are not in any dynamic tag group, continue to filter using the
-		// static tag group.
-		filter := func(invoker protocol.Invoker) bool {
-			localTag := invoker.GetUrl().GetParam(constant.Tagkey, "")
-			return localTag == "" || !(tagRouterRuleCopy.hasTag(localTag))
-		}
-		return filterInvoker(result, filter)
-	}
-}
-
-func (c *tagRouter) Process(event *config_center.ConfigChangeEvent) {
-	logger.Infof("Notification of tag rule, change type is:[%s] , raw rule is:[%v]", event.ConfigType, event.Value)
-	if remoting.EventTypeDel == event.ConfigType {
-		c.tagRouterRule = nil
-		return
-	} else {
-		content, ok := event.Value.(string)
-		if !ok {
-			logger.Errorf("Convert event content fail,raw content:[%s] ", event.Value)
-			return
-		}
-
-		routerRule, err := getRule(content)
-		if err != nil {
-			logger.Errorf("Parse dynamic tag router rule fail,error:[%s] ", err)
-			return
-		}
-		c.tagRouterRule = routerRule
-		return
-	}
-}
-
-func (c *tagRouter) Notify(invokers []protocol.Invoker) {
-	if len(invokers) == 0 {
-		return
-	}
-	invoker := invokers[0]
-	url := invoker.GetUrl()
-	providerApplication := url.GetParam(constant.RemoteApplicationKey, "")
-	if providerApplication == "" {
-		logger.Error("TagRouter must getConfig from or subscribe to a specific application, but the application " +
-			"in this TagRouter is not specified.")
-		return
-	}
-	dynamicConfiguration := config.GetEnvInstance().GetDynamicConfiguration()
-	if dynamicConfiguration == nil {
-		logger.Error("Get dynamicConfiguration fail, dynamicConfiguration is nil, init config center plugin please")
-		return
-	}
-
-	if providerApplication != c.application {
-		dynamicConfiguration.RemoveListener(c.application+constant.TagRouterRuleSuffix, c)
-	}
-
-	routerKey := providerApplication + constant.TagRouterRuleSuffix
-	dynamicConfiguration.AddListener(routerKey, c)
-	//get rule
-	rule, err := dynamicConfiguration.GetRule(routerKey, config_center.WithGroup(config_center.DEFAULT_GROUP))
-	if len(rule) == 0 || err != nil {
-		logger.Errorf("Get rule fail, config rule{%s},  error{%v}", rule, err)
-		return
-	}
-	if rule != "" {
-		c.Process(&config_center.ConfigChangeEvent{
-			Key:        routerKey,
-			Value:      rule,
-			ConfigType: remoting.EventTypeUpdate})
-	}
+	return filterUsingStaticTag(invokers, url, invocation)
 }
 
 // URL gets the url of tagRouter
@@ -239,7 +76,7 @@ func (c *tagRouter) Priority() int64 {
 	return c.priority
 }
 
-// filterUsingStaticTag gets a list of invoker using static tag, If there's no dynamic tag rule being set, use static tag in URL
+// filterUsingStaticTag gets a list of invoker using static tag
 func filterUsingStaticTag(invokers []protocol.Invoker, url *common.URL, invocation protocol.Invocation) []protocol.Invoker {
 	if tag, ok := invocation.Attachments()[constant.Tagkey]; ok {
 		result := make([]protocol.Invoker, 0, 8)
@@ -263,163 +100,3 @@ func isForceUseTag(url *common.URL, invocation protocol.Invocation) bool {
 	}
 	return false
 }
-
-type filter func(protocol.Invoker) bool
-
-func filterInvoker(invokers []protocol.Invoker, filters ...filter) []protocol.Invoker {
-	var res []protocol.Invoker
-OUTER:
-	for _, invoker := range invokers {
-		for _, filter := range filters {
-			if !filter(invoker) {
-				continue OUTER
-			}
-		}
-		res = append(res, invoker)
-	}
-	return res
-}
-
-// TODO: need move to dubbogo/gost
-func checkAddressMatch(addresses []string, host, port string) bool {
-	for _, address := range addresses {
-		if matchIp(address, host, port) {
-			return true
-		}
-		if address == net.JoinHostPort(constant.ANYHOST_VALUE, port) {
-			return true
-		}
-	}
-	return false
-}
-
-func matchIp(pattern, host, port string) bool {
-	// if the pattern is subnet format, it will not be allowed to config port param in pattern.
-	if strings.Contains(pattern, "/") {
-		_, subnet, _ := net.ParseCIDR(pattern)
-		if subnet != nil && subnet.Contains(net.ParseIP(host)) {
-			return true
-		}
-		return false
-	}
-	return matchIpRange(pattern, host, port)
-}
-
-func matchIpRange(pattern, host, port string) bool {
-	if pattern == "" || host == "" {
-		logger.Error("Illegal Argument pattern or hostName. Pattern:" + pattern + ", Host:" + host)
-		return false
-	}
-
-	pattern = strings.TrimSpace(pattern)
-	if "*.*.*.*" == pattern || "*" == pattern {
-		return true
-	}
-
-	isIpv4 := true
-	ip4 := net.ParseIP(host).To4()
-
-	if ip4 == nil {
-		isIpv4 = false
-	}
-
-	hostAndPort := getPatternHostAndPort(pattern, isIpv4)
-	if hostAndPort[1] != "" && hostAndPort[1] != port {
-		return false
-	}
-
-	pattern = hostAndPort[0]
-	// TODO 常量化
-	splitCharacter := "."
-	if !isIpv4 {
-		splitCharacter = ":"
-	}
-
-	mask := strings.Split(pattern, splitCharacter)
-	// check format of pattern
-	if err := checkHostPattern(pattern, mask, isIpv4); err != nil {
-		logger.Error(err)
-		return false
-	}
-
-	if pattern == host {
-		return true
-	}
-
-	// short name condition
-	if !ipPatternContains(pattern) {
-		return pattern == host
-	}
-
-	ipAddress := strings.Split(host, splitCharacter)
-	for i := 0; i < len(mask); i++ {
-		if "*" == mask[i] || mask[i] == ipAddress[i] {
-			continue
-		} else if strings.Contains(mask[i], "-") {
-			rangeNumStrs := strings.Split(mask[i], "-")
-			if len(rangeNumStrs) != 2 {
-				logger.Error("There is wrong format of ip Address: " + mask[i])
-				return false
-			}
-			min := getNumOfIpSegment(rangeNumStrs[0], isIpv4)
-			max := getNumOfIpSegment(rangeNumStrs[1], isIpv4)
-			ip := getNumOfIpSegment(ipAddress[i], isIpv4)
-			if ip < min || ip > max {
-				return false
-			}
-		} else if "0" == ipAddress[i] && "0" == mask[i] || "00" == mask[i] || "000" == mask[i] || "0000" == mask[i] {
-			continue
-		} else if mask[i] != ipAddress[i] {
-			return false
-		}
-	}
-	return true
-}
-
-func ipPatternContains(pattern string) bool {
-	return strings.Contains(pattern, "*") || strings.Contains(pattern, "-")
-}
-
-func checkHostPattern(pattern string, mask []string, isIpv4 bool) error {
-	if !isIpv4 {
-		if len(mask) != 8 && ipPatternContains(pattern) {
-			return errors.New("If you config ip expression that contains '*' or '-', please fill qualified ip pattern like 234e:0:4567:0:0:0:3d:*. ")
-		}
-		if len(mask) != 8 && !strings.Contains(pattern, "::") {
-			return errors.New("The host is ipv6, but the pattern is not ipv6 pattern : " + pattern)
-		}
-	} else {
-		if len(mask) != 4 {
-			return errors.New("The host is ipv4, but the pattern is not ipv4 pattern : " + pattern)
-		}
-	}
-	return nil
-}
-
-func getPatternHostAndPort(pattern string, isIpv4 bool) []string {
-	result := make([]string, 2)
-	if strings.HasPrefix(pattern, "[") && strings.Contains(pattern, "]:") {
-		end := strings.Index(pattern, "]:")
-		result[0] = pattern[1:end]
-		result[1] = pattern[end+2:]
-	} else if strings.HasPrefix(pattern, "[") && strings.HasSuffix(pattern, "]") {
-		result[0] = pattern[1 : len(pattern)-1]
-		result[1] = ""
-	} else if isIpv4 && strings.Contains(pattern, ":") {
-		end := strings.Index(pattern, ":")
-		result[0] = pattern[:end]
-		result[1] = pattern[end+1:]
-	} else {
-		result[0] = pattern
-	}
-	return result
-}
-
-func getNumOfIpSegment(ipSegment string, isIpv4 bool) int {
-	if isIpv4 {
-		ipSeg, _ := strconv.Atoi(ipSegment)
-		return ipSeg
-	}
-	ipSeg, _ := strconv.ParseInt(ipSegment, 0, 16)
-	return int(ipSeg)
-}
diff --git a/cluster/router/tag/tag_router_test.go b/cluster/router/tag/tag_router_test.go
index e5ddc28..000b3ec 100644
--- a/cluster/router/tag/tag_router_test.go
+++ b/cluster/router/tag/tag_router_test.go
@@ -19,43 +19,25 @@ package tag
 
 import (
 	"context"
-	"fmt"
-	"github.com/stretchr/testify/suite"
 	"testing"
-	"time"
 )
 
 import (
-	"github.com/dubbogo/go-zookeeper/zk"
 	"github.com/stretchr/testify/assert"
 )
 
 import (
 	"github.com/apache/dubbo-go/common"
-	"github.com/apache/dubbo-go/common/config"
-	"github.com/apache/dubbo-go/common/constant"
-	"github.com/apache/dubbo-go/common/extension"
-	"github.com/apache/dubbo-go/config_center"
-	_ "github.com/apache/dubbo-go/config_center/zookeeper"
 	"github.com/apache/dubbo-go/protocol"
 	"github.com/apache/dubbo-go/protocol/invocation"
-	"github.com/apache/dubbo-go/remoting"
-	"github.com/apache/dubbo-go/remoting/zookeeper"
 )
 
 const (
-	tagRouterTestHangZhouUrl       = "dubbo://127.0.0.1:20000/com.ikurento.user.UserProvider?interface=com.ikurento.user.UserProvider&group=&version=2.6.0&enabled=true&dubbo.tag=hangzhou&remote.application=test-tag"
-	tagRouterTestShangHaiUrl       = "dubbo://127.0.0.1:20002/com.ikurento.user.UserProvider?interface=com.ikurento.user.UserProvider&group=&version=2.6.0&enabled=true&dubbo.tag=shanghai&remote.application=test-tag"
-	tagRouterTestBeijingUrl        = "dubbo://127.0.0.1:20000/com.ikurento.user.UserProvider?interface=com.ikurento.user.UserProvider&group=&version=2.6.0&enabled=true&dubbo.tag=beijing&remote.application=test-tag"
-	tagRouterTestEnabledBeijingUrl = "dubbo://127.0.0.1:20004/com.ikurento.user.UserProvider?interface=com.ikurento.user.UserProvider&group=&version=2.6.0&enabled=false&dubbo.tag=beijing&remote.application=test-tag"
-	tagRouterTestUserConsumer      = "dubbo://127.0.0.1:20005/com.ikurento.user.UserConsumer?interface=com.ikurento.user.UserConsumer&group=&version=2.6.0&enabled=true&remote.application=test-tag"
-	tagRouterTestUserConsumerTag   = "dubbo://127.0.0.1:20000/com.ikurento.user.UserConsumer?interface=com.ikurento.user.UserConsumer&group=&version=2.6.0&enabled=true&dubbo.force.tag=true&remote.application=test-tag"
-
-	tagRouterTestDynamicIpv4Provider1 = "dubbo://127.0.0.1:20001/com.ikurento.user.UserConsumer?interface=com.ikurento.user.UserConsumer&group=&version=2.6.0&enabled=true&remote.application=test-tag"
-	tagRouterTestDynamicIpv4Provider2 = "dubbo://127.0.0.1:20002/com.ikurento.user.UserConsumer?interface=com.ikurento.user.UserConsumer&group=&version=2.6.0&enabled=true&remote.application=test-tag"
-	tagRouterTestDynamicIpv4Provider3 = "dubbo://127.0.0.1:20003/com.ikurento.user.UserConsumer?interface=com.ikurento.user.UserConsumer&group=&version=2.6.0&enabled=true&remote.application=test-tag"
-	tagRouterTestDynamicIpv4Provider4 = "dubbo://127.0.0.1:20004/com.ikurento.user.UserConsumer?interface=com.ikurento.user.UserConsumer&group=&version=2.6.0&enabled=true&remote.application=test-tag&dubbo.tag=tag4"
-	tagRouterTestDynamicIpv4Provider5 = "dubbo://127.0.0.1:20005/com.ikurento.user.UserConsumer?interface=com.ikurento.user.UserConsumer&group=&version=2.6.0&enabled=true&remote.application=test-tag&dubbo.tag=tag5"
+	tagRouterTestHangZhouUrl     = "dubbo://127.0.0.1:20000/com.ikurento.user.UserProvider?interface=com.ikurento.user.UserProvider&group=&version=2.6.0&enabled=true&dubbo.tag=hangzhou"
+	tagRouterTestShangHaiUrl     = "dubbo://127.0.0.1:20000/com.ikurento.user.UserProvider?interface=com.ikurento.user.UserProvider&group=&version=2.6.0&enabled=true&dubbo.tag=shanghai"
+	tagRouterTestBeijingUrl      = "dubbo://127.0.0.1:20000/com.ikurento.user.UserProvider?interface=com.ikurento.user.UserProvider&group=&version=2.6.0&enabled=true&dubbo.tag=beijing"
+	tagRouterTestUserConsumer    = "dubbo://127.0.0.1:20000/com.ikurento.user.UserConsumer?interface=com.ikurento.user.UserConsumer&group=&version=2.6.0&enabled=true"
+	tagRouterTestUserConsumerTag = "dubbo://127.0.0.1:20000/com.ikurento.user.UserConsumer?interface=com.ikurento.user.UserConsumer&group=&version=2.6.0&enabled=true&dubbo.force.tag=true"
 
 	tagRouterTestDubboTag      = "dubbo.tag"
 	tagRouterTestDubboForceTag = "dubbo.force.tag"
@@ -63,15 +45,6 @@ const (
 	tagRouterTestGuangZhou     = "guangzhou"
 	tagRouterTestFalse         = "false"
 	tagRouterTestTrue          = "true"
-
-	routerPath    = "/dubbo/config/dubbo/test-tag.tag-router"
-	routerLocalIP = "127.0.0.1"
-	routerZk      = "zookeeper"
-)
-
-var (
-	zkFormat        = "zookeeper://%s:%d"
-	conditionFormat = "condition://%s/com.foo.BarService"
 )
 
 // MockInvoker is only mock the Invoker to support test tagRouter
@@ -187,211 +160,3 @@ func TestTagRouterRouteNoForce(t *testing.T) {
 	invRst2 := tagRouter.Route(invokers, &u1, inv)
 	assert.Equal(t, 3, len(invRst2))
 }
-
-func TestFilterInvoker(t *testing.T) {
-	u2, e2 := common.NewURL(tagRouterTestHangZhouUrl)
-	u3, e3 := common.NewURL(tagRouterTestShangHaiUrl)
-	u4, e4 := common.NewURL(tagRouterTestBeijingUrl)
-	u5, e5 := common.NewURL(tagRouterTestEnabledBeijingUrl)
-	assert.Nil(t, e2)
-	assert.Nil(t, e3)
-	assert.Nil(t, e4)
-	assert.Nil(t, e5)
-	inv2 := NewMockInvoker(u2)
-	inv3 := NewMockInvoker(u3)
-	inv4 := NewMockInvoker(u4)
-	inv5 := NewMockInvoker(u5)
-	var invokers []protocol.Invoker
-	invokers = append(invokers, inv2, inv3, inv4, inv5)
-	filterTag := func(invoker protocol.Invoker) bool {
-		if invoker.GetUrl().GetParam(constant.Tagkey, "") == "beijing" {
-			return true
-		}
-		return false
-	}
-	res := filterInvoker(invokers, filterTag)
-	assert.Equal(t, []protocol.Invoker{inv4, inv5}, res)
-	flag := true
-	filterEnabled := func(invoker protocol.Invoker) bool {
-		if invoker.GetUrl().GetParamBool(constant.RouterEnabled, false) == flag {
-			return true
-		}
-		return false
-	}
-	res2 := filterInvoker(invokers, filterTag, filterEnabled)
-	assert.Equal(t, []protocol.Invoker{inv4}, res2)
-}
-
-type DynamicTagRouter struct {
-	suite.Suite
-	rule *RouterRule
-
-	route       *tagRouter
-	zkClient    *zookeeper.ZookeeperClient
-	testCluster *zk.TestCluster
-	invokers    []protocol.Invoker
-	url         *common.URL
-}
-
-func TestDynamicTagRouter(t *testing.T) {
-	dtg := &DynamicTagRouter{}
-	u1, _ := common.NewURL(tagRouterTestDynamicIpv4Provider1)
-	u2, _ := common.NewURL(tagRouterTestDynamicIpv4Provider2)
-	u3, _ := common.NewURL(tagRouterTestDynamicIpv4Provider3)
-	u4, _ := common.NewURL(tagRouterTestDynamicIpv4Provider4)
-	u5, _ := common.NewURL(tagRouterTestDynamicIpv4Provider5)
-	inv1 := NewMockInvoker(u1)
-	inv2 := NewMockInvoker(u2)
-	inv3 := NewMockInvoker(u3)
-	inv4 := NewMockInvoker(u4)
-	inv5 := NewMockInvoker(u5)
-	dtg.invokers = append(dtg.invokers, inv1, inv2, inv3, inv4, inv5)
-	suite.Run(t, dtg)
-}
-
-func (suite *DynamicTagRouter) SetupTest() {
-	var err error
-	testYML := `enabled: true
-scope: application
-force: true
-runtime: false
-valid: true
-priority: 1
-key: demo-provider
-tags:
-  - name: tag1
-    addresses: ["127.0.0.1:20001"]
-  - name: tag2
-    addresses: ["127.0.0.1:20002"]
-  - name: tag3
-    addresses: ["127.0.0.1:20003", "127.0.0.1:20004"]
-`
-	ts, z, _, err := zookeeper.NewMockZookeeperClient("test", 15*time.Second)
-	suite.NoError(err)
-	err = z.Create(routerPath)
-	suite.NoError(err)
-
-	suite.zkClient = z
-	suite.testCluster = ts
-
-	_, err = z.Conn.Set(routerPath, []byte(testYML), 0)
-	suite.NoError(err)
-
-	zkUrl, _ := common.NewURL(fmt.Sprintf(zkFormat, routerLocalIP, suite.testCluster.Servers[0].Port))
-	configuration, err := extension.GetConfigCenterFactory(routerZk).GetDynamicConfiguration(&zkUrl)
-	config.GetEnvInstance().SetDynamicConfiguration(configuration)
-
-	suite.Nil(err)
-	suite.NotNil(configuration)
-
-	url, e1 := common.NewURL(tagRouterTestUserConsumerTag)
-	suite.Nil(e1)
-
-	tagRouter, err := NewTagRouter(&url)
-	suite.Nil(err)
-	suite.NotNil(tagRouter)
-	suite.route = tagRouter
-	suite.url = &url
-}
-
-func (suite *DynamicTagRouter) TearDownTest() {
-	suite.zkClient.Close()
-	suite.testCluster.Stop()
-}
-
-func (suite *DynamicTagRouter) TestDynamicTagRouterSetByIPv4() {
-	invokers := suite.invokers
-	suite.route.Notify(invokers)
-	suite.NotNil(suite.route.tagRouterRule)
-
-	consumer := &invocation.RPCInvocation{}
-	consumer.SetAttachments(tagRouterTestDubboTag, "tag1")
-	targetInvokers := suite.route.Route(invokers, suite.url, consumer)
-	suite.Equal(1, len(targetInvokers))
-	suite.Equal(targetInvokers[0], suite.invokers[0])
-
-	consumer.SetAttachments(tagRouterTestDubboTag, "tag3")
-	targetInvokers = suite.route.Route(invokers, suite.url, consumer)
-	suite.Equal(2, len(targetInvokers))
-	suite.Equal(targetInvokers, []protocol.Invoker{suite.invokers[2], suite.invokers[3]})
-}
-
-func (suite *DynamicTagRouter) TestDynamicTagRouterStaticTag() {
-	invokers := suite.invokers
-	consumer := &invocation.RPCInvocation{}
-	consumer.SetAttachments(tagRouterTestDubboTag, "tag4")
-	targetInvokers := suite.route.Route(invokers, suite.url, consumer)
-	suite.Equal(1, len(targetInvokers))
-	suite.Equal(targetInvokers[0], suite.invokers[3])
-}
-
-// Teas no tag and return a address are not in dynamic tag group
-func (suite *DynamicTagRouter) TestDynamicTagRouterByNoTagAndAddressMatch() {
-	invokers := suite.invokers
-	suite.route.Notify(invokers)
-	suite.NotNil(suite.route.tagRouterRule)
-	consumer := &invocation.RPCInvocation{}
-	targetInvokers := suite.route.Route(invokers, suite.url, consumer)
-	suite.Equal(1, len(targetInvokers))
-	suite.Equal(targetInvokers[0], suite.invokers[4])
-	// test if there are some addresses that are not in any dynamic tag group, continue to filter using the static tag group.
-	consumer.SetAttachments(tagRouterTestDubboTag, "tag5")
-	targetInvokers = suite.route.Route(invokers, suite.url, consumer)
-	suite.Equal(1, len(targetInvokers))
-	suite.Equal(targetInvokers[0], suite.invokers[4])
-}
-
-func (suite *DynamicTagRouter) TestTODO() {
-	testYML := `enabled: true
-scope: application
-force: true
-runtime: false
-valid: true
-priority: 1
-key: demo-provider
-tags:
-  - name: tag1
-    addresses: ["127.0.0.1:20001"]
-  - name: tag2
-    addresses: ["127.0.0.1:20002"]
-  - name: tag3
-    addresses: ["127.0.0.1:20003", "127.0.0.1:20004"]
-`
-	_, err := suite.zkClient.Conn.Set(routerPath, []byte(testYML), 1)
-	suite.NoError(err)
-
-	zkUrl, _ := common.NewURL(fmt.Sprintf(zkFormat, routerLocalIP, suite.testCluster.Servers[0].Port))
-	configuration, err := extension.GetConfigCenterFactory(routerZk).GetDynamicConfiguration(&zkUrl)
-	config.GetEnvInstance().SetDynamicConfiguration(configuration)
-}
-
-func TestProcess(t *testing.T) {
-	u1, err := common.NewURL(tagRouterTestUserConsumerTag)
-	assert.Nil(t, err)
-	tagRouter, e := NewTagRouter(&u1)
-	assert.Nil(t, e)
-	assert.NotNil(t, tagRouter)
-
-	testYML := `
-scope: application
-force: true
-runtime: false
-enabled: true
-valid: true
-priority: 1
-key: demo-provider
-tags:
-  - name: beijing
-    addresses: [192.168.1.1, 192.168.1.2]
-  - name: hangzhou
-    addresses: [192.168.1.3, 192.168.1.4]
-`
-	tagRouter.Process(&config_center.ConfigChangeEvent{Value: testYML, ConfigType: remoting.EventTypeAdd})
-	assert.NotNil(t, tagRouter.tagRouterRule)
-	assert.Equal(t, []string{"beijing", "hangzhou"}, tagRouter.tagRouterRule.getTagNames())
-	assert.Equal(t, []string{"192.168.1.1", "192.168.1.2", "192.168.1.3", "192.168.1.4"}, tagRouter.tagRouterRule.getAddresses())
-	assert.Equal(t, []string{"192.168.1.3", "192.168.1.4"}, tagRouter.tagRouterRule.getTagNameToAddresses()["hangzhou"])
-	assert.Equal(t, []string{"beijing"}, tagRouter.tagRouterRule.getAddressToTagNames()["192.168.1.1"])
-	tagRouter.Process(&config_center.ConfigChangeEvent{ConfigType: remoting.EventTypeDel})
-	assert.Nil(t, tagRouter.tagRouterRule)
-}
diff --git a/common/constant/key.go b/common/constant/key.go
index 72072dd..ea9bad9 100644
--- a/common/constant/key.go
+++ b/common/constant/key.go
@@ -188,9 +188,6 @@ const (
 	HealthCheckRouterName = "health_check"
 	// TagRouterName Specify the name of TagRouter
 	TagRouterName = "tag"
-	// TagRouterRuleSuffix Specify tag router suffix
-	TagRouterRuleSuffix  = ".tag-router"
-	RemoteApplicationKey = "remote.application"
 	// ConditionRouterRuleSuffix Specify condition router suffix
 	ConditionRouterRuleSuffix = ".condition-router"