You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by ti...@apache.org on 2021/08/05 01:21:35 UTC

[servicecomb-service-center] branch master updated: Change: Remove the dependency registration API, VersionRule mechanism, Dependence of * (#1125)

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

tianxiaoliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-service-center.git


The following commit(s) were added to refs/heads/master by this push:
     new 4db45fb  Change: Remove the dependency registration API, VersionRule mechanism, Dependence of * (#1125)
4db45fb is described below

commit 4db45fbbe341998c1447471f8ad2450885de2aaa
Author: little-cui <su...@qq.com>
AuthorDate: Thu Aug 5 09:21:28 2021 +0800

    Change: Remove the dependency registration API, VersionRule mechanism, Dependence of * (#1125)
    
    * Change: Remove the dependency registration API, VersionRule mechanism, Dependence of *
    
    * Update docs
    
    * Fix: UT
---
 datasource/cache/ms_cache.go                       |   4 +-
 datasource/dep.go                                  |   1 -
 datasource/dep_test.go                             | 388 -------------
 datasource/dependency_util.go                      |  11 -
 datasource/etcd/cache/common.go                    |  16 +-
 datasource/etcd/cache/dependency.go                |  17 +-
 datasource/etcd/cache/filter_consistency.go        |  14 +-
 datasource/etcd/cache/filter_consumer.go           |   4 +-
 datasource/etcd/cache/filter_instances.go          |  28 +-
 datasource/etcd/cache/filter_permission.go         |  14 +-
 datasource/etcd/cache/filter_service.go            |   2 +-
 datasource/etcd/cache/filter_tags.go               |  12 +-
 datasource/etcd/cache/filter_version.go            |  30 +-
 datasource/etcd/cache/instance.go                  |  18 +-
 datasource/etcd/dep.go                             |  62 +-
 datasource/etcd/event/dependency_event_handler.go  |   8 +-
 .../event/dependency_rule_event_handler_test.go    |  12 +-
 datasource/etcd/ms.go                              |  38 +-
 datasource/etcd/path/key_convertor.go              |  12 -
 datasource/etcd/path/key_convertor_test.go         |  14 -
 datasource/etcd/path/key_generator.go              |  61 +-
 datasource/etcd/path/key_generator_test.go         |  15 -
 datasource/etcd/util.go                            |   5 +-
 datasource/etcd/util/dependency.go                 |   9 +-
 datasource/etcd/util/dependency_query.go           | 133 +----
 datasource/etcd/util/dependency_query_test.go      |  96 ++++
 datasource/etcd/util/dependency_util.go            |  87 +--
 ...{dependency_test.go => dependency_util_test.go} |  91 +--
 datasource/etcd/util/microservice_util.go          |  53 +-
 .../etcd/util/{util_suite_test.go => util_test.go} |  98 ++--
 datasource/instance_test.go                        | 119 ++--
 datasource/mongo/client/dao/dep.go                 |   5 +-
 datasource/mongo/dep.go                            | 109 +---
 datasource/mongo/dep_util.go                       |  12 +
 datasource/mongo/dependency_query.go               | 287 +---------
 datasource/mongo/event/instance_event_handler.go   |   4 +-
 datasource/mongo/ms.go                             |  97 +---
 datasource/service_test.go                         |  38 --
 datasource/tag_test.go                             |   3 -
 docs/openapi/v4.yaml                               |  14 +-
 integration/apis.go                                |   7 -
 integration/instances_test.go                      | 137 +++--
 integration/microservices_test.go                  | 267 +--------
 pkg/proto/service.go                               |   2 -
 pkg/validate/validator.go                          |   7 +
 server/rest/controller/v3/dependency_controller.go |   2 -
 server/rest/controller/v4/dependency_controller.go |  54 --
 server/rest/controller/v4/instance_controller.go   |   1 -
 server/service/disco/dependency.go                 |  24 -
 server/service/disco/dependency_test.go            | 621 +--------------------
 server/service/disco/instance_test.go              | 268 ++-------
 server/service/disco/microservice_test.go          |  63 +--
 server/service/disco/tag_test.go                   |   2 -
 server/service/validator/dependency_validator.go   |  76 ---
 server/service/validator/instance_validator.go     |   6 +-
 server/service/validator/microservice_validator.go |  19 +-
 server/service/validator/validator.go              |   5 +-
 57 files changed, 645 insertions(+), 2957 deletions(-)

diff --git a/datasource/cache/ms_cache.go b/datasource/cache/ms_cache.go
index 5325546..9c7cd8a 100644
--- a/datasource/cache/ms_cache.go
+++ b/datasource/cache/ms_cache.go
@@ -33,7 +33,7 @@ const (
 )
 
 func GetProviderServiceOfDeps(provider *discovery.MicroService) (*discovery.MicroServiceDependency, bool) {
-	res := sd.Store().Dep().Cache().GetValue(genDepserivceKey(Provider, provider))
+	res := sd.Store().Dep().Cache().GetValue(genDepServiceKey(Provider, provider))
 	deps, ok := transCacheToDep(res)
 	if !ok {
 		return nil, false
@@ -56,7 +56,7 @@ func transCacheToDep(cache []interface{}) ([]*discovery.MicroServiceDependency,
 	return res, true
 }
 
-func genDepserivceKey(ruleType string, service *discovery.MicroService) string {
+func genDepServiceKey(ruleType string, service *discovery.MicroService) string {
 	return strings.Join([]string{ruleType, service.AppId, service.ServiceName, service.Version}, "/")
 }
 
diff --git a/datasource/dep.go b/datasource/dep.go
index 1be1222..d3cee31 100644
--- a/datasource/dep.go
+++ b/datasource/dep.go
@@ -27,6 +27,5 @@ import (
 type DependencyManager interface {
 	SearchProviderDependency(ctx context.Context, request *pb.GetDependenciesRequest) (*pb.GetProDependenciesResponse, error)
 	SearchConsumerDependency(ctx context.Context, request *pb.GetDependenciesRequest) (*pb.GetConDependenciesResponse, error)
-	AddOrUpdateDependencies(ctx context.Context, dependencyInfos []*pb.ConsumerDependency, override bool) (*pb.Response, error)
 	DependencyHandle(ctx context.Context) error
 }
diff --git a/datasource/dep_test.go b/datasource/dep_test.go
index e3e9ee7..435d881 100644
--- a/datasource/dep_test.go
+++ b/datasource/dep_test.go
@@ -27,389 +27,6 @@ import (
 	"github.com/stretchr/testify/assert"
 )
 
-func Test_Create(t *testing.T) {
-	var (
-		consumerId1 string
-		consumerId2 string
-		consumerId3 string
-	)
-	t.Run("create service, should be passed", func(t *testing.T) {
-		resp, err := datasource.GetMetadataManager().RegisterService(depGetContext(), &pb.CreateServiceRequest{
-			Service: &pb.MicroService{
-				AppId:       "dep_create_dep_group",
-				ServiceName: "dep_create_dep_consumer",
-				Version:     "1.0.0",
-				Level:       "FRONT",
-				Status:      pb.MS_UP,
-			},
-		})
-		assert.NotNil(t, resp)
-		assert.NoError(t, err)
-		assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
-		consumerId1 = resp.ServiceId
-
-		resp, err = datasource.GetMetadataManager().RegisterService(depGetContext(), &pb.CreateServiceRequest{
-			Service: &pb.MicroService{
-				AppId:       "dep_create_dep_group",
-				ServiceName: "dep_create_dep_consumer_all",
-				Version:     "1.0.0",
-				Level:       "FRONT",
-				Status:      pb.MS_UP,
-			},
-		})
-		assert.NotNil(t, resp)
-		assert.NoError(t, err)
-		assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
-		consumerId3 = resp.ServiceId
-
-		resp, err = datasource.GetMetadataManager().RegisterService(depGetContext(), &pb.CreateServiceRequest{
-			Service: &pb.MicroService{
-				Environment: pb.ENV_PROD,
-				AppId:       "dep_create_dep_group",
-				ServiceName: "dep_create_dep_consumer",
-				Version:     "1.0.0",
-				Level:       "FRONT",
-				Status:      pb.MS_UP,
-			},
-		})
-		assert.NotNil(t, resp)
-		assert.NoError(t, err)
-		assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
-		consumerId2 = resp.ServiceId
-
-		resp, err = datasource.GetMetadataManager().RegisterService(depGetContext(), &pb.CreateServiceRequest{
-			Service: &pb.MicroService{
-				AppId:       "dep_create_dep_group",
-				ServiceName: "dep_create_dep_provider",
-				Version:     "1.0.0",
-				Level:       "FRONT",
-				Status:      pb.MS_UP,
-			},
-		})
-		assert.NotNil(t, resp)
-		assert.NoError(t, err)
-		assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
-
-		resp, err = datasource.GetMetadataManager().RegisterService(depGetContext(), &pb.CreateServiceRequest{
-			Service: &pb.MicroService{
-				AppId:       "dep_create_dep_group",
-				ServiceName: "dep_create_dep_provider",
-				Version:     "1.0.1",
-				Level:       "FRONT",
-				Status:      pb.MS_UP,
-			},
-		})
-		assert.NotNil(t, resp)
-		assert.NoError(t, err)
-		assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
-
-		resp, err = datasource.GetMetadataManager().RegisterService(depGetContext(), &pb.CreateServiceRequest{
-			Service: &pb.MicroService{
-				Environment: pb.ENV_PROD,
-				AppId:       "dep_create_dep_group",
-				ServiceName: "dep_create_dep_provider",
-				Version:     "1.0.0",
-				Level:       "FRONT",
-				Status:      pb.MS_UP,
-			},
-		})
-		assert.NotNil(t, resp)
-		assert.NoError(t, err)
-		assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
-	})
-
-	t.Run("add dep and search, when request is invalid, should be failed", func(t *testing.T) {
-		consumer := &pb.MicroServiceKey{
-			AppId:       "dep_create_dep_group",
-			ServiceName: "dep_create_dep_consumer",
-			Version:     "1.0.0",
-		}
-		providers := []*pb.MicroServiceKey{
-			{
-				AppId:       "dep_create_dep_group",
-				ServiceName: "dep_create_dep_provider",
-				Version:     "1.0.0",
-			},
-		}
-
-		// consumer does not exist
-		resp, err := datasource.GetDependencyManager().AddOrUpdateDependencies(depGetContext(), []*pb.ConsumerDependency{
-			{
-				Consumer: &pb.MicroServiceKey{
-					AppId:       "noexistapp",
-					ServiceName: "noexistservice",
-					Version:     "1.0.0",
-				},
-				Providers: providers,
-			},
-		}, false)
-		assert.NotNil(t, resp)
-		assert.NoError(t, err)
-		assert.Equal(t, pb.ErrServiceNotExists, resp.GetCode())
-
-		err = datasource.GetDependencyManager().DependencyHandle(getContext())
-		assert.NoError(t, err)
-
-		// provider in diff env
-		resp, err = datasource.GetDependencyManager().AddOrUpdateDependencies(depGetContext(), []*pb.ConsumerDependency{
-			{
-				Consumer: consumer,
-				Providers: []*pb.MicroServiceKey{
-					{
-						Environment: pb.ENV_PROD,
-						AppId:       "dep_service_group_provider",
-						ServiceName: "dep_service_name_provider",
-						Version:     "latest",
-					},
-				},
-			},
-		}, false)
-		assert.NotNil(t, resp)
-		assert.NoError(t, err)
-		assert.Equal(t, pb.ResponseSuccess, resp.GetCode())
-
-		//consumer in diff env
-		consumer.Environment = pb.ENV_PROD
-		resp, err = datasource.GetDependencyManager().AddOrUpdateDependencies(depGetContext(), []*pb.ConsumerDependency{
-			{
-				Consumer: consumer,
-				Providers: []*pb.MicroServiceKey{
-					{
-						AppId:       "dep_service_group_provider",
-						ServiceName: "dep_service_name_provider",
-						Version:     "latest",
-					},
-				},
-			},
-		}, false)
-		assert.NotNil(t, resp)
-		assert.NoError(t, err)
-		assert.Equal(t, pb.ResponseSuccess, resp.GetCode())
-
-		err = datasource.GetDependencyManager().DependencyHandle(getContext())
-		assert.NoError(t, err)
-
-		respCon, err := datasource.GetDependencyManager().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
-			ServiceId: consumerId1,
-		})
-		assert.NotNil(t, respCon)
-		assert.NoError(t, err)
-		assert.Equal(t, 0, len(respCon.Providers))
-
-		respCon, err = datasource.GetDependencyManager().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
-			ServiceId: consumerId2,
-		})
-		assert.NotNil(t, respCon)
-		assert.NoError(t, err)
-		assert.Equal(t, 0, len(respCon.Providers))
-	})
-
-	t.Run("add dep and search,,when request is valid, should be passed", func(t *testing.T) {
-		consumer := &pb.MicroServiceKey{
-			ServiceName: "dep_create_dep_consumer",
-			AppId:       "dep_create_dep_group",
-			Version:     "1.0.0",
-		}
-
-		// add latest
-		resp, err := datasource.GetDependencyManager().AddOrUpdateDependencies(depGetContext(), []*pb.ConsumerDependency{
-			{
-				Consumer: consumer,
-				Providers: []*pb.MicroServiceKey{
-					{
-						AppId:       "dep_create_dep_group",
-						ServiceName: "dep_create_dep_provider",
-						Version:     "latest",
-					},
-				},
-			},
-		}, false)
-		assert.NotNil(t, resp)
-		assert.NoError(t, err)
-		assert.Equal(t, pb.ResponseSuccess, resp.GetCode())
-
-		err = datasource.GetDependencyManager().DependencyHandle(getContext())
-		assert.NoError(t, err)
-
-		respPro, err := datasource.GetDependencyManager().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
-			ServiceId: consumerId1,
-		})
-		assert.NotNil(t, respPro)
-		assert.NoError(t, err)
-		assert.NotEqual(t, 0, len(respPro.Providers))
-		assert.Equal(t, "1.0.1", respPro.Providers[0].Version)
-
-		// add 1.0.0+
-		resp, err = datasource.GetDependencyManager().AddOrUpdateDependencies(depGetContext(), []*pb.ConsumerDependency{
-			{
-				Consumer: consumer,
-				Providers: []*pb.MicroServiceKey{
-					{
-						AppId:       "dep_create_dep_group",
-						ServiceName: "dep_create_dep_provider",
-						Version:     "1.0.0+",
-					},
-				},
-			},
-		}, false)
-		assert.NotNil(t, resp)
-		assert.NoError(t, err)
-		assert.Equal(t, pb.ResponseSuccess, resp.GetCode())
-
-		err = datasource.GetDependencyManager().DependencyHandle(getContext())
-		assert.NoError(t, err)
-
-		respPro, err = datasource.GetDependencyManager().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
-			ServiceId: consumerId1,
-		})
-		assert.NotNil(t, respPro)
-		assert.NoError(t, err)
-		assert.Equal(t, 2, len(respPro.Providers))
-
-		// add *
-		resp, err = datasource.GetDependencyManager().AddOrUpdateDependencies(depGetContext(), []*pb.ConsumerDependency{
-			{
-				Consumer: &pb.MicroServiceKey{
-					ServiceName: "dep_create_dep_consumer_all",
-					AppId:       "dep_create_dep_group",
-					Version:     "1.0.0",
-				},
-				Providers: []*pb.MicroServiceKey{
-					{
-						ServiceName: "*",
-					},
-				},
-			},
-		}, false)
-		assert.NotNil(t, resp)
-		assert.NoError(t, err)
-		assert.Equal(t, pb.ResponseSuccess, resp.GetCode())
-
-		respPro, err = datasource.GetDependencyManager().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
-			ServiceId: consumerId3,
-		})
-		assert.NotNil(t, respPro)
-		assert.NoError(t, err)
-
-		// clean all
-		resp, err = datasource.GetDependencyManager().AddOrUpdateDependencies(depGetContext(), []*pb.ConsumerDependency{
-			{
-				Consumer: &pb.MicroServiceKey{
-					ServiceName: "dep_create_dep_consumer_all",
-					AppId:       "dep_create_dep_group",
-					Version:     "1.0.0",
-				},
-				Providers: nil,
-			},
-		}, false)
-		assert.NotNil(t, resp)
-		assert.NoError(t, err)
-		assert.Equal(t, pb.ResponseSuccess, resp.GetCode())
-
-		// add multiple providers
-		resp, err = datasource.GetDependencyManager().AddOrUpdateDependencies(depGetContext(), []*pb.ConsumerDependency{
-			{
-				Consumer: consumer,
-				Providers: []*pb.MicroServiceKey{
-					{
-						AppId:       "dep_create_dep_group",
-						ServiceName: "dep_create_dep_provider",
-						Version:     "1.0.0",
-					},
-					{
-						ServiceName: "*",
-					},
-				},
-			},
-		}, false)
-		assert.NotNil(t, resp)
-		assert.NoError(t, err)
-		assert.Equal(t, pb.ResponseSuccess, resp.GetCode())
-
-		// add 1.0.0-2.0.0 to override *
-		resp, err = datasource.GetDependencyManager().AddOrUpdateDependencies(depGetContext(), []*pb.ConsumerDependency{
-			{
-				Consumer: consumer,
-				Providers: []*pb.MicroServiceKey{
-					{
-						AppId:       "dep_create_dep_group",
-						ServiceName: "dep_create_dep_provider",
-						Version:     "1.0.0-1.0.1",
-					},
-				},
-			},
-		}, false)
-		assert.NotNil(t, resp)
-		assert.NoError(t, err)
-		assert.Equal(t, pb.ResponseSuccess, resp.GetCode())
-
-		err = datasource.GetDependencyManager().DependencyHandle(getContext())
-		assert.NoError(t, err)
-
-		respPro, err = datasource.GetDependencyManager().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
-			ServiceId: consumerId1,
-		})
-		assert.NotNil(t, respPro)
-		assert.NoError(t, err)
-		assert.Equal(t, "1.0.0", respPro.Providers[0].Version)
-
-		// add not override
-		respAdd, err := datasource.GetDependencyManager().AddOrUpdateDependencies(depGetContext(), []*pb.ConsumerDependency{
-			{
-				Consumer: consumer,
-				Providers: []*pb.MicroServiceKey{
-					{
-						AppId:       "dep_create_dep_group",
-						ServiceName: "dep_create_dep_provider",
-						Version:     "1.0.0-3.0.0",
-					},
-				},
-			},
-		}, false)
-		assert.NotNil(t, respAdd)
-		assert.NoError(t, err)
-		assert.Equal(t, pb.ResponseSuccess, respAdd.GetCode())
-
-		err = datasource.GetDependencyManager().DependencyHandle(getContext())
-		assert.NoError(t, err)
-
-		respPro, err = datasource.GetDependencyManager().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
-			ServiceId: consumerId1,
-		})
-		assert.NotNil(t, respPro)
-		assert.NoError(t, err)
-
-		// add provider is empty
-		resp, err = datasource.GetDependencyManager().AddOrUpdateDependencies(depGetContext(), []*pb.ConsumerDependency{
-			{
-				Consumer:  consumer,
-				Providers: []*pb.MicroServiceKey{},
-			},
-		}, false)
-		assert.NotNil(t, resp)
-		assert.NoError(t, err)
-		assert.Equal(t, pb.ResponseSuccess, resp.GetCode())
-
-		resp, err = datasource.GetDependencyManager().AddOrUpdateDependencies(depGetContext(), []*pb.ConsumerDependency{
-			{
-				Consumer: consumer,
-			},
-		}, false)
-		assert.NotNil(t, resp)
-		assert.NoError(t, err)
-		assert.Equal(t, pb.ResponseSuccess, resp.GetCode())
-
-		err = datasource.GetDependencyManager().DependencyHandle(getContext())
-		assert.NoError(t, err)
-
-		respPro, err = datasource.GetDependencyManager().SearchConsumerDependency(depGetContext(), &pb.GetDependenciesRequest{
-			ServiceId: consumerId1,
-		})
-		assert.NotNil(t, respPro)
-		assert.NoError(t, err)
-	})
-}
-
 func Test_Get(t *testing.T) {
 	var (
 		consumerId1 string
@@ -483,7 +100,6 @@ func Test_Get(t *testing.T) {
 			ConsumerServiceId: consumerId1,
 			AppId:             "dep_get_dep_group",
 			ServiceName:       "dep_get_dep_provider",
-			VersionRule:       "1.0.0+",
 		})
 		assert.NotNil(t, resp)
 		assert.NoError(t, err)
@@ -511,7 +127,6 @@ func Test_Get(t *testing.T) {
 			ConsumerServiceId: consumerId1,
 			AppId:             "dep_get_dep_group",
 			ServiceName:       "dep_get_dep_consumer",
-			VersionRule:       "1.0.0+",
 		})
 		assert.NotNil(t, resp)
 		assert.NoError(t, err)
@@ -532,7 +147,6 @@ func Test_Get(t *testing.T) {
 			ConsumerServiceId: providerId2,
 			AppId:             "dep_get_dep_group",
 			ServiceName:       "dep_get_dep_finder",
-			VersionRule:       "1.0.0+",
 		})
 		assert.NotNil(t, resp)
 		assert.NoError(t, err)
@@ -556,7 +170,6 @@ func Test_Get(t *testing.T) {
 			ConsumerServiceId: providerId2,
 			AppId:             "dep_get_dep_group",
 			ServiceName:       "dep_get_dep_finder",
-			VersionRule:       "1.0.0+",
 		})
 		assert.NotNil(t, resp)
 		assert.NoError(t, err)
@@ -609,7 +222,6 @@ func Test_Get(t *testing.T) {
 			ConsumerServiceId: providerId2,
 			AppId:             "dep_get_dep_group",
 			ServiceName:       "dep_get_dep_finder",
-			VersionRule:       "1.0.0+",
 		})
 		assert.NotNil(t, resp)
 		assert.NoError(t, err)
diff --git a/datasource/dependency_util.go b/datasource/dependency_util.go
index 37ac69a..6733fbc 100644
--- a/datasource/dependency_util.go
+++ b/datasource/dependency_util.go
@@ -88,13 +88,6 @@ func ParseAddOrUpdateRules(ctx context.Context, dep *Dependency, oldProviderRule
 		if ok, _ := ContainServiceDependency(oldProviderRules.Dependency, tmpProviderRule); ok {
 			continue
 		}
-
-		if tmpProviderRule.ServiceName == "*" {
-			createDependencyRuleList = append([]*discovery.MicroServiceKey{}, tmpProviderRule)
-			deleteDependencyRuleList = oldProviderRules.Dependency
-			break
-		}
-
 		createDependencyRuleList = append(createDependencyRuleList, tmpProviderRule)
 		old := IsNeedUpdate(oldProviderRules.Dependency, tmpProviderRule)
 		if old != nil {
@@ -102,14 +95,10 @@ func ParseAddOrUpdateRules(ctx context.Context, dep *Dependency, oldProviderRule
 		}
 	}
 	for _, oldProviderRule := range oldProviderRules.Dependency {
-		if oldProviderRule.ServiceName == "*" {
-			return
-		}
 		if ok, _ := ContainServiceDependency(deleteDependencyRuleList, oldProviderRule); !ok {
 			existDependencyRuleList = append(existDependencyRuleList, oldProviderRule)
 		}
 	}
-
 	dep.ProvidersRule = append(createDependencyRuleList, existDependencyRuleList...)
 	setDep(dep, createDependencyRuleList, existDependencyRuleList, deleteDependencyRuleList)
 }
diff --git a/datasource/etcd/cache/common.go b/datasource/etcd/cache/common.go
index 112dff9..929d176 100644
--- a/datasource/etcd/cache/common.go
+++ b/datasource/etcd/cache/common.go
@@ -29,14 +29,14 @@ import (
 type ClustersIndex map[string]int
 
 const (
-	CtxFindConsumer         util.CtxKey = "_consumer"
-	CtxFindProvider         util.CtxKey = "_provider"
-	CtxFindProviderInstance util.CtxKey = "_provider_instance"
-	CtxFindTags             util.CtxKey = "_tags"
-	CtxFindRequestRev       util.CtxKey = "_rev"
-
-	Find = "_find"
-	Dep  = "_dep"
+	CtxConsumerID          util.CtxKey = "_consumer"
+	CtxProviderKey         util.CtxKey = "_provider"
+	CtxProviderInstanceKey util.CtxKey = "_provider_instance"
+	CtxTags                util.CtxKey = "_tags"
+	CtxRequestRev          util.CtxKey = "_rev"
+
+	FindResult = "_find"
+	DepResult  = "_dep"
 
 	DefaultCacheMaxSize = 10000
 )
diff --git a/datasource/etcd/cache/dependency.go b/datasource/etcd/cache/dependency.go
index 5d11982..5ec1e72 100644
--- a/datasource/etcd/cache/dependency.go
+++ b/datasource/etcd/cache/dependency.go
@@ -36,30 +36,31 @@ func init() {
 }
 
 type DependencyRuleItem struct {
-	VersionRule string
+	// Access whether the cache is access by outside
+	Access bool
 }
 
 type DependencyRuleCache struct {
 	*cache.Tree
 }
 
-func (f *DependencyRuleCache) ExistVersionRule(ctx context.Context, consumerID string, provider *pb.MicroServiceKey) bool {
+func (f *DependencyRuleCache) ExistRule(ctx context.Context, consumerID string, provider *pb.MicroServiceKey) bool {
 	cloneCtx := context.WithValue(context.WithValue(ctx,
-		CtxFindConsumer, consumerID),
-		CtxFindProvider, provider)
+		CtxConsumerID, consumerID),
+		CtxProviderKey, provider)
 
 	node, _ := f.Tree.Get(cloneCtx, cache.Options().Temporary(ctx.Value(util.CtxNocache) == "1"))
 	if node == nil {
 		return false
 	}
-	v := node.Cache.Get(Dep).(*DependencyRuleItem)
-	if v.VersionRule != provider.Version {
-		v.VersionRule = provider.Version
+	v := node.Cache.Get(DepResult).(*DependencyRuleItem)
+	if !v.Access {
+		v.Access = true
 		return false
 	}
 	return true
 }
 
 func (f *DependencyRuleCache) Remove(provider *pb.MicroServiceKey) {
-	f.Tree.Remove(context.WithValue(context.Background(), CtxFindProvider, provider))
+	f.Tree.Remove(context.WithValue(context.Background(), CtxProviderKey, provider))
 }
diff --git a/datasource/etcd/cache/filter_consistency.go b/datasource/etcd/cache/filter_consistency.go
index a33ea05..ff499aa 100644
--- a/datasource/etcd/cache/filter_consistency.go
+++ b/datasource/etcd/cache/filter_consistency.go
@@ -34,8 +34,8 @@ type ConsistencyFilter struct {
 }
 
 func (f *ConsistencyFilter) Name(ctx context.Context, parent *cache.Node) string {
-	item := parent.Cache.Get(Find).(*VersionRuleCacheItem)
-	requestRev := ctx.Value(CtxFindRequestRev).(string)
+	item := parent.Cache.Get(FindResult).(*VersionRuleCacheItem)
+	requestRev := ctx.Value(CtxRequestRev).(string)
 	if len(requestRev) == 0 || requestRev == item.Rev {
 		return ""
 	}
@@ -50,8 +50,8 @@ func (f *ConsistencyFilter) Name(ctx context.Context, parent *cache.Node) string
 // It's impossible to guarantee consistency if the backend is not creditable,
 // thus in this condition RevisionFilter uses cache only.
 func (f *ConsistencyFilter) Init(ctx context.Context, parent *cache.Node) (node *cache.Node, err error) {
-	pCache := parent.Cache.Get(Find).(*VersionRuleCacheItem)
-	requestRev := ctx.Value(CtxFindRequestRev).(string)
+	pCache := parent.Cache.Get(FindResult).(*VersionRuleCacheItem)
+	requestRev := ctx.Value(CtxRequestRev).(string)
 	// do not need to check consistency between sc instances:
 	// 1. request without rev param
 	// 2. request rev is the same as cache current sc instance
@@ -59,13 +59,13 @@ func (f *ConsistencyFilter) Init(ctx context.Context, parent *cache.Node) (node
 	if len(requestRev) == 0 || requestRev == pCache.Rev ||
 		!(kv.Store().Instance().Creditable()) {
 		node = cache.NewNode()
-		node.Cache.Set(Find, pCache)
+		node.Cache.Set(FindResult, pCache)
 		return
 	}
 
 	if pCache.BrokenWait() {
 		node = cache.NewNode()
-		node.Cache.Set(Find, pCache)
+		node.Cache.Set(FindResult, pCache)
 		return
 	}
 
@@ -82,6 +82,6 @@ func (f *ConsistencyFilter) Init(ctx context.Context, parent *cache.Node) (node
 	pCache.Broken()
 
 	node = cache.NewNode()
-	node.Cache.Set(Find, pCache)
+	node.Cache.Set(FindResult, pCache)
 	return
 }
diff --git a/datasource/etcd/cache/filter_consumer.go b/datasource/etcd/cache/filter_consumer.go
index 420f258..e16135d 100644
--- a/datasource/etcd/cache/filter_consumer.go
+++ b/datasource/etcd/cache/filter_consumer.go
@@ -27,11 +27,11 @@ type ConsumerFilter struct {
 }
 
 func (f *ConsumerFilter) Name(ctx context.Context, _ *cache.Node) string {
-	return ctx.Value(CtxFindConsumer).(string)
+	return ctx.Value(CtxConsumerID).(string)
 }
 
 func (f *ConsumerFilter) Init(ctx context.Context, parent *cache.Node) (node *cache.Node, err error) {
 	node = cache.NewNode()
-	node.Cache.Set(Dep, &DependencyRuleItem{})
+	node.Cache.Set(DepResult, &DependencyRuleItem{})
 	return
 }
diff --git a/datasource/etcd/cache/filter_instances.go b/datasource/etcd/cache/filter_instances.go
index 1d53899..ef04896 100644
--- a/datasource/etcd/cache/filter_instances.go
+++ b/datasource/etcd/cache/filter_instances.go
@@ -35,7 +35,7 @@ type InstancesFilter struct {
 }
 
 func (f *InstancesFilter) Name(ctx context.Context, _ *cache.Node) string {
-	instanceKey, ok := ctx.Value(CtxFindProviderInstance).(*pb.HeartbeatSetElement)
+	instanceKey, ok := ctx.Value(CtxProviderInstanceKey).(*pb.HeartbeatSetElement)
 	if ok {
 		return instanceKey.ServiceId + path.SPLIT + instanceKey.InstanceId
 	}
@@ -43,7 +43,7 @@ func (f *InstancesFilter) Name(ctx context.Context, _ *cache.Node) string {
 }
 
 func (f *InstancesFilter) Init(ctx context.Context, parent *cache.Node) (node *cache.Node, err error) {
-	pCopy := *parent.Cache.Get(Find).(*VersionRuleCacheItem)
+	pCopy := *parent.Cache.Get(FindResult).(*VersionRuleCacheItem)
 
 	pCopy.Instances, pCopy.Rev, err = f.Find(ctx, parent)
 	if err != nil {
@@ -52,16 +52,16 @@ func (f *InstancesFilter) Init(ctx context.Context, parent *cache.Node) (node *c
 
 	pCopy.InitBrokenQueue()
 	node = cache.NewNode()
-	node.Cache.Set(Find, &pCopy)
+	node.Cache.Set(FindResult, &pCopy)
 	return
 }
 
 func (f *InstancesFilter) Find(ctx context.Context, parent *cache.Node) (
 	instances []*pb.MicroServiceInstance, rev string, err error) {
-	pCache := parent.Cache.Get(Find).(*VersionRuleCacheItem)
-	provider := ctx.Value(CtxFindProvider).(*pb.MicroServiceKey)
+	pCache := parent.Cache.Get(FindResult).(*VersionRuleCacheItem)
+	provider := ctx.Value(CtxProviderKey).(*pb.MicroServiceKey)
 
-	instanceKey, ok := ctx.Value(CtxFindProviderInstance).(*pb.HeartbeatSetElement)
+	instanceKey, ok := ctx.Value(CtxProviderInstanceKey).(*pb.HeartbeatSetElement)
 	if ok {
 		if len(pCache.ServiceIds) == 0 {
 			// can not find by instanceKey.ServiceID after pre-filters init
@@ -72,9 +72,9 @@ func (f *InstancesFilter) Find(ctx context.Context, parent *cache.Node) (
 		instances, rev, err = f.BatchFindInstances(ctx, provider.Tenant, pCache.ServiceIds)
 	}
 	if err != nil {
-		consumer := ctx.Value(CtxFindConsumer).(*pb.MicroService)
-		findFlag := fmt.Sprintf("consumer '%s' find provider %s/%s/%s", consumer.ServiceId,
-			provider.AppId, provider.ServiceName, provider.Version)
+		consumer := ctx.Value(CtxConsumerID).(*pb.MicroService)
+		findFlag := fmt.Sprintf("consumer '%s' find provider %s/%s", consumer.ServiceId,
+			provider.AppId, provider.ServiceName)
 		log.Errorf(err, "Find failed, %s", findFlag)
 	}
 	return
@@ -105,8 +105,9 @@ func (f *InstancesFilter) findInstances(ctx context.Context, domainProject, serv
 
 func (f *InstancesFilter) FindInstances(ctx context.Context, domainProject string, instanceKey *pb.HeartbeatSetElement) (instances []*pb.MicroServiceInstance, rev string, err error) {
 	var (
-		maxRevs = make([]int64, len(getOrCreateClustersIndex()))
-		counts  = make([]int64, len(getOrCreateClustersIndex()))
+		index   = getOrCreateClustersIndex()
+		maxRevs = make([]int64, len(index))
+		counts  = make([]int64, len(index))
 	)
 	instances, err = f.findInstances(ctx, domainProject, instanceKey.ServiceId, instanceKey.InstanceId, maxRevs, counts)
 	if err != nil {
@@ -117,8 +118,9 @@ func (f *InstancesFilter) FindInstances(ctx context.Context, domainProject strin
 
 func (f *InstancesFilter) BatchFindInstances(ctx context.Context, domainProject string, serviceIDs []string) (instances []*pb.MicroServiceInstance, rev string, err error) {
 	var (
-		maxRevs = make([]int64, len(getOrCreateClustersIndex()))
-		counts  = make([]int64, len(getOrCreateClustersIndex()))
+		index   = getOrCreateClustersIndex()
+		maxRevs = make([]int64, len(index))
+		counts  = make([]int64, len(index))
 	)
 	for _, providerServiceID := range serviceIDs {
 		insts, err := f.findInstances(ctx, domainProject, providerServiceID, "", maxRevs, counts)
diff --git a/datasource/etcd/cache/filter_permission.go b/datasource/etcd/cache/filter_permission.go
index ad9e3f0..9c2e355 100644
--- a/datasource/etcd/cache/filter_permission.go
+++ b/datasource/etcd/cache/filter_permission.go
@@ -32,19 +32,19 @@ type AccessibleFilter struct {
 }
 
 func (f *AccessibleFilter) Name(ctx context.Context, _ *cache.Node) string {
-	consumer := ctx.Value(CtxFindConsumer).(*pb.MicroService)
+	consumer := ctx.Value(CtxConsumerID).(*pb.MicroService)
 	return consumer.ServiceId
 }
 
 func (f *AccessibleFilter) Init(ctx context.Context, parent *cache.Node) (node *cache.Node, err error) {
 	var ids []string
-	consumerID := ctx.Value(CtxFindConsumer).(*pb.MicroService).ServiceId
-	pCopy := *parent.Cache.Get(Find).(*VersionRuleCacheItem)
+	consumerID := ctx.Value(CtxConsumerID).(*pb.MicroService).ServiceId
+	pCopy := *parent.Cache.Get(FindResult).(*VersionRuleCacheItem)
 	for _, providerServiceID := range pCopy.ServiceIds {
 		if err := util.Accessible(ctx, consumerID, providerServiceID); err != nil {
-			provider := ctx.Value(CtxFindProvider).(*pb.MicroServiceKey)
-			findFlag := fmt.Sprintf("consumer '%s' find provider %s/%s/%s", consumerID,
-				provider.AppId, provider.ServiceName, provider.Version)
+			provider := ctx.Value(CtxProviderKey).(*pb.MicroServiceKey)
+			findFlag := fmt.Sprintf("consumer '%s' find provider %s/%s", consumerID,
+				provider.AppId, provider.ServiceName)
 			log.Errorf(err, "AccessibleFilter failed, %s", findFlag)
 			continue
 		}
@@ -54,6 +54,6 @@ func (f *AccessibleFilter) Init(ctx context.Context, parent *cache.Node) (node *
 	pCopy.ServiceIds = ids
 
 	node = cache.NewNode()
-	node.Cache.Set(Find, &pCopy)
+	node.Cache.Set(FindResult, &pCopy)
 	return
 }
diff --git a/datasource/etcd/cache/filter_service.go b/datasource/etcd/cache/filter_service.go
index d5607ed..de0416d 100644
--- a/datasource/etcd/cache/filter_service.go
+++ b/datasource/etcd/cache/filter_service.go
@@ -30,7 +30,7 @@ type ServiceFilter struct {
 }
 
 func (f *ServiceFilter) Name(ctx context.Context, _ *cache.Node) string {
-	provider := ctx.Value(CtxFindProvider).(*pb.MicroServiceKey)
+	provider := ctx.Value(CtxProviderKey).(*pb.MicroServiceKey)
 	return util.StringJoin([]string{
 		provider.Tenant,
 		provider.Environment,
diff --git a/datasource/etcd/cache/filter_tags.go b/datasource/etcd/cache/filter_tags.go
index 309213c..4466719 100644
--- a/datasource/etcd/cache/filter_tags.go
+++ b/datasource/etcd/cache/filter_tags.go
@@ -35,13 +35,13 @@ type TagsFilter struct {
 }
 
 func (f *TagsFilter) Name(ctx context.Context, _ *cache.Node) string {
-	tags, _ := ctx.Value(CtxFindTags).([]string)
+	tags, _ := ctx.Value(CtxTags).([]string)
 	sort.Strings(tags)
 	return strings.Join(tags, ",")
 }
 
 func (f *TagsFilter) Init(ctx context.Context, parent *cache.Node) (node *cache.Node, err error) {
-	tags, _ := ctx.Value(CtxFindTags).([]string)
+	tags, _ := ctx.Value(CtxTags).([]string)
 	if len(tags) == 0 {
 		node = cache.NewNode()
 		node.Cache = parent.Cache
@@ -51,14 +51,14 @@ func (f *TagsFilter) Init(ctx context.Context, parent *cache.Node) (node *cache.
 	var ids []string
 
 	targetDomainProject := util.ParseTargetDomainProject(ctx)
-	pCopy := *parent.Cache.Get(Find).(*VersionRuleCacheItem)
+	pCopy := *parent.Cache.Get(FindResult).(*VersionRuleCacheItem)
 
 loopProviderIds:
 	for _, providerServiceID := range pCopy.ServiceIds {
 		tagsFromETCD, err := serviceUtil.GetTagsUtils(ctx, targetDomainProject, providerServiceID)
 		if err != nil {
-			consumer := ctx.Value(CtxFindConsumer).(*pb.MicroService)
-			provider := ctx.Value(CtxFindProvider).(*pb.MicroServiceKey)
+			consumer := ctx.Value(CtxConsumerID).(*pb.MicroService)
+			provider := ctx.Value(CtxProviderKey).(*pb.MicroServiceKey)
 			findFlag := fmt.Sprintf("consumer '%s' find provider %s/%s/%s", consumer.ServiceId,
 				provider.AppId, provider.ServiceName, provider.Version)
 			log.Errorf(err, "TagsFilter failed, %s", findFlag)
@@ -78,6 +78,6 @@ loopProviderIds:
 	pCopy.ServiceIds = ids
 
 	node = cache.NewNode()
-	node.Cache.Set(Find, &pCopy)
+	node.Cache.Set(FindResult, &pCopy)
 	return
 }
diff --git a/datasource/etcd/cache/filter_version.go b/datasource/etcd/cache/filter_version.go
index 1deb83d..074f94a 100644
--- a/datasource/etcd/cache/filter_version.go
+++ b/datasource/etcd/cache/filter_version.go
@@ -28,31 +28,33 @@ import (
 	"github.com/apache/servicecomb-service-center/pkg/log"
 )
 
-type VersionRuleFilter struct {
+type VersionFilter struct {
 }
 
-func (f *VersionRuleFilter) Name(ctx context.Context, _ *cache.Node) string {
-	provider := ctx.Value(CtxFindProvider).(*pb.MicroServiceKey)
-	return provider.Version
+func (f *VersionFilter) Name(ctx context.Context, _ *cache.Node) string {
+	instanceKey, ok := ctx.Value(CtxProviderInstanceKey).(*pb.HeartbeatSetElement)
+	if ok {
+		return instanceKey.ServiceId
+	}
+	return ""
 }
 
-func (f *VersionRuleFilter) Init(ctx context.Context, parent *cache.Node) (node *cache.Node, err error) {
-	instance, ok := ctx.Value(CtxFindProviderInstance).(*pb.HeartbeatSetElement)
+func (f *VersionFilter) Init(ctx context.Context, parent *cache.Node) (node *cache.Node, err error) {
+	instance, ok := ctx.Value(CtxProviderInstanceKey).(*pb.HeartbeatSetElement)
 	if ok {
 		node = cache.NewNode()
-		node.Cache.Set(Find, &VersionRuleCacheItem{
+		node.Cache.Set(FindResult, &VersionRuleCacheItem{
 			ServiceIds: []string{instance.ServiceId},
 		})
 		return
 	}
 
-	provider := ctx.Value(CtxFindProvider).(*pb.MicroServiceKey)
-	// 版本规则
-	ids, exist, err := serviceUtil.FindServiceIds(ctx, provider.Version, provider)
+	provider := ctx.Value(CtxProviderKey).(*pb.MicroServiceKey)
+	ids, exist, err := serviceUtil.FindServiceIds(ctx, provider, false)
 	if err != nil {
-		consumer := ctx.Value(CtxFindConsumer).(*pb.MicroService)
-		findFlag := fmt.Sprintf("consumer '%s' find provider %s/%s/%s", consumer.ServiceId,
-			provider.AppId, provider.ServiceName, provider.Version)
+		consumer := ctx.Value(CtxConsumerID).(*pb.MicroService)
+		findFlag := fmt.Sprintf("consumer '%s' find provider %s/%s", consumer.ServiceId,
+			provider.AppId, provider.ServiceName)
 		log.Errorf(err, "FindServiceIds failed, %s", findFlag)
 		return
 	}
@@ -61,7 +63,7 @@ func (f *VersionRuleFilter) Init(ctx context.Context, parent *cache.Node) (node
 	}
 
 	node = cache.NewNode()
-	node.Cache.Set(Find, &VersionRuleCacheItem{
+	node.Cache.Set(FindResult, &VersionRuleCacheItem{
 		ServiceIds: ids,
 	})
 	return
diff --git a/datasource/etcd/cache/instance.go b/datasource/etcd/cache/instance.go
index a5aad02..463f3ec 100644
--- a/datasource/etcd/cache/instance.go
+++ b/datasource/etcd/cache/instance.go
@@ -33,7 +33,7 @@ var FindInstances = &FindInstancesCache{
 func init() {
 	FindInstances.AddFilter(
 		&ServiceFilter{},
-		&VersionRuleFilter{},
+		&VersionFilter{},
 		&TagsFilter{},
 		&AccessibleFilter{},
 		&InstancesFilter{},
@@ -75,29 +75,29 @@ type FindInstancesCache struct {
 func (f *FindInstancesCache) Get(ctx context.Context, consumer *pb.MicroService, provider *pb.MicroServiceKey,
 	tags []string, rev string) (*VersionRuleCacheItem, error) {
 	cloneCtx := context.WithValue(context.WithValue(context.WithValue(context.WithValue(ctx,
-		CtxFindConsumer, consumer),
-		CtxFindProvider, provider),
-		CtxFindTags, tags),
-		CtxFindRequestRev, rev)
+		CtxConsumerID, consumer),
+		CtxProviderKey, provider),
+		CtxTags, tags),
+		CtxRequestRev, rev)
 
 	node, err := f.Tree.Get(cloneCtx, cache.Options().Temporary(ctx.Value(util.CtxNocache) == "1"))
 	if node == nil {
 		return nil, err
 	}
-	return node.Cache.Get(Find).(*VersionRuleCacheItem), nil
+	return node.Cache.Get(FindResult).(*VersionRuleCacheItem), nil
 }
 
 func (f *FindInstancesCache) GetWithProviderID(ctx context.Context, consumer *pb.MicroService, provider *pb.MicroServiceKey,
 	instanceKey *pb.HeartbeatSetElement, tags []string, rev string) (*VersionRuleCacheItem, error) {
-	cloneCtx := context.WithValue(ctx, CtxFindProviderInstance, instanceKey)
+	cloneCtx := context.WithValue(ctx, CtxProviderInstanceKey, instanceKey)
 	return f.Get(cloneCtx, consumer, provider, tags, rev)
 }
 
 func (f *FindInstancesCache) Remove(provider *pb.MicroServiceKey) {
-	f.Tree.Remove(context.WithValue(context.Background(), CtxFindProvider, provider))
+	f.Tree.Remove(context.WithValue(context.Background(), CtxProviderKey, provider))
 	if len(provider.Alias) > 0 {
 		copy := *provider
 		copy.ServiceName = copy.Alias
-		f.Tree.Remove(context.WithValue(context.Background(), CtxFindProvider, &copy))
+		f.Tree.Remove(context.WithValue(context.Background(), CtxProviderKey, &copy))
 	}
 }
diff --git a/datasource/etcd/dep.go b/datasource/etcd/dep.go
index 88d5941..601dbb5 100644
--- a/datasource/etcd/dep.go
+++ b/datasource/etcd/dep.go
@@ -19,7 +19,6 @@ package etcd
 
 import (
 	"context"
-	"encoding/json"
 	"errors"
 	"fmt"
 
@@ -53,9 +52,7 @@ func (dm *DepManager) SearchProviderDependency(ctx context.Context, request *pb.
 		return nil, err
 	}
 
-	dr := serviceUtil.NewProviderDependencyRelation(ctx, domainProject, provider)
-	services, err := dr.GetDependencyConsumers(toDependencyFilterOptions(request)...)
-
+	services, err := serviceUtil.GetConsumers(ctx, domainProject, provider, toDependencyFilterOptions(request)...)
 	if err != nil {
 		log.Error(fmt.Sprintf("query provider failed, provider is %s/%s/%s/%s",
 			provider.Environment, provider.AppId, provider.ServiceName, provider.Version), err)
@@ -86,8 +83,7 @@ func (dm *DepManager) SearchConsumerDependency(ctx context.Context, request *pb.
 		return nil, err
 	}
 
-	dr := serviceUtil.NewConsumerDependencyRelation(ctx, domainProject, consumer)
-	services, err := dr.GetDependencyProviders(toDependencyFilterOptions(request)...)
+	services, err := serviceUtil.GetProviders(ctx, domainProject, consumer, toDependencyFilterOptions(request)...)
 	if err != nil {
 		log.Error(fmt.Sprintf("query consumer failed, consumer is %s/%s/%s/%s",
 			consumer.Environment, consumer.AppId, consumer.ServiceName, consumer.Version), err)
@@ -122,57 +118,3 @@ func (dm *DepManager) DependencyHandle(ctx context.Context) error {
 	}
 	return nil
 }
-
-func (dm *DepManager) AddOrUpdateDependencies(ctx context.Context, dependencyInfos []*pb.ConsumerDependency, override bool) (*pb.Response, error) {
-	opts := make([]client.PluginOp, 0, len(dependencyInfos))
-	domainProject := util.ParseDomainProject(ctx)
-	for _, dependencyInfo := range dependencyInfos {
-		consumerFlag := util.StringJoin([]string{dependencyInfo.Consumer.Environment, dependencyInfo.Consumer.AppId, dependencyInfo.Consumer.ServiceName, dependencyInfo.Consumer.Version}, "/")
-		consumerInfo := pb.DependenciesToKeys([]*pb.MicroServiceKey{dependencyInfo.Consumer}, domainProject)[0]
-		providersInfo := pb.DependenciesToKeys(dependencyInfo.Providers, domainProject)
-
-		rsp := serviceUtil.ParamsChecker(consumerInfo, providersInfo)
-		if rsp != nil {
-			log.Errorf(nil, "put request into dependency queue failed, override: %t, consumer is %s, %s",
-				override, consumerFlag, rsp.Response.GetMessage())
-			return rsp.Response, nil
-		}
-
-		consumerID, err := serviceUtil.GetServiceID(ctx, consumerInfo)
-		if err != nil {
-			log.Errorf(err, "put request into dependency queue failed, override: %t, get consumer[%s] id failed",
-				override, consumerFlag)
-			return pb.CreateResponse(pb.ErrInternal, err.Error()), err
-		}
-		if len(consumerID) == 0 {
-			log.Errorf(nil, "put request into dependency queue failed, override: %t, consumer[%s] does not exist",
-				override, consumerFlag)
-			return pb.CreateResponse(pb.ErrServiceNotExists, fmt.Sprintf("Consumer %s does not exist.", consumerFlag)), nil
-		}
-
-		dependencyInfo.Override = override
-		data, err := json.Marshal(dependencyInfo)
-		if err != nil {
-			log.Errorf(err, "put request into dependency queue failed, override: %t, marshal consumer[%s] dependency failed",
-				override, consumerFlag)
-			return pb.CreateResponse(pb.ErrInternal, err.Error()), err
-		}
-
-		id := path.DepsQueueUUID
-		if !override {
-			id = util.GenerateUUID()
-		}
-		key := path.GenerateConsumerDependencyQueueKey(domainProject, consumerID, id)
-		opts = append(opts, client.OpPut(client.WithStrKey(key), client.WithValue(data)))
-	}
-
-	err := client.BatchCommit(ctx, opts)
-	if err != nil {
-		log.Errorf(err, "put request into dependency queue failed, override: %t, %v", override, dependencyInfos)
-		return pb.CreateResponse(pb.ErrInternal, err.Error()), err
-	}
-
-	log.Infof("put request into dependency queue successfully, override: %t, %v, from remote %s",
-		override, dependencyInfos, util.GetIPFromContext(ctx))
-	return pb.CreateResponse(pb.ResponseSuccess, "Create dependency successfully."), nil
-}
diff --git a/datasource/etcd/event/dependency_event_handler.go b/datasource/etcd/event/dependency_event_handler.go
index c1cc6f5..57eef20 100644
--- a/datasource/etcd/event/dependency_event_handler.go
+++ b/datasource/etcd/event/dependency_event_handler.go
@@ -191,16 +191,10 @@ func (h *DependencyEventHandler) dependencyRuleHandle(res interface{}) error {
 	providersInfo := pb.DependenciesToKeys(r.Providers, domainProject)
 
 	var dep serviceUtil.Dependency
-	var err error
 	dep.DomainProject = domainProject
 	dep.Consumer = consumerInfo
 	dep.ProvidersRule = providersInfo
-	if r.Override {
-		err = serviceUtil.CreateDependencyRule(ctx, &dep)
-	} else {
-		err = serviceUtil.AddDependencyRule(ctx, &dep)
-	}
-
+	err := serviceUtil.AddDependencyRule(ctx, &dep)
 	if err != nil {
 		log.Errorf(err, "modify dependency rule failed, override: %t, consumer %s", r.Override, consumerFlag)
 		return fmt.Errorf("override: %t, consumer is %s, %s", r.Override, consumerFlag, err.Error())
diff --git a/datasource/etcd/event/dependency_rule_event_handler_test.go b/datasource/etcd/event/dependency_rule_event_handler_test.go
index 4d7a283..15c2866 100644
--- a/datasource/etcd/event/dependency_rule_event_handler_test.go
+++ b/datasource/etcd/event/dependency_rule_event_handler_test.go
@@ -30,36 +30,36 @@ import (
 func TestNewDependencyRuleEventHandler(t *testing.T) {
 	consumerId := "1"
 	provider := &pb.MicroServiceKey{Tenant: "x/y", Version: "0+"}
-	b := cache.DependencyRule.ExistVersionRule(context.Background(), consumerId, provider)
+	b := cache.DependencyRule.ExistRule(context.Background(), consumerId, provider)
 	if b {
 		t.Fatalf("TestNewDependencyRuleEventHandler failed")
 	}
 	h := NewDependencyRuleEventHandler()
 	h.OnEvent(sd.KvEvent{Type: pb.EVT_CREATE})
-	b = cache.DependencyRule.ExistVersionRule(context.Background(), consumerId, provider)
+	b = cache.DependencyRule.ExistRule(context.Background(), consumerId, provider)
 	if !b {
 		t.Fatalf("TestNewDependencyRuleEventHandler failed")
 	}
 	h.OnEvent(sd.KvEvent{Type: pb.EVT_INIT})
-	b = cache.DependencyRule.ExistVersionRule(context.Background(), consumerId, provider)
+	b = cache.DependencyRule.ExistRule(context.Background(), consumerId, provider)
 	if !b {
 		t.Fatalf("TestNewDependencyRuleEventHandler failed")
 	}
 	h.OnEvent(sd.KvEvent{Type: pb.EVT_UPDATE, KV: &sd.KeyValue{
 		Key: []byte(path.GenerateProviderDependencyRuleKey("x/y", provider))}})
-	b = cache.DependencyRule.ExistVersionRule(context.Background(), consumerId, provider)
+	b = cache.DependencyRule.ExistRule(context.Background(), consumerId, provider)
 	if b {
 		t.Fatalf("TestNewDependencyRuleEventHandler failed")
 	}
 	h.OnEvent(sd.KvEvent{Type: pb.EVT_DELETE, KV: &sd.KeyValue{
 		Key: []byte(path.GenerateProviderDependencyRuleKey("x/y", provider))}})
-	b = cache.DependencyRule.ExistVersionRule(context.Background(), consumerId, provider)
+	b = cache.DependencyRule.ExistRule(context.Background(), consumerId, provider)
 	if b {
 		t.Fatalf("TestNewDependencyRuleEventHandler failed")
 	}
 	h.OnEvent(sd.KvEvent{Type: pb.EVT_DELETE, KV: &sd.KeyValue{
 		Key: []byte(path.GenerateConsumerDependencyRuleKey("x/y", provider))}})
-	b = cache.DependencyRule.ExistVersionRule(context.Background(), consumerId, provider)
+	b = cache.DependencyRule.ExistRule(context.Background(), consumerId, provider)
 	if !b {
 		t.Fatalf("TestNewDependencyRuleEventHandler failed")
 	}
diff --git a/datasource/etcd/ms.go b/datasource/etcd/ms.go
index 7b8596e..a17f9c1 100644
--- a/datasource/etcd/ms.go
+++ b/datasource/etcd/ms.go
@@ -64,7 +64,7 @@ func newMetadataManager(schemaNotEditable bool, instanceTTL int64) datasource.Me
 	}
 }
 
-// RegisterService() implement:
+// RegisterService implement:
 // 1. capsule request to etcd kv format
 // 2. invoke etcd client to store data
 // 3. check etcd-client response && construct createServiceResponse
@@ -409,14 +409,14 @@ func (ds *MetadataManager) ExistService(ctx context.Context, request *pb.GetExis
 	serviceFlag := util.StringJoin([]string{
 		request.Environment, request.AppId, request.ServiceName, request.Version}, path.SPLIT)
 
-	ids, exist, err := serviceUtil.FindServiceIds(ctx, request.Version, &pb.MicroServiceKey{
+	ids, exist, err := serviceUtil.FindServiceIds(ctx, &pb.MicroServiceKey{
 		Environment: request.Environment,
 		AppId:       request.AppId,
 		ServiceName: request.ServiceName,
 		Alias:       request.ServiceName,
 		Version:     request.Version,
 		Tenant:      domainProject,
-	})
+	}, true)
 	if err != nil {
 		log.Error(fmt.Sprintf("micro-service[%s] exist failed, find serviceIDs failed", serviceFlag), err)
 		return &pb.GetExistenceResponse{
@@ -881,7 +881,6 @@ func (ds *MetadataManager) FindInstances(ctx context.Context, request *pb.FindIn
 		AppId:       request.AppId,
 		ServiceName: request.ServiceName,
 		Alias:       request.Alias,
-		Version:     request.VersionRule,
 	}
 
 	rev, ok := ctx.Value(util.CtxRequestRevision).(string)
@@ -908,15 +907,15 @@ func (ds *MetadataManager) findInstance(ctx context.Context, request *pb.FindIns
 		service, err = serviceUtil.GetService(ctx, domainProject, request.ConsumerServiceId)
 		if err != nil {
 			if errors.Is(err, datasource.ErrNoData) {
-				log.Debug(fmt.Sprintf("consumer does not exist, consumer[%s] find provider[%s/%s/%s/%s]",
-					request.ConsumerServiceId, request.Environment, request.AppId, request.ServiceName, request.VersionRule))
+				log.Debug(fmt.Sprintf("consumer does not exist, consumer[%s] find provider[%s/%s/%s]",
+					request.ConsumerServiceId, request.Environment, request.AppId, request.ServiceName))
 				return &pb.FindInstancesResponse{
 					Response: pb.CreateResponse(pb.ErrServiceNotExists,
 						fmt.Sprintf("Consumer[%s] does not exist.", request.ConsumerServiceId)),
 				}, nil
 			}
-			log.Error(fmt.Sprintf("get consumer failed, consumer[%s] find provider[%s/%s/%s/%s]",
-				request.ConsumerServiceId, request.Environment, request.AppId, request.ServiceName, request.VersionRule), err)
+			log.Error(fmt.Sprintf("get consumer failed, consumer[%s] find provider[%s/%s/%s]",
+				request.ConsumerServiceId, request.Environment, request.AppId, request.ServiceName), err)
 			return &pb.FindInstancesResponse{
 				Response: pb.CreateResponse(pb.ErrInternal, err.Error()),
 			}, err
@@ -929,9 +928,9 @@ func (ds *MetadataManager) findInstance(ctx context.Context, request *pb.FindIns
 	ctx = util.SetTargetDomainProject(ctx, util.ParseDomain(ctx), util.ParseProject(ctx))
 	provider.Tenant = util.ParseTargetDomainProject(ctx)
 
-	findFlag := fmt.Sprintf("Consumer[%s][%s/%s/%s/%s] find provider[%s/%s/%s/%s]",
+	findFlag := fmt.Sprintf("Consumer[%s][%s/%s/%s/%s] find provider[%s/%s/%s]",
 		request.ConsumerServiceId, service.Environment, service.AppId, service.ServiceName, service.Version,
-		provider.Environment, provider.AppId, provider.ServiceName, provider.Version)
+		provider.Environment, provider.AppId, provider.ServiceName)
 
 	// cache
 	var item *cache.VersionRuleCacheItem
@@ -953,7 +952,7 @@ func (ds *MetadataManager) findInstance(ctx context.Context, request *pb.FindIns
 	// add dependency queue
 	if len(request.ConsumerServiceId) > 0 &&
 		len(item.ServiceIds) > 0 &&
-		!cache.DependencyRule.ExistVersionRule(ctx, request.ConsumerServiceId, provider) {
+		!cache.DependencyRule.ExistRule(ctx, request.ConsumerServiceId, provider) {
 		provider, err = ds.reshapeProviderKey(ctx, provider, item.ServiceIds[0])
 		if err != nil {
 			return nil, err
@@ -1022,15 +1021,14 @@ func (ds *MetadataManager) genFindResult(ctx context.Context, oldRev string, ite
 
 func (ds *MetadataManager) reshapeProviderKey(ctx context.Context, provider *pb.MicroServiceKey, providerID string) (
 	*pb.MicroServiceKey, error) {
-	//维护version的规则,service name 可能是别名,所以重新获取
+	// service name 可能是别名,所以重新获取
 	providerService, err := serviceUtil.GetService(ctx, provider.Tenant, providerID)
 	if err != nil {
 		return nil, err
 	}
 
-	versionRule := provider.Version
 	provider = pb.MicroServiceToKey(provider.Tenant, providerService)
-	provider.Version = versionRule
+	provider.Version = ""
 	return provider, nil
 }
 
@@ -1200,7 +1198,6 @@ func (ds *MetadataManager) batchFindServices(ctx context.Context, request *pb.Ba
 			ConsumerServiceId: request.ConsumerServiceId,
 			AppId:             key.Service.AppId,
 			ServiceName:       key.Service.ServiceName,
-			VersionRule:       key.Service.Version,
 			Environment:       key.Service.Environment,
 		})
 		if err != nil {
@@ -2045,8 +2042,7 @@ func (ds *MetadataManager) DeleteServicePri(ctx context.Context, serviceID strin
 
 	// 强制删除,则与该服务相关的信息删除,非强制删除: 如果作为该被依赖(作为provider,提供服务,且不是只存在自依赖)或者存在实例,则不能删除
 	if !force {
-		dr := serviceUtil.NewProviderDependencyRelation(ctx, domainProject, microservice)
-		services, err := dr.GetDependencyConsumerIds()
+		services, err := serviceUtil.GetConsumerIds(ctx, domainProject, microservice)
 		if err != nil {
 			log.Errorf(err, "delete micro-service[%s] failed, get service dependency failed, operator: %s",
 				serviceID, remoteIP)
@@ -2100,14 +2096,6 @@ func (ds *MetadataManager) DeleteServicePri(ctx context.Context, serviceID strin
 	}
 	opts = append(opts, optDeleteDep)
 
-	//删除黑白名单
-	opts = append(opts, client.OpDel(
-		client.WithStrKey(path.GenerateServiceRuleKey(domainProject, serviceID, "")),
-		client.WithPrefix()))
-	opts = append(opts, client.OpDel(client.WithStrKey(
-		util.StringJoin([]string{path.GetServiceRuleIndexRootKey(domainProject), serviceID, ""}, path.SPLIT)),
-		client.WithPrefix()))
-
 	//删除schemas
 	opts = append(opts, client.OpDel(
 		client.WithStrKey(path.GenerateServiceSchemaKey(domainProject, serviceID, "")),
diff --git a/datasource/etcd/path/key_convertor.go b/datasource/etcd/path/key_convertor.go
index 774a6cb..fffd76c 100644
--- a/datasource/etcd/path/key_convertor.go
+++ b/datasource/etcd/path/key_convertor.go
@@ -71,18 +71,6 @@ func GetInfoFromProjectKV(key []byte) (domain, project string) {
 	return keys[l-2], keys[l-1]
 }
 
-func GetInfoFromRuleKV(key []byte) (serviceID, ruleID, domainProject string) {
-	keys := ToResponse(key)
-	l := len(keys)
-	if l < 4 {
-		return
-	}
-	serviceID = keys[l-2]
-	ruleID = keys[l-1]
-	domainProject = fmt.Sprintf("%s/%s", keys[l-4], keys[l-3])
-	return
-}
-
 func GetInfoFromTagKV(key []byte) (serviceID, domainProject string) {
 	keys := ToResponse(key)
 	l := len(keys)
diff --git a/datasource/etcd/path/key_convertor_test.go b/datasource/etcd/path/key_convertor_test.go
index 459faf9..add76d3 100644
--- a/datasource/etcd/path/key_convertor_test.go
+++ b/datasource/etcd/path/key_convertor_test.go
@@ -52,13 +52,6 @@ func TestGetInfoFromKV(t *testing.T) {
 	d, p = path.GetInfoFromProjectKV([]byte("sdf"))
 	assert.False(t, d != "" || p != "")
 
-	var r string
-	s, r, d = path.GetInfoFromRuleKV([]byte(path.GenerateServiceRuleKey("a/b", "c", "d")))
-	assert.False(t, d != "a/b" || s != "c" || r != "d")
-
-	s, r, d = path.GetInfoFromRuleKV([]byte("sdf"))
-	assert.False(t, d != "" || s != "" || r != "")
-
 	s, d = path.GetInfoFromTagKV([]byte(path.GenerateServiceTagKey("a/b", "c")))
 	assert.False(t, d != "a/b" || s != "c")
 
@@ -105,13 +98,6 @@ func TestGetInfoFromKV(t *testing.T) {
 	dt, k := path.GetInfoFromDependencyRuleKV([]byte(path.GenerateProviderDependencyRuleKey("a/b", &discovery.MicroServiceKey{
 		Tenant:      "a/b",
 		AppId:       "c",
-		ServiceName: "*",
-	})))
-	assert.False(t, dt != path.DepsProvider || k == nil || k.AppId != "" || k.ServiceName != "*")
-
-	dt, k = path.GetInfoFromDependencyRuleKV([]byte(path.GenerateProviderDependencyRuleKey("a/b", &discovery.MicroServiceKey{
-		Tenant:      "a/b",
-		AppId:       "c",
 		ServiceName: "d",
 		Version:     "e",
 	})))
diff --git a/datasource/etcd/path/key_generator.go b/datasource/etcd/path/key_generator.go
index d95563c..2a7db02 100644
--- a/datasource/etcd/path/key_generator.go
+++ b/datasource/etcd/path/key_generator.go
@@ -31,8 +31,6 @@ const (
 	RegistryInstanceKey      = "inst"
 	RegistryFile             = "files"
 	RegistryIndex            = "indexes"
-	RegistryRuleKey          = "rules"
-	RegistryRuleIndexKey     = "rule-indexes"
 	RegistryDomainKey        = "domains"
 	RegistryProjectKey       = "projects"
 	RegistryAliasKey         = "alias"
@@ -40,7 +38,6 @@ const (
 	RegistrySchemaKey        = "schemas"
 	RegistrySchemaSummaryKey = "schema-sum"
 	RegistryLeaseKey         = "leases"
-	RegistryDependencyKey    = "deps"
 	RegistryDepsRuleKey      = "dep-rules"
 	RegistryDepsQueueKey     = "dep-queue"
 	RegistryMetricsKey       = "metrics"
@@ -83,6 +80,7 @@ func GenerateRBACAccountKey(name string) string {
 		name,
 	}, SPLIT)
 }
+
 func GenerateRBACRoleKey(name string) string {
 	return util.StringJoin([]string{
 		GetRootKey(),
@@ -90,6 +88,7 @@ func GenerateRBACRoleKey(name string) string {
 		name,
 	}, SPLIT)
 }
+
 func GenRoleAccountIdxKey(role, account string) string {
 	return util.StringJoin([]string{
 		GetRootKey(),
@@ -97,6 +96,7 @@ func GenRoleAccountIdxKey(role, account string) string {
 		role, account,
 	}, SPLIT)
 }
+
 func GenRoleAccountPrefixIdxKey(role string) string {
 	return util.StringJoin([]string{
 		GetRootKey(),
@@ -147,24 +147,6 @@ func GetServiceAppKey(domainProject, env, appID string) string {
 	}, SPLIT)
 }
 
-func GetServiceRuleRootKey(domainProject string) string {
-	return util.StringJoin([]string{
-		GetRootKey(),
-		RegistryServiceKey,
-		RegistryRuleKey,
-		domainProject,
-	}, SPLIT)
-}
-
-func GetServiceRuleIndexRootKey(domainProject string) string {
-	return util.StringJoin([]string{
-		GetRootKey(),
-		RegistryServiceKey,
-		RegistryRuleIndexKey,
-		domainProject,
-	}, SPLIT)
-}
-
 func GetServiceTagRootKey(domainProject string) string {
 	return util.StringJoin([]string{
 		GetRootKey(),
@@ -201,15 +183,6 @@ func GetInstanceLeaseRootKey(domainProject string) string {
 	}, SPLIT)
 }
 
-func GenerateRuleIndexKey(domainProject string, serviceID string, attr string, pattern string) string {
-	return util.StringJoin([]string{
-		GetServiceRuleIndexRootKey(domainProject),
-		serviceID,
-		attr,
-		pattern,
-	}, SPLIT)
-}
-
 func GenerateServiceIndexKey(key *discovery.MicroServiceKey) string {
 	return util.StringJoin([]string{
 		GetServiceIndexRootKey(key.Tenant),
@@ -230,14 +203,6 @@ func GenerateServiceAliasKey(key *discovery.MicroServiceKey) string {
 	}, SPLIT)
 }
 
-func GenerateServiceRuleKey(domainProject string, serviceID string, ruleID string) string {
-	return util.StringJoin([]string{
-		GetServiceRuleRootKey(domainProject),
-		serviceID,
-		ruleID,
-	}, SPLIT)
-}
-
 func GenerateServiceTagKey(domainProject string, serviceID string) string {
 	return util.StringJoin([]string{
 		GetServiceTagRootKey(domainProject),
@@ -293,14 +258,6 @@ func GenerateServiceDependencyRuleKey(serviceType string, domainProject string,
 			serviceType,
 		}, SPLIT)
 	}
-	if in.ServiceName == "*" {
-		return util.StringJoin([]string{
-			GetServiceDependencyRuleRootKey(domainProject),
-			serviceType,
-			in.Environment,
-			in.ServiceName,
-		}, SPLIT)
-	}
 	return util.StringJoin([]string{
 		GetServiceDependencyRuleRootKey(domainProject),
 		serviceType,
@@ -345,15 +302,6 @@ func GenerateConsumerDependencyQueueKey(domainProject, consumerID, uuid string)
 	}, SPLIT)
 }
 
-func GetServiceDependencyRootKey(domainProject string) string {
-	return util.StringJoin([]string{
-		GetRootKey(),
-		RegistryServiceKey,
-		RegistryDependencyKey,
-		domainProject,
-	}, SPLIT)
-}
-
 func GenerateAccountKey(name string) string {
 	return util.StringJoin([]string{
 		GetRootKey(),
@@ -361,6 +309,7 @@ func GenerateAccountKey(name string) string {
 		name,
 	}, SPLIT)
 }
+
 func GenerateAccountLockKey(key string) string {
 	return util.StringJoin([]string{
 		GetRootKey(),
@@ -368,12 +317,14 @@ func GenerateAccountLockKey(key string) string {
 		key,
 	}, SPLIT)
 }
+
 func GenerateRBACSecretKey() string {
 	return util.StringJoin([]string{
 		GetRootKey(),
 		"rbac/secret",
 	}, SPLIT)
 }
+
 func GetServerInfoKey() string {
 	return util.StringJoin([]string{
 		GetRootKey(),
diff --git a/datasource/etcd/path/key_generator_test.go b/datasource/etcd/path/key_generator_test.go
index 2614ae1..7e132d8 100644
--- a/datasource/etcd/path/key_generator_test.go
+++ b/datasource/etcd/path/key_generator_test.go
@@ -57,13 +57,6 @@ func TestGenerateDependencyRuleKey(t *testing.T) {
 		Version:     "4",
 	})
 	assert.Equal(t, "/cse-sr/ms/dep-rules/a/c/1/2/3/4", k)
-	k = path.GenerateConsumerDependencyRuleKey("a", &discovery.MicroServiceKey{
-		Environment: "1",
-		AppId:       "2",
-		ServiceName: "*",
-		Version:     "4",
-	})
-	assert.Equal(t, "/cse-sr/ms/dep-rules/a/c/1/*", k)
 
 	// provider
 	k = path.GenerateProviderDependencyRuleKey("a", nil)
@@ -76,12 +69,4 @@ func TestGenerateDependencyRuleKey(t *testing.T) {
 		Version:     "4",
 	})
 	assert.Equal(t, "/cse-sr/ms/dep-rules/a/p/1/2/3/4", k)
-
-	k = path.GenerateProviderDependencyRuleKey("a", &discovery.MicroServiceKey{
-		Environment: "1",
-		AppId:       "2",
-		ServiceName: "*",
-		Version:     "4",
-	})
-	assert.Equal(t, "/cse-sr/ms/dep-rules/a/p/1/*", k)
 }
diff --git a/datasource/etcd/util.go b/datasource/etcd/util.go
index a6afef3..47d1c7a 100644
--- a/datasource/etcd/util.go
+++ b/datasource/etcd/util.go
@@ -254,8 +254,7 @@ func getServiceDetailUtil(ctx context.Context, serviceDetailOpt ServiceDetailOpt
 			serviceDetail.SchemaInfos = schemas
 		case "dependencies":
 			service := serviceDetailOpt.service
-			dr := serviceUtil.NewDependencyRelation(ctx, domainProject, service, service)
-			consumers, err := dr.GetDependencyConsumers(
+			consumers, err := serviceUtil.GetConsumers(ctx, domainProject, service,
 				serviceUtil.WithoutSelfDependency(),
 				serviceUtil.WithSameDomainProject())
 			if err != nil {
@@ -263,7 +262,7 @@ func getServiceDetailUtil(ctx context.Context, serviceDetailOpt ServiceDetailOpt
 					service.ServiceId, service.Environment, service.AppId, service.ServiceName, service.Version)
 				return nil, err
 			}
-			providers, err := dr.GetDependencyProviders(
+			providers, err := serviceUtil.GetProviders(ctx, domainProject, service,
 				serviceUtil.WithoutSelfDependency(),
 				serviceUtil.WithSameDomainProject())
 			if err != nil {
diff --git a/datasource/etcd/util/dependency.go b/datasource/etcd/util/dependency.go
index 812be89..7e06057 100644
--- a/datasource/etcd/util/dependency.go
+++ b/datasource/etcd/util/dependency.go
@@ -75,8 +75,8 @@ func (dep *Dependency) removeConsumerOfProviderRule(ctx context.Context) ([]clie
 func (dep *Dependency) addConsumerOfProviderRule(ctx context.Context) ([]client.PluginOp, error) {
 	opts := make([]client.PluginOp, 0, len(dep.CreateDependencyRuleList))
 	for _, providerRule := range dep.CreateDependencyRuleList {
-		proProkey := path.GenerateProviderDependencyRuleKey(providerRule.Tenant, providerRule)
-		tmpValue, err := TransferToMicroServiceDependency(ctx, proProkey)
+		providerRuleKey := path.GenerateProviderDependencyRuleKey(providerRule.Tenant, providerRule)
+		tmpValue, err := TransferToMicroServiceDependency(ctx, providerRuleKey)
 		if err != nil {
 			return nil, err
 		}
@@ -88,11 +88,8 @@ func (dep *Dependency) addConsumerOfProviderRule(ctx context.Context) ([]client.
 			return nil, errMarshal
 		}
 		opts = append(opts, client.OpPut(
-			client.WithStrKey(proProkey),
+			client.WithStrKey(providerRuleKey),
 			client.WithValue(data)))
-		if providerRule.ServiceName == "*" {
-			break
-		}
 	}
 	return opts, nil
 }
diff --git a/datasource/etcd/util/dependency_query.go b/datasource/etcd/util/dependency_query.go
index d476198..9d93707 100644
--- a/datasource/etcd/util/dependency_query.go
+++ b/datasource/etcd/util/dependency_query.go
@@ -21,7 +21,6 @@ import (
 	"context"
 	"errors"
 	"fmt"
-	"strings"
 
 	pb "github.com/go-chassis/cari/discovery"
 
@@ -30,7 +29,6 @@ import (
 	"github.com/apache/servicecomb-service-center/datasource/etcd/kv"
 	"github.com/apache/servicecomb-service-center/datasource/etcd/path"
 	"github.com/apache/servicecomb-service-center/pkg/log"
-	"github.com/apache/servicecomb-service-center/pkg/util"
 )
 
 // DependencyRelationFilterOpt contains SameDomainProject and NonSelf flag
@@ -85,10 +83,6 @@ func (dr *DependencyRelation) GetDependencyProviders(opts ...DependencyRelationF
 			return nil, err
 		}
 
-		if key.ServiceName == "*" {
-			services = services[:0]
-		}
-
 		for _, providerID := range providerIDs {
 			provider, err := GetService(dr.ctx, key.Tenant, providerID)
 			if err != nil {
@@ -106,15 +100,11 @@ func (dr *DependencyRelation) GetDependencyProviders(opts ...DependencyRelationF
 			}
 			services = append(services, provider)
 		}
-
-		if key.ServiceName == "*" {
-			break
-		}
 	}
 	return services, nil
 }
 
-func (dr *DependencyRelation) GetDependencyProviderIds() ([]string, error) {
+func (dr *DependencyRelation) getDependencyProviderIds() ([]string, error) {
 	keys, err := dr.getProviderKeys()
 	if err != nil {
 		return nil, err
@@ -124,7 +114,7 @@ func (dr *DependencyRelation) GetDependencyProviderIds() ([]string, error) {
 
 func (dr *DependencyRelation) getProviderKeys() ([]*pb.MicroServiceKey, error) {
 	if dr.consumer == nil {
-		return nil, fmt.Errorf("Invalid consumer")
+		return nil, errors.New("invalid consumer")
 	}
 	consumerMicroServiceKey := pb.MicroServiceToKey(dr.domainProject, dr.consumer)
 
@@ -140,52 +130,23 @@ func (dr *DependencyRelation) GetProviderIdsByRules(providerRules []*pb.MicroSer
 	provideServiceIds := make([]string, 0, len(providerRules))
 	for _, provider := range providerRules {
 		serviceIDs, err := dr.parseDependencyRule(provider)
-		switch {
-		case provider.ServiceName == "*":
-			if err != nil {
-				log.Errorf(err, "get all serviceIDs failed")
-				return provideServiceIds, err
-			}
-			return serviceIDs, nil
-		default:
-			if err != nil {
-				log.Errorf(err, "get service[%s/%s/%s/%s]'s providerIDs failed",
-					provider.Environment, provider.AppId, provider.ServiceName, provider.Version)
-				return provideServiceIds, err
-			}
-			if len(serviceIDs) == 0 {
-				log.Warnf("get service[%s/%s/%s/%s]'s providerIDs is empty",
-					provider.Environment, provider.AppId, provider.ServiceName, provider.Version)
-				continue
-			}
-			provideServiceIds = append(provideServiceIds, serviceIDs...)
+		if err != nil {
+			log.Errorf(err, "get service[%s/%s/%s/%s]'s providerIDs failed",
+				provider.Environment, provider.AppId, provider.ServiceName, provider.Version)
+			return provideServiceIds, err
 		}
+		if len(serviceIDs) == 0 {
+			log.Warnf("get service[%s/%s/%s/%s]'s providerIDs is empty",
+				provider.Environment, provider.AppId, provider.ServiceName, provider.Version)
+			continue
+		}
+		provideServiceIds = append(provideServiceIds, serviceIDs...)
 	}
 	return provideServiceIds, nil
 }
 
 func (dr *DependencyRelation) parseDependencyRule(dependencyRule *pb.MicroServiceKey) (serviceIDs []string, err error) {
-	opts := FromContext(dr.ctx)
-	switch {
-	case dependencyRule.ServiceName == "*":
-		log.Infof("service[%s/%s/%s/%s] rely all service",
-			dr.consumer.Environment, dr.consumer.AppId, dr.consumer.ServiceName, dr.consumer.Version)
-		splited := strings.Split(path.GenerateServiceIndexKey(dependencyRule), "/")
-		allServiceKey := util.StringJoin(splited[:len(splited)-3], "/") + "/"
-		sopts := append(opts,
-			client.WithStrKey(allServiceKey),
-			client.WithPrefix())
-		resp, err := kv.Store().ServiceIndex().Search(dr.ctx, sopts...)
-		if err != nil {
-			return nil, err
-		}
-
-		for _, kv := range resp.Kvs {
-			serviceIDs = append(serviceIDs, kv.Value.(string))
-		}
-	default:
-		serviceIDs, _, err = FindServiceIds(dr.ctx, dependencyRule.Version, dependencyRule)
-	}
+	serviceIDs, _, err = FindServiceIds(dr.ctx, dependencyRule, false)
 	return
 }
 
@@ -235,7 +196,7 @@ func (dr *DependencyRelation) GetServiceByMicroServiceKey(service *pb.MicroServi
 	return GetService(dr.ctx, service.Tenant, serviceID)
 }
 
-func (dr *DependencyRelation) GetDependencyConsumerIds() ([]string, error) {
+func (dr *DependencyRelation) getDependencyConsumerIds() ([]string, error) {
 	consumerDependAllList, err := dr.GetDependencyConsumersOfProvider()
 	if err != nil {
 		return nil, err
@@ -261,49 +222,22 @@ func (dr *DependencyRelation) GetDependencyConsumerIds() ([]string, error) {
 
 func (dr *DependencyRelation) GetDependencyConsumersOfProvider() ([]*pb.MicroServiceKey, error) {
 	if dr.provider == nil {
-		return nil, fmt.Errorf("Invalid provider")
+		return nil, errors.New("invalid provider")
 	}
 	providerService := pb.MicroServiceToKey(dr.domainProject, dr.provider)
-	consumerDependAllList, err := dr.getConsumerOfDependAllServices()
-	if err != nil {
-		log.Errorf(err, "get consumers that depend on all services failed, %s", dr.provider.ServiceId)
-		return nil, err
-	}
-
 	consumerDependList, err := dr.GetConsumerOfSameServiceNameAndAppID(providerService)
 	if err != nil {
 		log.Errorf(err, "get consumers that depend on rule[%s/%s/%s/%s] failed",
 			dr.provider.Environment, dr.provider.AppId, dr.provider.ServiceName, dr.provider.Version)
 		return nil, err
 	}
-	consumerDependAllList = append(consumerDependAllList, consumerDependList...)
-	return consumerDependAllList, nil
-}
-
-func (dr *DependencyRelation) getConsumerOfDependAllServices() ([]*pb.MicroServiceKey, error) {
-	providerService := pb.MicroServiceToKey(dr.domainProject, dr.provider)
-	providerService.ServiceName = "*"
-	relyAllKey := path.GenerateProviderDependencyRuleKey(dr.domainProject, providerService)
-	opts := append(FromContext(dr.ctx), client.WithStrKey(relyAllKey))
-	rsp, err := kv.Store().DependencyRule().Search(dr.ctx, opts...)
-	if err != nil {
-		log.Errorf(err, "get consumers that rely all service failed, %s/%s/%s/%s",
-			dr.provider.Environment, dr.provider.AppId, dr.provider.ServiceName, dr.provider.Version)
-		return nil, err
-	}
-	if len(rsp.Kvs) != 0 {
-		log.Infof("exist consumers that rely all service, %s/%s/%s/%s",
-			dr.provider.Environment, dr.provider.AppId, dr.provider.ServiceName, dr.provider.Version)
-		return rsp.Kvs[0].Value.(*pb.MicroServiceDependency).Dependency, nil
-	}
-	return nil, nil
+	return consumerDependList, nil
 }
 
 func (dr *DependencyRelation) GetConsumerOfSameServiceNameAndAppID(provider *pb.MicroServiceKey) ([]*pb.MicroServiceKey, error) {
-	providerVersion := provider.Version
-	provider.Version = ""
-	prefix := path.GenerateProviderDependencyRuleKey(dr.domainProject, provider)
-	provider.Version = providerVersion
+	copy := *provider
+	copy.Version = ""
+	prefix := path.GenerateProviderDependencyRuleKey(dr.domainProject, &copy)
 
 	opts := append(FromContext(dr.ctx),
 		client.WithStrKey(prefix),
@@ -316,36 +250,7 @@ func (dr *DependencyRelation) GetConsumerOfSameServiceNameAndAppID(provider *pb.
 	}
 
 	allConsumers := make([]*pb.MicroServiceKey, 0, len(rsp.Kvs))
-	var latestServiceID []string
-
 	for _, kv := range rsp.Kvs {
-		providerVersionRuleArr := strings.Split(util.BytesToStringWithNoCopy(kv.Key), "/")
-		providerVersionRule := providerVersionRuleArr[len(providerVersionRuleArr)-1]
-		if providerVersionRule == "latest" {
-			if latestServiceID == nil {
-				latestServiceID, _, err = FindServiceIds(dr.ctx, providerVersionRule, provider)
-				if err != nil {
-					log.Errorf(err, "get service[%s/%s/%s/%s]'s serviceID failed",
-						provider.Environment, provider.AppId, provider.ServiceName, providerVersionRule)
-					return nil, err
-				}
-			}
-			if len(latestServiceID) == 0 {
-				log.Infof("service[%s/%s/%s/%s] does not exist",
-					provider.Environment, provider.AppId, provider.ServiceName, providerVersionRule)
-				continue
-			}
-			if dr.provider.ServiceId != latestServiceID[0] {
-				continue
-			}
-
-		} else {
-			if !VersionMatchRule(providerVersion, providerVersionRule) {
-				continue
-			}
-		}
-
-		log.Debugf("providerETCD is %s", providerVersionRuleArr)
 		allConsumers = append(allConsumers, kv.Value.(*pb.MicroServiceDependency).Dependency...)
 	}
 	return allConsumers, nil
diff --git a/datasource/etcd/util/dependency_query_test.go b/datasource/etcd/util/dependency_query_test.go
new file mode 100644
index 0000000..a06eff7
--- /dev/null
+++ b/datasource/etcd/util/dependency_query_test.go
@@ -0,0 +1,96 @@
+/*
+ * 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 util
+
+import (
+	"context"
+	"errors"
+	"testing"
+
+	"github.com/apache/servicecomb-service-center/datasource"
+	"github.com/go-chassis/cari/discovery"
+	"github.com/stretchr/testify/assert"
+)
+
+func TestDependency(t *testing.T) {
+	d := &Dependency{
+		DeleteDependencyRuleList: []*discovery.MicroServiceKey{
+			{ServiceName: "b", Version: "1.0.0"},
+		},
+		CreateDependencyRuleList: []*discovery.MicroServiceKey{
+			{ServiceName: "a", Version: "1.0.0"},
+		},
+	}
+	err := d.Commit(context.Background())
+	if err != nil {
+		t.Fatalf(`Dependency_UpdateProvidersRuleOfConsumer failed`)
+	}
+
+	dr := NewDependencyRelation(context.Background(), "", &discovery.MicroService{}, &discovery.MicroService{})
+	_, err = dr.GetProviderIdsByRules([]*discovery.MicroServiceKey{
+		{ServiceName: "*"},
+	})
+	if err != nil {
+		t.Fatalf(`DependencyRelation_getDependencyProviderIds * failed`)
+	}
+	_, err = dr.GetProviderIdsByRules([]*discovery.MicroServiceKey{
+		{ServiceName: "a", Version: "1.0.0"},
+		{ServiceName: "b", Version: "latest"},
+	})
+	if err != nil {
+		t.Fatalf(`DependencyRelation_getDependencyProviderIds failed`)
+	}
+
+	_, err = dr.GetDependencyConsumers()
+	if err != nil {
+		t.Fatalf(`DependencyRelation_GetDependencyConsumers failed`)
+	}
+
+	t.Run("GetServiceByMicroServiceKey when service not exist", func(t *testing.T) {
+		_, err = dr.GetServiceByMicroServiceKey(&discovery.MicroServiceKey{})
+		if err != nil && !errors.Is(err, datasource.ErrNoData) {
+			t.Fatalf(`DependencyRelation_getServiceByMicroServiceKey failed`)
+		}
+		assert.Equal(t, datasource.ErrNoData, err, "service not exist")
+	})
+
+	_, err = dr.GetConsumerOfSameServiceNameAndAppID(&discovery.MicroServiceKey{})
+	if err != nil {
+		t.Fatalf(`DependencyRelation_getConsumerOfSameServiceNameAndAppId failed`)
+	}
+
+	dr = NewConsumerDependencyRelation(context.Background(), "", &discovery.MicroService{})
+	_, err = dr.GetDependencyConsumersOfProvider()
+	if err == nil {
+		t.Fatalf(`DependencyRelation_getDependencyConsumersOfProvider failed`)
+	}
+	_, err = dr.GetDependencyProviders()
+	if err != nil {
+		t.Fatalf(`DependencyRelation_GetDependencyProviders failed`)
+	}
+}
+
+func TestDependencyRelationFilterOpt(t *testing.T) {
+	op := ToDependencyRelationFilterOpt(
+		WithSameDomainProject(),
+		WithoutSelfDependency(),
+	)
+	if !op.NonSelf || !op.SameDomainProject {
+		t.Fatalf(`ToDependencyRelationFilterOpt failed`)
+	}
+}
diff --git a/datasource/etcd/util/dependency_util.go b/datasource/etcd/util/dependency_util.go
index dd00d02..bae4bac 100644
--- a/datasource/etcd/util/dependency_util.go
+++ b/datasource/etcd/util/dependency_util.go
@@ -35,7 +35,7 @@ import (
 func GetConsumerIds(ctx context.Context, domainProject string, provider *pb.MicroService) ([]string, error) {
 	// 查询所有consumer
 	dr := NewProviderDependencyRelation(ctx, domainProject, provider)
-	consumerIds, err := dr.GetDependencyConsumerIds()
+	consumerIds, err := dr.getDependencyConsumerIds()
 	if err != nil {
 		log.Errorf(err, "get service[%s]'s consumerIds failed", provider.ServiceId)
 		return nil, err
@@ -43,10 +43,16 @@ func GetConsumerIds(ctx context.Context, domainProject string, provider *pb.Micr
 	return consumerIds, nil
 }
 
+func GetConsumers(ctx context.Context, domainProject string, provider *pb.MicroService,
+	opts ...DependencyRelationFilterOption) ([]*pb.MicroService, error) {
+	dr := NewProviderDependencyRelation(ctx, domainProject, provider)
+	return dr.GetDependencyConsumers(opts...)
+}
+
 func GetProviderIds(ctx context.Context, domainProject string, consumer *pb.MicroService) ([]string, error) {
 	// 查询所有provider
 	dr := NewConsumerDependencyRelation(ctx, domainProject, consumer)
-	providerIDs, err := dr.GetDependencyProviderIds()
+	providerIDs, err := dr.getDependencyProviderIds()
 	if err != nil {
 		log.Errorf(err, "get service[%s]'s providerIDs failed", consumer.ServiceId)
 		return nil, err
@@ -54,6 +60,12 @@ func GetProviderIds(ctx context.Context, domainProject string, consumer *pb.Micr
 	return providerIDs, nil
 }
 
+func GetProviders(ctx context.Context, domainProject string, consumer *pb.MicroService,
+	opts ...DependencyRelationFilterOption) ([]*pb.MicroService, error) {
+	dr := NewConsumerDependencyRelation(ctx, domainProject, consumer)
+	return dr.GetDependencyProviders(opts...)
+}
+
 func DependencyRuleExist(ctx context.Context, provider *pb.MicroServiceKey, consumer *pb.MicroServiceKey) (bool, error) {
 	targetDomainProject := provider.Tenant
 	if len(targetDomainProject) == 0 {
@@ -61,16 +73,16 @@ func DependencyRuleExist(ctx context.Context, provider *pb.MicroServiceKey, cons
 	}
 
 	consumerKey := path.GenerateConsumerDependencyRuleKey(consumer.Tenant, consumer)
-	existed, err := DependencyRuleExistUtil(ctx, consumerKey, provider)
+	existed, err := DependencyRuleExistWithKey(ctx, consumerKey, provider)
 	if err != nil || existed {
 		return existed, err
 	}
 
 	providerKey := path.GenerateProviderDependencyRuleKey(targetDomainProject, provider)
-	return DependencyRuleExistUtil(ctx, providerKey, consumer)
+	return DependencyRuleExistWithKey(ctx, providerKey, consumer)
 }
 
-func DependencyRuleExistUtil(ctx context.Context, key string, target *pb.MicroServiceKey) (bool, error) {
+func DependencyRuleExistWithKey(ctx context.Context, key string, target *pb.MicroServiceKey) (bool, error) {
 	compareData, err := TransferToMicroServiceDependency(ctx, key)
 	if err != nil {
 		return false, err
@@ -108,17 +120,14 @@ func AddServiceVersionRule(ctx context.Context, domainProject string, consumer *
 
 	id := util.StringJoin([]string{provider.AppId, provider.ServiceName}, "_")
 	key := path.GenerateConsumerDependencyQueueKey(domainProject, consumer.ServiceId, id)
-	resp, err := client.Instance().TxnWithCmp(ctx,
-		nil,
-		[]client.CompareOp{client.OpCmp(client.CmpStrVal(key), client.CmpEqual, util.BytesToStringWithNoCopy(data))},
-		[]client.PluginOp{client.OpPut(client.WithStrKey(key), client.WithValue(data))})
+	override, err := client.Instance().PutNoOverride(ctx, client.WithStrKey(key), client.WithValue(data))
 	if err != nil {
 		return err
 	}
-	if !resp.Succeeded {
-		log.Infof("put in queue[%s/%s]: consumer[%s/%s/%s/%s] -> provider[%s/%s/%s/%s]", consumer.ServiceId, id,
+	if override {
+		log.Infof("put in queue[%s/%s]: consumer[%s/%s/%s/%s] -> provider[%s/%s/%s]", consumer.ServiceId, id,
 			consumer.Environment, consumer.AppId, consumer.ServiceName, consumer.Version,
-			provider.Environment, provider.AppId, provider.ServiceName, provider.Version)
+			provider.Environment, provider.AppId, provider.ServiceName)
 	}
 	return nil
 }
@@ -177,13 +186,6 @@ func parseAddOrUpdateRules(ctx context.Context, dep *Dependency) (createDependen
 		if ok, _ := ContainServiceDependency(oldProviderRules.Dependency, tmpProviderRule); ok {
 			continue
 		}
-
-		if tmpProviderRule.ServiceName == "*" {
-			createDependencyRuleList = append([]*pb.MicroServiceKey{}, tmpProviderRule)
-			deleteDependencyRuleList = oldProviderRules.Dependency
-			break
-		}
-
 		createDependencyRuleList = append(createDependencyRuleList, tmpProviderRule)
 		old := IsNeedUpdate(oldProviderRules.Dependency, tmpProviderRule)
 		if old != nil {
@@ -191,48 +193,14 @@ func parseAddOrUpdateRules(ctx context.Context, dep *Dependency) (createDependen
 		}
 	}
 	for _, oldProviderRule := range oldProviderRules.Dependency {
-		if oldProviderRule.ServiceName == "*" {
-			createDependencyRuleList = nil
-			deleteDependencyRuleList = nil
-			return
-		}
 		if ok, _ := ContainServiceDependency(deleteDependencyRuleList, oldProviderRule); !ok {
 			existDependencyRuleList = append(existDependencyRuleList, oldProviderRule)
 		}
 	}
-
 	dep.ProvidersRule = append(createDependencyRuleList, existDependencyRuleList...)
 	return
 }
 
-func parseOverrideRules(ctx context.Context, dep *Dependency) (createDependencyRuleList, existDependencyRuleList, deleteDependencyRuleList []*pb.MicroServiceKey) {
-	conKey := path.GenerateConsumerDependencyRuleKey(dep.DomainProject, dep.Consumer)
-
-	oldProviderRules, err := TransferToMicroServiceDependency(ctx, conKey)
-	if err != nil {
-		log.Errorf(err, "override dependency rule failed, get consumer[%s/%s/%s/%s]'s dependency rule failed",
-			dep.Consumer.Environment, dep.Consumer.AppId, dep.Consumer.ServiceName, dep.Consumer.Version)
-		return
-	}
-
-	deleteDependencyRuleList = make([]*pb.MicroServiceKey, 0, len(oldProviderRules.Dependency))
-	createDependencyRuleList = make([]*pb.MicroServiceKey, 0, len(dep.ProvidersRule))
-	existDependencyRuleList = make([]*pb.MicroServiceKey, 0, len(oldProviderRules.Dependency))
-	for _, oldProviderRule := range oldProviderRules.Dependency {
-		if ok, _ := ContainServiceDependency(dep.ProvidersRule, oldProviderRule); !ok {
-			deleteDependencyRuleList = append(deleteDependencyRuleList, oldProviderRule)
-		} else {
-			existDependencyRuleList = append(existDependencyRuleList, oldProviderRule)
-		}
-	}
-	for _, tmpProviderRule := range dep.ProvidersRule {
-		if ok, _ := ContainServiceDependency(existDependencyRuleList, tmpProviderRule); !ok {
-			createDependencyRuleList = append(createDependencyRuleList, tmpProviderRule)
-		}
-	}
-	return
-}
-
 func syncDependencyRule(ctx context.Context, dep *Dependency, filter func(context.Context, *Dependency) (_, _, _ []*pb.MicroServiceKey)) error {
 	//更新consumer的providers的值,consumer的版本是确定的
 	consumerFlag := strings.Join([]string{dep.Consumer.Environment, dep.Consumer.AppId, dep.Consumer.ServiceName, dep.Consumer.Version}, "/")
@@ -259,10 +227,6 @@ func AddDependencyRule(ctx context.Context, dep *Dependency) error {
 	return syncDependencyRule(ctx, dep, parseAddOrUpdateRules)
 }
 
-func CreateDependencyRule(ctx context.Context, dep *Dependency) error {
-	return syncDependencyRule(ctx, dep, parseOverrideRules)
-}
-
 func IsNeedUpdate(services []*pb.MicroServiceKey, service *pb.MicroServiceKey) *pb.MicroServiceKey {
 	for _, tmp := range services {
 		if DiffServiceVersion(tmp, service) {
@@ -343,19 +307,14 @@ func removeProviderRuleOfConsumer(ctx context.Context, domainProject string, cac
 	}
 
 	var ops []client.PluginOp
-loop:
 	for _, keyValue := range resp.Kvs {
 		var left []*pb.MicroServiceKey
 		all := keyValue.Value.(*pb.MicroServiceDependency).Dependency
 		for _, key := range all {
-			if key.ServiceName == "*" {
-				continue loop
-			}
-
 			id := path.GenerateProviderDependencyRuleKey(key.Tenant, key)
 			exist, ok := cache[id]
 			if !ok {
-				_, exist, err = FindServiceIds(ctx, key.Version, key)
+				_, exist, err = FindServiceIds(ctx, key, false)
 				if err != nil {
 					return nil, fmt.Errorf("%v, find service %s/%s/%s/%s",
 						err, key.Tenant, key.AppId, key.ServiceName, key.Version)
@@ -403,7 +362,7 @@ func RemoveProviderRuleKeys(ctx context.Context, domainProject string, cache map
 				continue
 			}
 
-			_, exist, err = FindServiceIds(ctx, key.Version, key)
+			_, exist, err = FindServiceIds(ctx, key, false)
 			if err != nil {
 				return nil, fmt.Errorf("find service %s/%s/%s/%s, %v",
 					key.Tenant, key.AppId, key.ServiceName, key.Version, err)
diff --git a/datasource/etcd/util/dependency_test.go b/datasource/etcd/util/dependency_util_test.go
similarity index 64%
rename from datasource/etcd/util/dependency_test.go
rename to datasource/etcd/util/dependency_util_test.go
index 6e03a4a..f22f061 100644
--- a/datasource/etcd/util/dependency_test.go
+++ b/datasource/etcd/util/dependency_util_test.go
@@ -19,14 +19,10 @@ package util_test
 
 import (
 	"context"
-	"errors"
 	"testing"
 
-	"github.com/go-chassis/cari/discovery"
-	"github.com/stretchr/testify/assert"
-
-	"github.com/apache/servicecomb-service-center/datasource"
 	. "github.com/apache/servicecomb-service-center/datasource/etcd/util"
+	"github.com/go-chassis/cari/discovery"
 )
 
 func TestDeleteDependencyForService(t *testing.T) {
@@ -59,15 +55,8 @@ func TestEqualServiceDependency(t *testing.T) {
 	}
 }
 
-func TestCreateDependencyRule(t *testing.T) {
-	err := CreateDependencyRule(context.Background(), &Dependency{
-		Consumer: &discovery.MicroServiceKey{},
-	})
-	if err != nil {
-		t.Fatalf(`CreateDependencyRule failed`)
-	}
-
-	err = AddDependencyRule(context.Background(), &Dependency{
+func TestAddDependencyRule(t *testing.T) {
+	err := AddDependencyRule(context.Background(), &Dependency{
 		Consumer: &discovery.MicroServiceKey{},
 	})
 	if err != nil {
@@ -117,9 +106,9 @@ func TestCreateDependencyRule(t *testing.T) {
 }
 
 func TestDependencyRuleExistUtil(t *testing.T) {
-	_, err := DependencyRuleExistUtil(context.Background(), "", &discovery.MicroServiceKey{})
+	_, err := DependencyRuleExistWithKey(context.Background(), "", &discovery.MicroServiceKey{})
 	if err == nil {
-		t.Fatalf(`DependencyRuleExistUtil failed`)
+		t.Fatalf(`DependencyRuleExistWithKey failed`)
 	}
 }
 
@@ -197,64 +186,8 @@ func TestUpdateServiceForAddDependency(t *testing.T) {
 	}
 }
 
-func TestDependency(t *testing.T) {
-	d := &Dependency{
-		DeleteDependencyRuleList: []*discovery.MicroServiceKey{
-			{ServiceName: "b", Version: "1.0.0"},
-		},
-		CreateDependencyRuleList: []*discovery.MicroServiceKey{
-			{ServiceName: "a", Version: "1.0.0"},
-		},
-	}
-	err := d.Commit(context.Background())
-	if err != nil {
-		t.Fatalf(`Dependency_UpdateProvidersRuleOfConsumer failed`)
-	}
-
-	dr := NewDependencyRelation(context.Background(), "", &discovery.MicroService{}, &discovery.MicroService{})
-	_, err = dr.GetProviderIdsByRules([]*discovery.MicroServiceKey{
-		{ServiceName: "*"},
-	})
-	if err != nil {
-		t.Fatalf(`DependencyRelation_getDependencyProviderIds * failed`)
-	}
-	_, err = dr.GetProviderIdsByRules([]*discovery.MicroServiceKey{
-		{ServiceName: "a", Version: "1.0.0"},
-		{ServiceName: "b", Version: "latest"},
-	})
-	if err != nil {
-		t.Fatalf(`DependencyRelation_getDependencyProviderIds failed`)
-	}
-
-	_, err = dr.GetDependencyConsumers()
-	if err != nil {
-		t.Fatalf(`DependencyRelation_GetDependencyConsumers failed`)
-	}
-
-	t.Run("GetServiceByMicroServiceKey when service not exist", func(t *testing.T) {
-		_, err = dr.GetServiceByMicroServiceKey(&discovery.MicroServiceKey{})
-		if err != nil && !errors.Is(err, datasource.ErrNoData) {
-			t.Fatalf(`DependencyRelation_getServiceByMicroServiceKey failed`)
-		}
-		assert.Equal(t, datasource.ErrNoData, err, "service not exist")
-	})
-
-	_, err = dr.GetConsumerOfSameServiceNameAndAppID(&discovery.MicroServiceKey{})
-	if err != nil {
-		t.Fatalf(`DependencyRelation_getConsumerOfSameServiceNameAndAppId failed`)
-	}
-
-	dr = NewConsumerDependencyRelation(context.Background(), "", &discovery.MicroService{})
-	_, err = dr.GetDependencyConsumersOfProvider()
-	if err == nil {
-		t.Fatalf(`DependencyRelation_getDependencyConsumersOfProvider failed`)
-	}
-	_, err = dr.GetDependencyProviders()
-	if err != nil {
-		t.Fatalf(`DependencyRelation_GetDependencyProviders failed`)
-	}
-
-	err = CleanUpDependencyRules(context.Background(), "")
+func TestCleanUpDependencyRules(t *testing.T) {
+	err := CleanUpDependencyRules(context.Background(), "")
 	if err == nil {
 		t.Fatalf(`DependencyRelation_CleanUpDependencyRules failed`)
 	}
@@ -269,13 +202,3 @@ func TestDependency(t *testing.T) {
 		t.Fatalf(`DependencyRelation_removeProviderRuleKeys failed`)
 	}
 }
-
-func TestDependencyRelationFilterOpt(t *testing.T) {
-	op := ToDependencyRelationFilterOpt(
-		WithSameDomainProject(),
-		WithoutSelfDependency(),
-	)
-	if !op.NonSelf || !op.SameDomainProject {
-		t.Fatalf(`ToDependencyRelationFilterOpt failed`)
-	}
-}
diff --git a/datasource/etcd/util/microservice_util.go b/datasource/etcd/util/microservice_util.go
index b2c49d8..32b8e01 100644
--- a/datasource/etcd/util/microservice_util.go
+++ b/datasource/etcd/util/microservice_util.go
@@ -183,39 +183,40 @@ func GetServiceAllVersions(ctx context.Context, key *pb.MicroServiceKey, alias b
 	return resp, err
 }
 
-func FindServiceIds(ctx context.Context, versionRule string, key *pb.MicroServiceKey) ([]string, bool, error) {
-	// 版本规则
-	match := ParseVersionRule(versionRule)
-	if match == nil {
-		copy := *key
-		copy.Version = versionRule
-		serviceID, err := GetServiceID(ctx, &copy)
+// FindServiceIds return serviceIDs match the key, the existence of the micro-service without consider of version
+func FindServiceIds(ctx context.Context, key *pb.MicroServiceKey, matchVersion bool) ([]string, bool, error) {
+	resp, err := GetServiceAllVersions(ctx, key, false)
+	if err != nil {
+		return nil, false, err
+	}
+	fromEtcdKey := path.GetInfoFromSvcIndexKV
+	kvs := resp.Kvs
+	if len(kvs) == 0 {
+		resp, err := GetServiceAllVersions(ctx, key, true)
 		if err != nil {
 			return nil, false, err
 		}
-		if len(serviceID) > 0 {
-			return []string{serviceID}, true, nil
-		}
-		return nil, false, nil
+		fromEtcdKey = path.GetInfoFromSvcAliasKV
+		kvs = resp.Kvs
 	}
-
-	searchAlias := false
-	alsoFindAlias := len(key.Alias) > 0
-
-FIND_RULE:
-	resp, err := GetServiceAllVersions(ctx, key, searchAlias)
-	if err != nil {
-		return nil, false, err
+	var (
+		etcdKeys   [][]byte
+		serviceIDs []string
+	)
+	for _, kv := range kvs {
+		etcdKeys = append(etcdKeys, kv.Key)
+		serviceIDs = append(serviceIDs, kv.Value.(string))
 	}
-	if len(resp.Kvs) == 0 {
-		if !alsoFindAlias {
-			return nil, false, nil
+	if !matchVersion {
+		return serviceIDs, len(serviceIDs) > 0, nil
+	}
+	for i, etcdKey := range etcdKeys {
+		serviceKey := fromEtcdKey(etcdKey)
+		if serviceKey.Version == key.Version {
+			return []string{serviceIDs[i]}, len(serviceIDs) > 0, nil
 		}
-		searchAlias = true
-		alsoFindAlias = false
-		goto FIND_RULE
 	}
-	return match(resp.Kvs), true, nil
+	return nil, len(serviceIDs) > 0, nil
 }
 
 func ServiceExist(ctx context.Context, domainProject string, serviceID string) bool {
diff --git a/datasource/etcd/util/util_suite_test.go b/datasource/etcd/util/util_test.go
similarity index 58%
rename from datasource/etcd/util/util_suite_test.go
rename to datasource/etcd/util/util_test.go
index bbe3823..ca52a00 100644
--- a/datasource/etcd/util/util_suite_test.go
+++ b/datasource/etcd/util/util_test.go
@@ -23,50 +23,84 @@ import (
 	"errors"
 	"testing"
 
-	"github.com/stretchr/testify/assert"
+	_ "github.com/apache/servicecomb-service-center/test"
 
 	"github.com/apache/servicecomb-service-center/datasource"
 	"github.com/apache/servicecomb-service-center/datasource/etcd/client"
-	_ "github.com/apache/servicecomb-service-center/test"
-
 	serviceUtil "github.com/apache/servicecomb-service-center/datasource/etcd/util"
 	"github.com/apache/servicecomb-service-center/pkg/util"
-
 	proto "github.com/go-chassis/cari/discovery"
-
-	. "github.com/onsi/ginkgo"
-	"github.com/onsi/ginkgo/reporters"
-
-	. "github.com/onsi/gomega"
+	"github.com/stretchr/testify/assert"
 )
 
-func init() {
-}
-
-func TestMicroservice(t *testing.T) {
-	RegisterFailHandler(Fail)
-	junitReporter := reporters.NewJUnitReporter("util.junit.xml")
-	RunSpecsWithDefaultAndCustomReporters(t, "util Suite", []Reporter{junitReporter})
+func getContextWith(domain string, project string) context.Context {
+	return util.WithNoCache(util.SetDomainProject(context.Background(), domain, project))
 }
 
 func TestFindServiceIds(t *testing.T) {
-	_, _, err := serviceUtil.FindServiceIds(context.Background(),
-		"latest", &proto.MicroServiceKey{})
-	if err != nil {
-		t.Fatalf("TestFindServiceIds failed")
-	}
-
-	_, _, err = serviceUtil.FindServiceIds(context.Background(),
-		"1.0.0", &proto.MicroServiceKey{})
-	if err != nil {
-		t.Fatalf("TestFindServiceIds failed")
-	}
+	ctx := getContextWith("default", "default")
+	t.Run("no service, should return empty", func(t *testing.T) {
+		ids, exist, err := serviceUtil.FindServiceIds(ctx, &proto.MicroServiceKey{}, false)
+		assert.NoError(t, err)
+		assert.False(t, exist)
+		assert.Empty(t, ids)
+
+		ids, exist, err = serviceUtil.FindServiceIds(ctx, &proto.MicroServiceKey{}, true)
+		assert.NoError(t, err)
+		assert.False(t, exist)
+		assert.Empty(t, ids)
+	})
 
-	_, _, err = serviceUtil.FindServiceIds(context.Background(),
-		"1.0+", &proto.MicroServiceKey{Alias: "test"})
-	if err != nil {
-		t.Fatalf("TestFindServiceIds failed")
-	}
+	t.Run("exist service, should return empty", func(t *testing.T) {
+		resp, err := datasource.GetMetadataManager().RegisterService(ctx, &proto.CreateServiceRequest{
+			Service: &proto.MicroService{
+				Alias:       "test_find_alias_ids",
+				ServiceName: "test_find_service_ids",
+				Version:     "2.0",
+			},
+		})
+		assert.NoError(t, err)
+		serviceID1 := resp.ServiceId
+		defer datasource.GetMetadataManager().UnregisterService(ctx, &proto.DeleteServiceRequest{ServiceId: serviceID1})
+
+		resp, err = datasource.GetMetadataManager().RegisterService(ctx, &proto.CreateServiceRequest{
+			Service: &proto.MicroService{
+				Alias:       "test_find_alias_ids",
+				ServiceName: "test_find_service_ids",
+				Version:     "3.0",
+			},
+		})
+		assert.NoError(t, err)
+		serviceID2 := resp.ServiceId
+		defer datasource.GetMetadataManager().UnregisterService(ctx, &proto.DeleteServiceRequest{ServiceId: serviceID2})
+
+		ids, exist, err := serviceUtil.FindServiceIds(ctx, &proto.MicroServiceKey{
+			Tenant:      "default/default",
+			ServiceName: "test_find_service_ids",
+			Version:     "1.0",
+		}, false)
+		assert.NoError(t, err)
+		assert.True(t, exist)
+		assert.Equal(t, 2, len(ids))
+
+		ids, exist, err = serviceUtil.FindServiceIds(ctx, &proto.MicroServiceKey{
+			Tenant:      "default/default",
+			ServiceName: "test_find_service_ids",
+			Version:     "1.0",
+		}, true)
+		assert.NoError(t, err)
+		assert.True(t, exist)
+		assert.Empty(t, ids)
+
+		ids, exist, err = serviceUtil.FindServiceIds(ctx, &proto.MicroServiceKey{
+			Tenant:      "default/default",
+			ServiceName: "test_find_service_ids",
+			Version:     "2.0",
+		}, true)
+		assert.NoError(t, err)
+		assert.True(t, exist)
+		assert.Equal(t, []string{serviceID1}, ids)
+	})
 }
 
 func TestGetService(t *testing.T) {
diff --git a/datasource/instance_test.go b/datasource/instance_test.go
index 5926654..291e908 100644
--- a/datasource/instance_test.go
+++ b/datasource/instance_test.go
@@ -589,54 +589,33 @@ func TestInstance_Query(t *testing.T) {
 		instanceId9 = respCreateInstance.InstanceId
 	})
 
-	t.Run("query instance", func(t *testing.T) {
-		log.Info("find with version rule")
+	t.Run("query instance, should ok", func(t *testing.T) {
 		respFind, err := datasource.GetMetadataManager().FindInstances(getContext(), &pb.FindInstancesRequest{
 			ConsumerServiceId: serviceId1,
 			AppId:             "query_instance_ms",
 			ServiceName:       "query_instance_service_ms",
-			VersionRule:       "latest",
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
+		assertInstancesContain(t, respFind.Instances, instanceId1)
 		assertInstancesContain(t, respFind.Instances, instanceId2)
+	})
 
-		respFind, err = datasource.GetMetadataManager().FindInstances(getContext(), &pb.FindInstancesRequest{
+	t.Run("query not exist service instance, should failed", func(t *testing.T) {
+		respFind, err := datasource.GetMetadataManager().FindInstances(getContext(), &pb.FindInstancesRequest{
 			ConsumerServiceId: serviceId1,
 			AppId:             "query_instance_ms",
-			ServiceName:       "query_instance_service_ms",
-			VersionRule:       "1.0.0+",
-			Tags:              []string{},
-		})
-		assert.NoError(t, err)
-		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
-		assertInstancesContain(t, respFind.Instances, instanceId2)
-
-		respFind, err = datasource.GetMetadataManager().FindInstances(getContext(), &pb.FindInstancesRequest{
-			ConsumerServiceId: serviceId1,
-			AppId:             "query_instance_ms",
-			ServiceName:       "query_instance_service_ms",
-			VersionRule:       "1.0.0",
-		})
-		assert.NoError(t, err)
-		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
-		assertInstancesContain(t, respFind.Instances, instanceId1)
-
-		respFind, err = datasource.GetMetadataManager().FindInstances(getContext(), &pb.FindInstancesRequest{
-			ConsumerServiceId: serviceId1,
-			AppId:             "query_instance",
-			ServiceName:       "query_instance_service",
-			VersionRule:       "0.0.0",
+			ServiceName:       "not-exist",
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ErrServiceNotExists, respFind.Response.GetCode())
+	})
 
-		log.Info("find with env")
-		respFind, err = datasource.GetMetadataManager().FindInstances(getContext(), &pb.FindInstancesRequest{
+	t.Run("query instance when with consumerID or specify env without consumerID, should ok", func(t *testing.T) {
+		respFind, err := datasource.GetMetadataManager().FindInstances(getContext(), &pb.FindInstancesRequest{
 			ConsumerServiceId: serviceId4,
 			AppId:             "query_instance_ms",
 			ServiceName:       "query_instance_diff_env_service_ms",
-			VersionRule:       "1.0.0",
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
@@ -647,20 +626,19 @@ func TestInstance_Query(t *testing.T) {
 			Environment: pb.ENV_PROD,
 			AppId:       "query_instance_ms",
 			ServiceName: "query_instance_diff_env_service_ms",
-			VersionRule: "1.0.0",
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
 		assert.Equal(t, 1, len(respFind.Instances))
 		assertInstancesContain(t, respFind.Instances, instanceId4)
+	})
 
-		log.Info("find with rev")
+	t.Run("query instance with revision, should ok", func(t *testing.T) {
 		ctx := util.SetContext(getContext(), util.CtxNocache, "")
-		respFind, err = datasource.GetMetadataManager().FindInstances(ctx, &pb.FindInstancesRequest{
+		respFind, err := datasource.GetMetadataManager().FindInstances(ctx, &pb.FindInstancesRequest{
 			ConsumerServiceId: serviceId8,
 			AppId:             "query_instance_ms",
 			ServiceName:       "query_instance_with_rev_ms",
-			VersionRule:       "1.0.0",
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
@@ -673,41 +651,41 @@ func TestInstance_Query(t *testing.T) {
 			ConsumerServiceId: serviceId8,
 			AppId:             "query_instance_ms",
 			ServiceName:       "query_instance_with_rev_ms",
-			VersionRule:       "1.0.0",
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
 		assert.Equal(t, ctx.Value(util.CtxResponseRevision), rev)
 		assertInstancesContain(t, respFind.Instances, instanceId8)
+	})
 
-		log.Info("find should return 200 if consumer is diff apps")
-		respFind, err = datasource.GetMetadataManager().FindInstances(getContext(), &pb.FindInstancesRequest{
+	t.Run("find should return 200 if consumer is diff apps, should ok", func(t *testing.T) {
+		respFind, err := datasource.GetMetadataManager().FindInstances(getContext(), &pb.FindInstancesRequest{
 			ConsumerServiceId: serviceId3,
 			AppId:             "query_instance_ms",
 			ServiceName:       "query_instance_service_ms",
-			VersionRule:       "1.0.5",
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
 		assert.Equal(t, 0, len(respFind.Instances))
+	})
 
-		log.Info("provider tag does not exist")
-		respFind, err = datasource.GetMetadataManager().FindInstances(getContext(), &pb.FindInstancesRequest{
+	t.Run("find provider instance but specify tag does not exist, should ok", func(t *testing.T) {
+		respFind, err := datasource.GetMetadataManager().FindInstances(getContext(), &pb.FindInstancesRequest{
 			ConsumerServiceId: serviceId1,
 			AppId:             "query_instance_ms",
 			ServiceName:       "query_instance_service_ms",
-			VersionRule:       "latest",
 			Tags:              []string{"not_exist_tag"},
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
 		assert.Equal(t, 0, len(respFind.Instances))
+	})
 
-		log.Info("shared service discovery")
+	t.Run("find global provider instance, should ok", func(t *testing.T) {
 		config.Server.Config.GlobalVisible = "query_instance_shared_provider_ms"
 		core.RegisterGlobalServices()
 		core.Service.Environment = pb.ENV_PROD
-		respFind, err = datasource.GetMetadataManager().FindInstances(
+		respFind, err := datasource.GetMetadataManager().FindInstances(
 			util.SetTargetDomainProject(
 				util.SetDomainProject(util.CloneContext(getContext()), "user", "user"),
 				"default", "default"),
@@ -715,7 +693,6 @@ func TestInstance_Query(t *testing.T) {
 				ConsumerServiceId: serviceId6,
 				AppId:             "default",
 				ServiceName:       "query_instance_shared_provider_ms",
-				VersionRule:       "1.0.0",
 			})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
@@ -726,7 +703,6 @@ func TestInstance_Query(t *testing.T) {
 			ConsumerServiceId: serviceId7,
 			AppId:             "default",
 			ServiceName:       "query_instance_shared_provider_ms",
-			VersionRule:       "1.0.0",
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
@@ -739,8 +715,7 @@ func TestInstance_Query(t *testing.T) {
 		core.Service.Environment = pb.ENV_DEV
 	})
 
-	t.Run("batch query instances", func(t *testing.T) {
-		log.Info("find with version rule")
+	t.Run("batch query instances, should ok", func(t *testing.T) {
 		respFind, err := datasource.GetMetadataManager().BatchFind(getContext(), &pb.BatchFindInstancesRequest{
 			ConsumerServiceId: serviceId1,
 			Services: []*pb.FindService{
@@ -748,21 +723,23 @@ func TestInstance_Query(t *testing.T) {
 					Service: &pb.MicroServiceKey{
 						AppId:       "query_instance_ms",
 						ServiceName: "query_instance_service_ms",
-						Version:     "latest",
 					},
 				},
 				{
 					Service: &pb.MicroServiceKey{
 						AppId:       "query_instance_ms",
-						ServiceName: "query_instance_service_ms",
-						Version:     "1.0.0+",
+						ServiceName: "query_instance_diff_env_service_ms",
 					},
 				},
 				{
 					Service: &pb.MicroServiceKey{
-						AppId:       "query_instance_ms",
+						AppId:       "query_instance_diff_app_ms",
 						ServiceName: "query_instance_service_ms",
-						Version:     "0.0.0",
+					},
+				},
+				{
+					Service: &pb.MicroServiceKey{
+						ServiceName: "not-exists",
 					},
 				},
 			},
@@ -770,21 +747,22 @@ func TestInstance_Query(t *testing.T) {
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
 		assert.Equal(t, int64(0), respFind.Services.Updated[0].Index)
+		assertInstancesContain(t, respFind.Services.Updated[0].Instances, instanceId1)
 		assertInstancesContain(t, respFind.Services.Updated[0].Instances, instanceId2)
-		assert.Equal(t, int64(1), respFind.Services.Updated[1].Index)
-		assertInstancesContain(t, respFind.Services.Updated[1].Instances, instanceId2)
-		assert.Equal(t, int64(2), respFind.Services.Failed[0].Indexes[0])
+		assert.Equal(t, int64(2), respFind.Services.Updated[1].Index)
+		assert.Empty(t, respFind.Services.Updated[1].Instances)
+		assert.Equal(t, 2, len(respFind.Services.Failed[0].Indexes))
 		assert.Equal(t, pb.ErrServiceNotExists, respFind.Services.Failed[0].Error.Code)
+	})
 
-		log.Info("find with env")
-		respFind, err = datasource.GetMetadataManager().BatchFind(getContext(), &pb.BatchFindInstancesRequest{
+	t.Run("batch query instances without specify env, should ok", func(t *testing.T) {
+		respFind, err := datasource.GetMetadataManager().BatchFind(getContext(), &pb.BatchFindInstancesRequest{
 			ConsumerServiceId: serviceId4,
 			Services: []*pb.FindService{
 				{
 					Service: &pb.MicroServiceKey{
 						AppId:       "query_instance_ms",
 						ServiceName: "query_instance_diff_env_service_ms",
-						Version:     "1.0.0",
 					},
 				},
 			},
@@ -793,24 +771,23 @@ func TestInstance_Query(t *testing.T) {
 		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
 		assert.Equal(t, 1, len(respFind.Services.Updated[0].Instances))
 		assert.Equal(t, instanceId4, respFind.Services.Updated[0].Instances[0].InstanceId)
+	})
 
-		log.Info("find with rev")
+	t.Run("batch query instances with revision, should ok", func(t *testing.T) {
 		ctx := util.SetContext(getContext(), util.CtxNocache, "")
-		respFind, err = datasource.GetMetadataManager().BatchFind(ctx, &pb.BatchFindInstancesRequest{
+		respFind, err := datasource.GetMetadataManager().BatchFind(ctx, &pb.BatchFindInstancesRequest{
 			ConsumerServiceId: serviceId8,
 			Services: []*pb.FindService{
 				{
 					Service: &pb.MicroServiceKey{
 						AppId:       "query_instance_ms",
 						ServiceName: "query_instance_with_rev_ms",
-						Version:     "1.0.0",
 					},
 				},
 				{
 					Service: &pb.MicroServiceKey{
 						AppId:       "query_instance_ms",
 						ServiceName: "batch_query_instance_with_rev_ms",
-						Version:     "1.0.0",
 					},
 				},
 			},
@@ -851,7 +828,6 @@ func TestInstance_Query(t *testing.T) {
 					Service: &pb.MicroServiceKey{
 						AppId:       "query_instance_ms",
 						ServiceName: "query_instance_with_rev_ms",
-						Version:     "1.0.0",
 					},
 					Rev: "x",
 				},
@@ -880,7 +856,6 @@ func TestInstance_Query(t *testing.T) {
 					Service: &pb.MicroServiceKey{
 						AppId:       "query_instance_ms",
 						ServiceName: "query_instance_with_rev_ms",
-						Version:     "1.0.0",
 					},
 					Rev: rev,
 				},
@@ -899,9 +874,10 @@ func TestInstance_Query(t *testing.T) {
 		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
 		assert.Equal(t, int64(0), respFind.Services.NotModified[0])
 		assert.Equal(t, int64(0), respFind.Instances.NotModified[0])
+	})
 
-		log.Info("find should return 200 even if consumer is diff apps")
-		respFind, err = datasource.GetMetadataManager().BatchFind(getContext(), &pb.BatchFindInstancesRequest{
+	t.Run("find should return 200 even if consumer is diff apps, should ok", func(t *testing.T) {
+		respFind, err := datasource.GetMetadataManager().BatchFind(getContext(), &pb.BatchFindInstancesRequest{
 			ConsumerServiceId: serviceId3,
 			Services: []*pb.FindService{
 				{
@@ -916,12 +892,13 @@ func TestInstance_Query(t *testing.T) {
 		assert.NoError(t, err)
 		assert.Equal(t, pb.ResponseSuccess, respFind.Response.GetCode())
 		assert.Equal(t, 0, len(respFind.Services.Updated[0].Instances))
+	})
 
-		log.Info("shared service discovery")
+	t.Run("find shared service discovery, should ok", func(t *testing.T) {
 		config.Server.Config.GlobalVisible = "query_instance_shared_provider_ms"
 		core.RegisterGlobalServices()
 		core.Service.Environment = pb.ENV_PROD
-		respFind, err = datasource.GetMetadataManager().BatchFind(
+		respFind, err := datasource.GetMetadataManager().BatchFind(
 			util.SetTargetDomainProject(
 				util.SetDomainProject(util.CloneContext(getContext()), "user", "user"),
 				"default", "default"),
@@ -932,7 +909,6 @@ func TestInstance_Query(t *testing.T) {
 						Service: &pb.MicroServiceKey{
 							AppId:       "default",
 							ServiceName: "query_instance_shared_provider_ms",
-							Version:     "1.0.0",
 						},
 					},
 				},
@@ -949,7 +925,6 @@ func TestInstance_Query(t *testing.T) {
 					Service: &pb.MicroServiceKey{
 						AppId:       "default",
 						ServiceName: "query_instance_shared_provider_ms",
-						Version:     "1.0.0",
 					},
 				},
 			},
@@ -1021,10 +996,10 @@ func TestInstance_Query(t *testing.T) {
 	})
 }
 
-func assertInstancesContain(t *testing.T, instances []*pb.MicroServiceInstance, instanceId2 string) {
+func assertInstancesContain(t *testing.T, instances []*pb.MicroServiceInstance, instanceId string) {
 	found := false
 	for _, instance := range instances {
-		if instance.InstanceId == instanceId2 {
+		if instance.InstanceId == instanceId {
 			found = true
 			break
 		}
diff --git a/datasource/mongo/client/dao/dep.go b/datasource/mongo/client/dao/dep.go
index 34d0855..b0d2df9 100644
--- a/datasource/mongo/client/dao/dep.go
+++ b/datasource/mongo/client/dao/dep.go
@@ -30,14 +30,13 @@ import (
 
 const (
 	Provider = "p"
-	Consumer = "c"
 )
 
 func GetProviderDeps(ctx context.Context, provider *discovery.MicroService) (*discovery.MicroServiceDependency, error) {
-	return getServiceofDeps(ctx, Provider, provider)
+	return getServiceOfDeps(ctx, Provider, provider)
 }
 
-func getServiceofDeps(ctx context.Context, ruleType string, provider *discovery.MicroService) (*discovery.MicroServiceDependency, error) {
+func getServiceOfDeps(ctx context.Context, ruleType string, provider *discovery.MicroService) (*discovery.MicroServiceDependency, error) {
 	filter := mutil.NewFilter(
 		mutil.ServiceType(ruleType),
 		mutil.ServiceKeyTenant(util.ParseDomainProject(ctx)),
diff --git a/datasource/mongo/dep.go b/datasource/mongo/dep.go
index 7216350..80bb141 100644
--- a/datasource/mongo/dep.go
+++ b/datasource/mongo/dep.go
@@ -61,8 +61,7 @@ func (ds *DepManager) SearchProviderDependency(ctx context.Context, request *dis
 		}, nil
 	}
 
-	dr := NewProviderDependencyRelation(ctx, domainProject, provider.Service)
-	services, err := dr.GetDependencyConsumers(ToDependencyFilterOptions(request)...)
+	services, err := GetConsumers(ctx, domainProject, provider.Service, ToDependencyFilterOptions(request)...)
 	if err != nil {
 		log.Error(fmt.Sprintf("GetProviderDependencies failed, provider is %s/%s/%s/%s",
 			provider.Service.Environment, provider.Service.AppId, provider.Service.ServiceName, provider.Service.Version), err)
@@ -99,8 +98,7 @@ func (ds *DepManager) SearchConsumerDependency(ctx context.Context, request *dis
 		}, nil
 	}
 
-	dr := NewConsumerDependencyRelation(ctx, domainProject, consumer.Service)
-	services, err := dr.GetDependencyProviders(ToDependencyFilterOptions(request)...)
+	services, err := GetProviders(ctx, domainProject, consumer.Service, ToDependencyFilterOptions(request)...)
 	if err != nil {
 		log.Error(fmt.Sprintf("query consumer failed, consumer is %s/%s/%s/%s",
 			consumer.Service.Environment, consumer.Service.AppId, consumer.Service.ServiceName, consumer.Service.Version), err)
@@ -115,64 +113,6 @@ func (ds *DepManager) SearchConsumerDependency(ctx context.Context, request *dis
 	}, nil
 }
 
-func (ds *DepManager) AddOrUpdateDependencies(ctx context.Context, dependencys []*discovery.ConsumerDependency, override bool) (*discovery.Response, error) {
-	domainProject := util.ParseDomainProject(ctx)
-	for _, dependency := range dependencys {
-		consumerFlag := util.StringJoin([]string{
-			dependency.Consumer.Environment,
-			dependency.Consumer.AppId,
-			dependency.Consumer.ServiceName,
-			dependency.Consumer.Version}, "/")
-		consumerInfo := discovery.DependenciesToKeys([]*discovery.MicroServiceKey{dependency.Consumer}, domainProject)[0]
-		providersInfo := discovery.DependenciesToKeys(dependency.Providers, domainProject)
-
-		rsp := datasource.ParamsChecker(consumerInfo, providersInfo)
-		if rsp != nil {
-			log.Error(fmt.Sprintf("put request into dependency queue failed, override: %t consumer is %s %s",
-				override, consumerFlag, rsp.Response.GetMessage()), nil)
-			return rsp.Response, nil
-		}
-
-		consumerID, err := GetServiceID(ctx, consumerInfo)
-		if err != nil && !errors.Is(err, datasource.ErrNoData) {
-			log.Error(fmt.Sprintf("put request into dependency queue failed, override: %t, get consumer %s id failed",
-				override, consumerFlag), err)
-			return discovery.CreateResponse(discovery.ErrInternal, err.Error()), err
-		}
-		if len(consumerID) == 0 {
-			log.Error(fmt.Sprintf("put request into dependency queue failed, override: %t consumer %s does not exist",
-				override, consumerFlag), err)
-			return discovery.CreateResponse(discovery.ErrServiceNotExists, fmt.Sprintf("Consumer %s does not exist.", consumerFlag)), nil
-		}
-
-		dependency.Override = override
-		if !override {
-			id := util.GenerateUUID()
-
-			domain := util.ParseDomain(ctx)
-			project := util.ParseProject(ctx)
-			data := &model.ConsumerDep{
-				Domain:      domain,
-				Project:     project,
-				ConsumerID:  consumerID,
-				UUID:        id,
-				ConsumerDep: dependency,
-			}
-			insertRes, err := client.GetMongoClient().Insert(ctx, model.CollectionDep, data)
-			if err != nil {
-				log.Error("failed to insert dep to mongodb", err)
-				return discovery.CreateResponse(discovery.ErrInternal, err.Error()), err
-			}
-			log.Info(fmt.Sprintf("insert dep to mongodb success %s", insertRes.InsertedID))
-		}
-		err = syncDependencyRule(ctx, domainProject, dependency)
-		if err != nil {
-			return nil, err
-		}
-	}
-	return discovery.CreateResponse(discovery.ResponseSuccess, "Create dependency successfully."), nil
-}
-
 func (ds *DepManager) DependencyHandle(ctx context.Context) (err error) {
 	return nil
 }
@@ -193,12 +133,7 @@ func syncDependencyRule(ctx context.Context, domainProject string, r *discovery.
 	if err != nil {
 		return err
 	}
-
-	if r.Override {
-		datasource.ParseOverrideRules(ctx, &dep, oldProviderRules)
-	} else {
-		datasource.ParseAddOrUpdateRules(ctx, &dep, oldProviderRules)
-	}
+	datasource.ParseAddOrUpdateRules(ctx, &dep, oldProviderRules)
 	return updateDeps(domainProject, &dep)
 }
 
@@ -233,9 +168,6 @@ func updateDeps(domainProject string, dep *datasource.Dependency) error {
 		if err != nil {
 			return err
 		}
-		if r.ServiceName == "*" {
-			break
-		}
 	}
 	for _, r := range dep.CreateDependencyRuleList {
 		filter := GenerateProviderDependencyRuleKey(domainProject, r)
@@ -246,9 +178,6 @@ func updateDeps(domainProject string, dep *datasource.Dependency) error {
 		if err != nil {
 			return err
 		}
-		if r.ServiceName == "*" {
-			break
-		}
 	}
 	filter := GenerateConsumerDependencyRuleKey(domainProject, dep.Consumer)
 	if len(dep.ProvidersRule) == 0 {
@@ -344,11 +273,7 @@ func removeProviderDeps(ctx context.Context, depRule *model.DependencyRule, cach
 	}
 	exist, ok := cache[id]
 	if !ok {
-		if depRule.ServiceKey.ServiceName == "*" {
-			return nil
-		}
-
-		_, exist, err = FindServiceIds(ctx, depRule.ServiceKey.Version, depRule.ServiceKey)
+		_, exist, err = FindServiceIds(ctx, depRule.ServiceKey, false)
 		if err != nil {
 			return err
 		}
@@ -371,18 +296,13 @@ func removeProviderDeps(ctx context.Context, depRule *model.DependencyRule, cach
 func removeConsumerDeps(ctx context.Context, depRule *model.DependencyRule, cache map[*model.DelDepCacheKey]bool) (err error) {
 	var left []*discovery.MicroServiceKey
 	for _, key := range depRule.Dep.Dependency {
-		if key.ServiceName == "*" {
-			left = append(left, key)
-			continue
-		}
-
 		id := &model.DelDepCacheKey{
 			Key:  key,
 			Type: path.DepsProvider,
 		}
 		exist, ok := cache[id]
 		if !ok {
-			_, exist, err = FindServiceIds(ctx, key.Version, key)
+			_, exist, err = FindServiceIds(ctx, key, false)
 			if err != nil {
 				return err
 			}
@@ -434,25 +354,6 @@ func TransferToMicroServiceDependency(ctx context.Context, filter bson.M) (*disc
 	return microServiceDependency, nil
 }
 
-func GetConsumerDepInfo(ctx context.Context, filter bson.M) ([]*discovery.ConsumerDependency, error) {
-	var ConsumerDeps []*discovery.ConsumerDependency
-
-	findRes, err := client.GetMongoClient().Find(context.TODO(), model.CollectionDep, filter)
-	if err != nil {
-		return nil, err
-	}
-
-	for findRes.Next(ctx) {
-		var dep *model.ConsumerDep
-		err = findRes.Decode(&dep)
-		if err != nil {
-			return nil, err
-		}
-		ConsumerDeps = append(ConsumerDeps, dep.ConsumerDep)
-	}
-	return ConsumerDeps, nil
-}
-
 func GetServiceID(ctx context.Context, key *discovery.MicroServiceKey) (string, error) {
 	filter := mutil.NewBasicFilter(
 		ctx,
diff --git a/datasource/mongo/dep_util.go b/datasource/mongo/dep_util.go
index 3d3e1ce..05ecb6a 100644
--- a/datasource/mongo/dep_util.go
+++ b/datasource/mongo/dep_util.go
@@ -53,3 +53,15 @@ func GetConsumerIDs(ctx context.Context, provider *pb.MicroService) ([]string, e
 	}
 	return consumerIDs, nil
 }
+
+func GetConsumers(ctx context.Context, domainProject string, provider *pb.MicroService,
+	opts ...DependencyRelationFilterOption) ([]*pb.MicroService, error) {
+	dr := NewProviderDependencyRelation(ctx, domainProject, provider)
+	return dr.GetDependencyConsumers(opts...)
+}
+
+func GetProviders(ctx context.Context, domainProject string, consumer *pb.MicroService,
+	opts ...DependencyRelationFilterOption) ([]*pb.MicroService, error) {
+	dr := NewConsumerDependencyRelation(ctx, domainProject, consumer)
+	return dr.GetDependencyProviders(opts...)
+}
diff --git a/datasource/mongo/dependency_query.go b/datasource/mongo/dependency_query.go
index 7c60355..c308793 100644
--- a/datasource/mongo/dependency_query.go
+++ b/datasource/mongo/dependency_query.go
@@ -34,7 +34,6 @@ import (
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/util"
 	"github.com/apache/servicecomb-service-center/pkg/log"
-	"github.com/apache/servicecomb-service-center/pkg/validate"
 )
 
 type DependencyRelation struct {
@@ -86,10 +85,6 @@ func (dr *DependencyRelation) GetDependencyProviders(opts ...DependencyRelationF
 			return nil, err
 		}
 
-		if key.ServiceName == "*" {
-			services = services[:0]
-		}
-
 		for _, providerID := range providerIDs {
 			filter := util.NewBasicFilter(dr.ctx, util.ServiceServiceID(providerID))
 			provider, err := dao.GetService(dr.ctx, filter)
@@ -108,9 +103,6 @@ func (dr *DependencyRelation) GetDependencyProviders(opts ...DependencyRelationF
 			}
 			services = append(services, provider.Service)
 		}
-		if key.ServiceName == "*" {
-			break
-		}
 	}
 	return services, nil
 }
@@ -148,11 +140,6 @@ func (dr *DependencyRelation) GetDependencyConsumersOfProvider() ([]*pb.MicroSer
 	if dr.provider == nil {
 		return nil, util.ErrInvalidConsumer
 	}
-	consumerDependAllList, err := dr.getConsumerOfDependAllServices()
-	if err != nil {
-		log.Error(fmt.Sprintf("get consumers that depend on all services failed, %s", dr.provider.ServiceId), err)
-		return nil, err
-	}
 	providerService := pb.MicroServiceToKey(dr.domainProject, dr.provider)
 	consumerDependList, err := dr.GetConsumerOfSameServiceNameAndAppID(providerService)
 	if err != nil {
@@ -160,73 +147,22 @@ func (dr *DependencyRelation) GetDependencyConsumersOfProvider() ([]*pb.MicroSer
 			dr.provider.Environment, dr.provider.AppId, dr.provider.ServiceName, dr.provider.Version)
 		return nil, err
 	}
-	consumerDependAllList = append(consumerDependAllList, consumerDependList...)
-	return consumerDependAllList, nil
+	return consumerDependList, nil
 }
 
 func (dr *DependencyRelation) GetConsumerOfSameServiceNameAndAppID(provider *pb.MicroServiceKey) ([]*pb.MicroServiceKey, error) {
-	providerVersion := provider.Version
-	provider.Version = ""
 	filter := GenerateRuleKeyWithSameServiceNameAndAppID(path.DepsProvider, dr.domainProject, provider)
-	provider.Version = providerVersion
 	depRules, err := getServiceKeysInDep(dr.ctx, filter)
 	if err != nil {
 		return nil, err
 	}
 	var allConsumers []*pb.MicroServiceKey
-	var latestServiceID []string
-
 	for _, depRule := range depRules {
-		providerVersionRule := depRule.ServiceKey.Version
-		if providerVersionRule == "latest" {
-			if latestServiceID == nil {
-				latestServiceID, _, err = FindServiceIds(dr.ctx, providerVersionRule, provider)
-				if err != nil {
-					log.Error(fmt.Sprintf("get service[%s/%s/%s/%s]'s serviceID failed",
-						provider.Environment, provider.AppId, provider.ServiceName, providerVersionRule), err)
-					return nil, err
-				}
-			}
-			if len(latestServiceID) == 0 {
-				log.Info(fmt.Sprintf("service[%s/%s/%s/%s] does not exist",
-					provider.Environment, provider.AppId, provider.ServiceName, providerVersionRule))
-				continue
-			}
-			if dr.provider.ServiceId != latestServiceID[0] {
-				continue
-			}
-		} else {
-			if !VersionMatchRule(providerVersion, providerVersionRule) {
-				continue
-			}
-		}
-		if len(depRule.Dep.Dependency) > 0 {
-			allConsumers = append(allConsumers, depRule.Dep.Dependency...)
-		}
+		allConsumers = append(allConsumers, depRule.Dep.Dependency...)
 	}
 	return allConsumers, nil
 }
 
-// not prepare for latest scene, should merge it with find serviceids func.
-func VersionMatchRule(version, versionRule string) bool {
-	if len(versionRule) == 0 {
-		return false
-	}
-	rangeIdx := strings.Index(versionRule, "-")
-	versionInt, _ := validate.VersionToInt64(version)
-	switch {
-	case versionRule[len(versionRule)-1:] == "+":
-		start, _ := validate.VersionToInt64(versionRule[:len(versionRule)-1])
-		return versionInt >= start
-	case rangeIdx > 0:
-		start, _ := validate.VersionToInt64(versionRule[:rangeIdx])
-		end, _ := validate.VersionToInt64(versionRule[rangeIdx+1:])
-		return versionInt >= start && versionInt < end
-	default:
-		return version == versionRule
-	}
-}
-
 func (dr *DependencyRelation) GetServiceByMicroServiceKey(service *pb.MicroServiceKey) (*pb.MicroService, error) {
 	filter, err := MicroServiceKeyFilter(service)
 	if err != nil {
@@ -254,30 +190,6 @@ func (dr *DependencyRelation) GetServiceByMicroServiceKey(service *pb.MicroServi
 	return nil, nil
 }
 
-func (dr *DependencyRelation) getConsumerOfDependAllServices() ([]*pb.MicroServiceKey, error) {
-	providerService := pb.MicroServiceToKey(dr.domainProject, dr.provider)
-	providerService.ServiceName = "*"
-	filter := GenerateProviderDependencyRuleKey(dr.domainProject, providerService)
-	findRes, err := client.GetMongoClient().Find(dr.ctx, model.CollectionDep, filter)
-	if err != nil {
-		return nil, err
-	}
-	if findRes.Err() != nil {
-		return nil, findRes.Err()
-	}
-
-	var msKeys []*pb.MicroServiceKey
-	for findRes.Next(dr.ctx) {
-		var depRule *model.DependencyRule
-		err = findRes.Decode(&depRule)
-		if err != nil {
-			return nil, err
-		}
-		msKeys = append(msKeys, depRule.ServiceKey)
-	}
-	return msKeys, nil
-}
-
 func getServiceKeysInDep(ctx context.Context, filter interface{}) ([]*model.DependencyRule, error) {
 	findRes, err := client.GetMongoClient().Find(ctx, model.CollectionDep, filter)
 	if err != nil {
@@ -311,30 +223,7 @@ func (dr *DependencyRelation) getProviderKeys() ([]*pb.MicroServiceKey, error) {
 }
 
 func (dr *DependencyRelation) parseDependencyRule(dependencyRule *pb.MicroServiceKey) (serviceIDs []string, err error) {
-	switch {
-	case dependencyRule.ServiceName == "*":
-		log.Info(fmt.Sprintf("service[%s/%s/%s/%s] rely all service",
-			dr.consumer.Environment, dr.consumer.AppId, dr.consumer.ServiceName, dr.consumer.Version))
-		filter, err := RelyAllServiceKey(dependencyRule)
-		if err != nil {
-			log.Error("get serivce failed", err)
-			return nil, err
-		}
-		findRes, err := client.GetMongoClient().Find(dr.ctx, model.CollectionService, filter)
-		if err != nil {
-			return nil, err
-		}
-		for findRes.Next(dr.ctx) {
-			var service model.Service
-			err = findRes.Decode(&service)
-			if err != nil {
-				return nil, err
-			}
-			serviceIDs = append(serviceIDs, service.Service.ServiceId)
-		}
-	default:
-		serviceIDs, _, err = FindServiceIds(dr.ctx, dependencyRule.Version, dependencyRule)
-	}
+	serviceIDs, _, err = FindServiceIds(dr.ctx, dependencyRule, false)
 	return
 }
 
@@ -369,26 +258,13 @@ func MicroServiceKeyFilter(key *pb.MicroServiceKey) (bson.M, error) {
 	filter := util.NewDomainProjectFilter(tenant[0], tenant[1],
 		util.ServiceEnv(key.Environment),
 		util.ServiceAppID(key.AppId),
-		util.ServiceAlias(key.Alias),
+		util.ServiceServiceName(key.ServiceName),
 		util.ServiceVersion(key.Version),
 	)
 	return filter, nil
 }
 
-func RelyAllServiceKey(key *pb.MicroServiceKey) (bson.M, error) {
-	tenant := strings.Split(key.Tenant, "/")
-	if len(tenant) != 2 {
-		return nil, util.ErrInvalidDomainProject
-	}
-	filter := util.NewDomainProjectFilter(tenant[0], tenant[1], util.ServiceEnv(key.Environment))
-	return filter, nil
-}
-
-func FindServiceIds(ctx context.Context, versionRule string, key *pb.MicroServiceKey) ([]string, bool, error) {
-	if len(versionRule) == 0 {
-		return nil, false, nil
-	}
-
+func FindServiceIds(ctx context.Context, key *pb.MicroServiceKey, matchVersion bool) ([]string, bool, error) {
 	tenant := strings.Split(key.Tenant, "/")
 	if len(tenant) != 2 {
 		return nil, false, util.ErrInvalidDomainProject
@@ -400,7 +276,7 @@ func FindServiceIds(ctx context.Context, versionRule string, key *pb.MicroServic
 		{Key: util.ConnectWithDot([]string{model.ColumnService, model.ColumnEnv}), Value: key.Environment},
 		{Key: util.ConnectWithDot([]string{model.ColumnService, model.ColumnAppID}), Value: key.AppId}}
 
-	serviceIds, exist, err := findServiceKeysByServiceName(ctx, versionRule, key, baseFilter)
+	serviceIds, exist, err := findServiceKeysByServiceName(ctx, key, baseFilter, matchVersion)
 	if err != nil {
 		return nil, false, err
 	}
@@ -412,7 +288,7 @@ func FindServiceIds(ctx context.Context, versionRule string, key *pb.MicroServic
 		if len(key.Alias) == 0 {
 			return nil, false, nil
 		}
-		serviceIds, exist, err = findServiceKeysByAlias(ctx, versionRule, key, baseFilter)
+		serviceIds, exist, err = findServiceKeysByAlias(ctx, key, baseFilter, matchVersion)
 		if err != nil {
 			return nil, false, err
 		}
@@ -421,84 +297,39 @@ func FindServiceIds(ctx context.Context, versionRule string, key *pb.MicroServic
 	return serviceIds, exist, nil
 }
 
-func serviceVersionFilter(ctx context.Context, versionRule string, filter bson.D) ([]string, bool, error) {
+func serviceVersionFilter(ctx context.Context, version string, filter bson.D, matchVersion bool) ([]string, bool, error) {
 	baseExist, err := client.GetMongoClient().DocExist(ctx, model.CollectionService, filter)
 	if err != nil || !baseExist {
 		return nil, false, err
 	}
-	filterFunc, newFilter := findServiceKeys(ctx, versionRule, filter)
-	if filterFunc == nil {
-		//精确匹配,无version返回服务不存在而不是verison匹配错误
-		ids, err := GetVersionService(ctx, newFilter)
-		if err != nil || len(ids) == 0 {
-			return nil, false, err
-		}
-		return ids, true, nil
+	newFilter := filter
+	if matchVersion {
+		newFilter = findServiceKeys(ctx, version, filter)
 	}
-
-	ids, err := filterFunc(ctx, newFilter)
+	ids, err := GetVersionService(ctx, newFilter)
 	if err != nil {
 		return nil, false, err
 	}
 	return ids, true, nil
 }
 
-func findServiceKeysByServiceName(ctx context.Context, versionRule string, key *pb.MicroServiceKey, baseFilter bson.D) ([]string, bool, error) {
+func findServiceKeysByServiceName(ctx context.Context, key *pb.MicroServiceKey, baseFilter bson.D, matchVersion bool) ([]string, bool, error) {
 	filter := append(baseFilter,
 		bson.E{Key: util.ConnectWithDot([]string{model.ColumnService, model.ColumnServiceName}), Value: key.ServiceName})
-	return serviceVersionFilter(ctx, versionRule, filter)
+	return serviceVersionFilter(ctx, key.Version, filter, matchVersion)
 }
 
-func findServiceKeysByAlias(ctx context.Context, versionRule string, key *pb.MicroServiceKey, baseFilter bson.D) ([]string, bool, error) {
+func findServiceKeysByAlias(ctx context.Context, key *pb.MicroServiceKey, baseFilter bson.D, matchVersion bool) ([]string, bool, error) {
 	filter := append(baseFilter,
 		bson.E{Key: util.ConnectWithDot([]string{model.ColumnService, model.ColumnAlias}), Value: key.Alias})
-	return serviceVersionFilter(ctx, versionRule, filter)
+	return serviceVersionFilter(ctx, key.Version, filter, matchVersion)
 }
 
 type ServiceVersionFilter func(ctx context.Context, filter bson.D) ([]string, error)
 
-func findServiceKeys(ctx context.Context, versionRule string, filter bson.D) (filterFunc ServiceVersionFilter, newFilter bson.D) {
-	rangeIdx := strings.Index(versionRule, "-")
-	switch {
-	case versionRule == "latest":
-		return GetVersionServiceLatest, filter
-	case versionRule[len(versionRule)-1:] == "+":
-		start := versionRule[:len(versionRule)-1]
-		filter = append(filter, bson.E{Key: util.ConnectWithDot([]string{model.ColumnService, model.ColumnVersion}), Value: bson.M{"$gte": start}})
-		return GetVersionService, filter
-	case rangeIdx > 0:
-		start := versionRule[:rangeIdx]
-		end := versionRule[rangeIdx+1:]
-		filter = append(filter, bson.E{Key: util.ConnectWithDot([]string{model.ColumnService, model.ColumnVersion}), Value: bson.M{"$gte": start, "$lt": end}})
-		return GetVersionService, filter
-	default:
-		filter = append(filter, bson.E{Key: util.ConnectWithDot([]string{model.ColumnService, model.ColumnVersion}), Value: versionRule})
-		return nil, filter
-	}
-}
-
-func GetVersionServiceLatest(ctx context.Context, m bson.D) (serviceIds []string, err error) {
-	findRes, err := client.GetMongoClient().Find(ctx, model.CollectionService, m,
-		&options.FindOptions{
-			Sort: bson.M{util.ConnectWithDot([]string{model.ColumnService, model.ColumnVersion}): -1}})
-	if err != nil {
-		return nil, err
-	}
-	if findRes.Err() != nil {
-		return nil, findRes.Err()
-	}
-	for findRes.Next(ctx) {
-		var service *model.Service
-		err = findRes.Decode(&service)
-		if err != nil {
-			return
-		}
-		serviceIds = append(serviceIds, service.Service.ServiceId)
-		if serviceIds != nil {
-			return
-		}
-	}
-	return
+func findServiceKeys(ctx context.Context, version string, filter bson.D) (newFilter bson.D) {
+	filter = append(filter, bson.E{Key: util.ConnectWithDot([]string{model.ColumnService, model.ColumnVersion}), Value: version})
+	return filter
 }
 
 func GetVersionService(ctx context.Context, m bson.D) (serviceIds []string, err error) {
@@ -521,83 +352,13 @@ func GetVersionService(ctx context.Context, m bson.D) (serviceIds []string, err
 	return
 }
 
-func ParseVersionRule(ctx context.Context, versionRule string, key *pb.MicroServiceKey) ([]string, error) {
-	tenant := strings.Split(key.Tenant, "/")
-	if len(tenant) != 2 {
-		return nil, util.ErrInvalidDomainProject
-	}
-	if len(versionRule) == 0 {
-		return nil, nil
-	}
-
-	rangeIdx := strings.Index(versionRule, "-")
-	switch {
-	case versionRule == "latest":
-		filter := util.NewDomainProjectFilter(tenant[0], tenant[1])
-		return GetFilterVersionServiceLatest(ctx, filter)
-	case versionRule[len(versionRule)-1:] == "+":
-		start := versionRule[:len(versionRule)-1]
-		filter := util.NewDomainProjectFilter(tenant[0], tenant[1], util.ServiceVersion(bson.M{"$gte": start}))
-		return GetFilterVersionService(ctx, filter)
-	case rangeIdx > 0:
-		start := versionRule[:rangeIdx]
-		end := versionRule[rangeIdx+1:]
-		filter := util.NewDomainProjectFilter(tenant[0], tenant[1], util.ServiceVersion(bson.M{"$gte": start, "$lte": end}))
-		return GetFilterVersionService(ctx, filter)
-	default:
-		return nil, nil
-	}
-}
-
-func GetFilterVersionService(ctx context.Context, m bson.M) (serviceIDs []string, err error) {
-	findRes, err := client.GetMongoClient().Find(ctx, model.CollectionService, m)
-	if err != nil {
-		return nil, err
-	}
-	if findRes.Err() != nil {
-		return nil, findRes.Err()
-	}
-	for findRes.Next(ctx) {
-		var service model.Service
-		err = findRes.Decode(&service)
-		if err != nil {
-			return nil, err
-		}
-		serviceIDs = append(serviceIDs, service.Service.ServiceId)
-	}
-	return
-}
-
-func GetFilterVersionServiceLatest(ctx context.Context, m bson.M) (serviceIDs []string, err error) {
-	findRes, err := client.GetMongoClient().Find(ctx, model.CollectionService, m,
-		&options.FindOptions{
-			Sort: bson.M{util.ConnectWithDot([]string{model.ColumnService, model.ColumnVersion}): -1}})
-	if err != nil {
-		return nil, err
-	}
-	if findRes.Err() != nil {
-		return nil, findRes.Err()
-	}
-	for findRes.Next(ctx) {
-		var service model.Service
-		err = findRes.Decode(&service)
-		if err != nil {
-			return nil, err
-		}
-		serviceIDs = append(serviceIDs, service.Service.ServiceId)
-		if serviceIDs != nil {
-			return serviceIDs, nil
-		}
-	}
-	return
-}
-
 func WithSameDomainProject() DependencyRelationFilterOption {
 	return func(opt DependencyRelationFilterOpt) DependencyRelationFilterOpt {
 		opt.SameDomainProject = true
 		return opt
 	}
 }
+
 func WithoutSelfDependency() DependencyRelationFilterOption {
 	return func(opt DependencyRelationFilterOpt) DependencyRelationFilterOpt {
 		opt.NonSelf = true
@@ -646,14 +407,6 @@ func GenerateServiceDependencyRuleKey(serviceType string, domainProject string,
 			util.ServiceKeyTenant(domainProject),
 		)
 	}
-	if in.ServiceName == "*" {
-		return util.NewFilter(
-			util.ServiceType(serviceType),
-			util.ServiceKeyTenant(domainProject),
-			util.ServiceKeyServiceEnv(in.Environment),
-			util.ServiceKeyServiceName(in.ServiceName),
-		)
-	}
 	return util.NewFilter(
 		util.ServiceType(serviceType),
 		util.ServiceKeyTenant(domainProject),
diff --git a/datasource/mongo/event/instance_event_handler.go b/datasource/mongo/event/instance_event_handler.go
index fa9925c..f77b7b1 100644
--- a/datasource/mongo/event/instance_event_handler.go
+++ b/datasource/mongo/event/instance_event_handler.go
@@ -77,13 +77,13 @@ func (h InstanceEventHandler) OnEvent(evt sd.MongoEvent) {
 	if !syncernotify.GetSyncerNotifyCenter().Closed() {
 		NotifySyncerInstanceEvent(evt, microService)
 	}
-	consumerIDS, err := mongo.GetConsumerIDs(ctx, microService)
+	consumerIDs, err := mongo.GetConsumerIDs(ctx, microService)
 	if err != nil {
 		log.Error(fmt.Sprintf("get service[%s][%s/%s/%s/%s]'s consumerIDs failed",
 			providerID, microService.Environment, microService.AppId, microService.ServiceName, microService.Version), err)
 		return
 	}
-	PublishInstanceEvent(evt, discovery.MicroServiceToKey(domainProject, microService), consumerIDS)
+	PublishInstanceEvent(evt, discovery.MicroServiceToKey(domainProject, microService), consumerIDs)
 }
 
 func NewInstanceEventHandler() *InstanceEventHandler {
diff --git a/datasource/mongo/ms.go b/datasource/mongo/ms.go
index 30dee92..ca98e7e 100644
--- a/datasource/mongo/ms.go
+++ b/datasource/mongo/ms.go
@@ -239,14 +239,14 @@ func (ds *MetadataManager) ExistService(ctx context.Context, request *discovery.
 	serviceFlag := util.StringJoin([]string{
 		request.Environment, request.AppId, request.ServiceName, request.Version}, "/")
 
-	ids, exist, err := FindServiceIds(ctx, request.Version, &discovery.MicroServiceKey{
+	ids, exist, err := FindServiceIds(ctx, &discovery.MicroServiceKey{
 		Environment: request.Environment,
 		AppId:       request.AppId,
 		ServiceName: request.ServiceName,
 		Alias:       request.ServiceName,
 		Version:     request.Version,
 		Tenant:      domainProject,
-	})
+	}, true)
 	if err != nil {
 		log.Error(fmt.Sprintf("micro-service[%s] exist failed, find serviceIDs failed", serviceFlag), err)
 		return &discovery.GetExistenceResponse{
@@ -376,9 +376,12 @@ func (ds *MetadataManager) UpdateService(ctx context.Context, request *discovery
 	err := dao.UpdateService(ctx, filter, updateFilter)
 	if err != nil {
 		log.Error(fmt.Sprintf("update service %s properties failed, update mongo failed", request.ServiceId), err)
-		return &discovery.UpdateServicePropsResponse{
-			Response: discovery.CreateResponse(discovery.ErrUnavailableBackend, "Update doc in mongo failed."),
-		}, nil
+		if err == client.ErrNoDocuments {
+			return &discovery.UpdateServicePropsResponse{
+				Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "Service does not exist."),
+			}, nil
+		}
+		return nil, discovery.NewError(discovery.ErrUnavailableBackend, "Update doc in mongo failed.")
 	}
 	return &discovery.UpdateServicePropsResponse{
 		Response: discovery.CreateResponse(discovery.ResponseSuccess, "Update service successfully."),
@@ -1127,13 +1130,14 @@ func getServiceDetailUtil(ctx context.Context, mgs *model.Service, countOnly boo
 			serviceDetail.SchemaInfos = schemas
 		case "dependencies":
 			service := mgs.Service
-			dr := NewDependencyRelation(ctx, domainProject, service, service)
-			consumers, err := dr.GetDependencyConsumers(WithoutSelfDependency(), WithSameDomainProject())
+			consumers, err := GetConsumers(ctx, domainProject, service,
+				WithoutSelfDependency(), WithSameDomainProject())
 			if err != nil {
 				log.Error(fmt.Sprintf("get service[%s][%s/%s/%s/%s]'s all consumers failed",
 					service.ServiceId, service.Environment, service.AppId, service.ServiceName, service.Version), err)
 			}
-			providers, err := dr.GetDependencyProviders(WithoutSelfDependency(), WithSameDomainProject())
+			providers, err := GetProviders(ctx, domainProject, service,
+				WithoutSelfDependency(), WithSameDomainProject())
 			if err != nil {
 				log.Error(fmt.Sprintf("get service[%s][%s/%s/%s/%s]'s all providers failed",
 					service.ServiceId, service.Environment, service.AppId, service.ServiceName, service.Version), err)
@@ -1545,7 +1549,6 @@ func (ds *MetadataManager) FindInstances(ctx context.Context, request *discovery
 		AppId:       request.AppId,
 		ServiceName: request.ServiceName,
 		Alias:       request.Alias,
-		Version:     request.VersionRule,
 	}
 	rev, ok := ctx.Value(util.CtxRequestRevision).(string)
 	if !ok {
@@ -1842,13 +1845,6 @@ func (ds *MetadataManager) findSharedServiceInstance(ctx context.Context, reques
 	findFlag := func() string {
 		return fmt.Sprintf("find shared provider[%s/%s/%s/%s]", provider.Environment, provider.AppId, provider.ServiceName, provider.Version)
 	}
-	basicFilterServices, err := servicesBasicFilter(ctx, provider)
-	if err != nil {
-		log.Error(fmt.Sprintf("find shared service instance failed %s", findFlag()), err)
-		return &discovery.FindInstancesResponse{
-			Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
-		}, err
-	}
 	services, err := filterServices(ctx, provider)
 	if err != nil {
 		log.Error(fmt.Sprintf("find shared service instance failed %s", findFlag()), err)
@@ -1856,7 +1852,7 @@ func (ds *MetadataManager) findSharedServiceInstance(ctx context.Context, reques
 			Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
 		}, err
 	}
-	if services == nil && len(basicFilterServices) == 0 {
+	if len(services) == 0 {
 		mes := fmt.Errorf("%s failed, provider does not exist", findFlag())
 		log.Error("find shared service instance failed", mes)
 		return &discovery.FindInstancesResponse{
@@ -1895,15 +1891,15 @@ func (ds *MetadataManager) findInstance(ctx context.Context, request *discovery.
 		service, err = dao.GetService(ctx, filter)
 		if err != nil {
 			if errors.Is(err, datasource.ErrNoData) {
-				log.Debug(fmt.Sprintf("consumer does not exist, consumer %s find provider %s/%s/%s/%s",
-					request.ConsumerServiceId, request.Environment, request.AppId, request.ServiceName, request.VersionRule))
+				log.Debug(fmt.Sprintf("consumer does not exist, consumer %s find provider %s/%s/%s",
+					request.ConsumerServiceId, request.Environment, request.AppId, request.ServiceName))
 				return &discovery.FindInstancesResponse{
 					Response: discovery.CreateResponse(discovery.ErrServiceNotExists,
 						fmt.Sprintf("Consumer[%s] does not exist.", request.ConsumerServiceId)),
 				}, nil
 			}
-			log.Error(fmt.Sprintf("get consumer failed, consumer %s find provider %s/%s/%s/%s",
-				request.ConsumerServiceId, request.Environment, request.AppId, request.ServiceName, request.VersionRule), err)
+			log.Error(fmt.Sprintf("get consumer failed, consumer %s find provider %s/%s/%s",
+				request.ConsumerServiceId, request.Environment, request.AppId, request.ServiceName), err)
 			return &discovery.FindInstancesResponse{
 				Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
 			}, err
@@ -1921,13 +1917,6 @@ func (ds *MetadataManager) findInstance(ctx context.Context, request *discovery.
 			request.ConsumerServiceId, service.Service.Environment, service.Service.AppId, service.Service.ServiceName, service.Service.Version,
 			provider.Environment, provider.AppId, provider.ServiceName, provider.Version)
 	}
-	basicFilterServices, err := servicesBasicFilter(ctx, provider)
-	if err != nil {
-		log.Error(fmt.Sprintf("find instance failed %s", findFlag()), err)
-		return &discovery.FindInstancesResponse{
-			Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
-		}, err
-	}
 	services, err := filterServices(ctx, provider)
 	if err != nil {
 		log.Error(fmt.Sprintf("find instance failed %s", findFlag()), err)
@@ -1935,7 +1924,7 @@ func (ds *MetadataManager) findInstance(ctx context.Context, request *discovery.
 			Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
 		}, err
 	}
-	if services == nil && len(basicFilterServices) == 0 {
+	if len(services) == 0 {
 		mes := fmt.Errorf("%s failed, provider does not exist", findFlag())
 		log.Error("find instance failed", mes)
 		return &discovery.FindInstancesResponse{
@@ -2099,7 +2088,6 @@ func (ds *MetadataManager) batchFindServices(ctx context.Context, request *disco
 			ConsumerServiceId: request.ConsumerServiceId,
 			AppId:             key.Service.AppId,
 			ServiceName:       key.Service.ServiceName,
-			VersionRule:       key.Service.Version,
 			Environment:       key.Service.Environment,
 		})
 		if err != nil {
@@ -2175,42 +2163,11 @@ func AppendFindResponse(ctx context.Context, index int64, resp *discovery.Respon
 	})
 }
 
-// servicesBasicFilter query services with domain, project, env, appID, serviceName, alias
-func servicesBasicFilter(ctx context.Context, key *discovery.MicroServiceKey) ([]*model.Service, error) {
-	tenant := strings.Split(key.Tenant, "/")
-	if len(tenant) != 2 {
-		return nil, errors.New("invalid 'domain' or 'project'")
-	}
-	serviceNameOption := mutil.ServiceServiceName(key.ServiceName)
-	if len(key.Alias) > 0 {
-		serviceNameOption = mutil.Or(serviceNameOption, mutil.ServiceAlias(key.Alias))
-	}
-	filter := mutil.NewDomainProjectFilter(tenant[0], tenant[1],
-		mutil.ServiceEnv(key.Environment),
-		mutil.ServiceAppID(key.AppId),
-		serviceNameOption,
-	)
-	rangeIdx := strings.Index(key.Version, "-")
-	// if the version number is clear, need to add the version number to query
-	switch {
-	case key.Version == "latest":
-		return dao.GetServices(ctx, filter)
-	case len(key.Version) > 0 && key.Version[len(key.Version)-1:] == "+":
-		return dao.GetServices(ctx, filter)
-	case rangeIdx > 0:
-		return dao.GetServices(ctx, filter)
-	default:
-		filter[mutil.ConnectWithDot([]string{model.ColumnService, model.ColumnVersion})] = key.Version
-		return dao.GetServices(ctx, filter)
-	}
-}
-
 func filterServices(ctx context.Context, key *discovery.MicroServiceKey) ([]*model.Service, error) {
 	tenant := strings.Split(key.Tenant, "/")
 	if len(tenant) != 2 {
 		return nil, errors.New("invalid 'domain' or 'project'")
 	}
-	rangeIdx := strings.Index(key.Version, "-")
 	serviceNameOption := mutil.ServiceServiceName(key.ServiceName)
 	if len(key.Alias) > 0 {
 		serviceNameOption = mutil.Or(serviceNameOption, mutil.ServiceAlias(key.Alias))
@@ -2220,23 +2177,7 @@ func filterServices(ctx context.Context, key *discovery.MicroServiceKey) ([]*mod
 		mutil.ServiceAppID(key.AppId),
 		serviceNameOption,
 	)
-	switch {
-	case key.Version == "latest":
-		findOption := &options.FindOptions{Sort: bson.M{mutil.ConnectWithDot([]string{model.ColumnService, model.ColumnVersion}): -1}}
-		return dao.GetServices(ctx, filter, findOption)
-	case len(key.Version) > 0 && key.Version[len(key.Version)-1:] == "+":
-		start := key.Version[:len(key.Version)-1]
-		filter[mutil.ConnectWithDot([]string{model.ColumnService, model.ColumnVersion})] = bson.M{"$gte": start}
-		return dao.GetServices(ctx, filter)
-	case rangeIdx > 0:
-		start := key.Version[:rangeIdx]
-		end := key.Version[rangeIdx+1:]
-		filter[mutil.ConnectWithDot([]string{model.ColumnService, model.ColumnVersion})] = bson.M{"$gte": start, "$lte": end}
-		return dao.GetServices(ctx, filter)
-	default:
-		filter[mutil.ConnectWithDot([]string{model.ColumnService, model.ColumnVersion})] = key.Version
-		return dao.GetServices(ctx, filter)
-	}
+	return dao.GetServices(ctx, filter)
 }
 
 func filterServiceIDs(ctx context.Context, consumerID string, tags []string, services []*model.Service) []string {
diff --git a/datasource/service_test.go b/datasource/service_test.go
index 6d061a1..011b005 100644
--- a/datasource/service_test.go
+++ b/datasource/service_test.go
@@ -369,14 +369,6 @@ func TestService_Exist(t *testing.T) {
 			Version:     "2.0.0",
 		})
 		assert.NoError(t, err)
-		assert.Equal(t, pb.ErrServiceNotExists, resp.Response.GetCode())
-		resp, err = datasource.GetMetadataManager().ExistService(getContext(), &pb.GetExistenceRequest{
-			Type:        datasource.ExistTypeMicroservice,
-			AppId:       "exist_appId_service_ms",
-			ServiceName: "exist_service_service_ms",
-			Version:     "0.0.0-1.0.0",
-		})
-		assert.NoError(t, err)
 		assert.Equal(t, pb.ErrServiceVersionNotExists, resp.Response.GetCode())
 	})
 
@@ -422,36 +414,6 @@ func TestService_Exist(t *testing.T) {
 		})
 		assert.NoError(t, err)
 		assert.Equal(t, serviceId2, resp.ServiceId)
-
-		log.Info("check with latest versionRule")
-		resp, err = datasource.GetMetadataManager().ExistService(getContext(), &pb.GetExistenceRequest{
-			Type:        datasource.ExistTypeMicroservice,
-			AppId:       "exist_appId_service_ms",
-			ServiceName: "es_service_ms",
-			Version:     "latest",
-		})
-		assert.NoError(t, err)
-		assert.Equal(t, serviceId1, resp.ServiceId)
-
-		log.Info("check with 1.0.0+ versionRule")
-		resp, err = datasource.GetMetadataManager().ExistService(getContext(), &pb.GetExistenceRequest{
-			Type:        datasource.ExistTypeMicroservice,
-			AppId:       "exist_appId_service_ms",
-			ServiceName: "es_service_ms",
-			Version:     "1.0.0+",
-		})
-		assert.NoError(t, err)
-		assert.Equal(t, serviceId1, resp.ServiceId)
-
-		log.Info("check with range versionRule")
-		resp, err = datasource.GetMetadataManager().ExistService(getContext(), &pb.GetExistenceRequest{
-			Type:        datasource.ExistTypeMicroservice,
-			AppId:       "exist_appId_service_ms",
-			ServiceName: "es_service_ms",
-			Version:     "0.9.1-1.0.1",
-		})
-		assert.NoError(t, err)
-		assert.Equal(t, serviceId1, resp.ServiceId)
 	})
 }
 
diff --git a/datasource/tag_test.go b/datasource/tag_test.go
index 44ff4df..a2b42c6 100644
--- a/datasource/tag_test.go
+++ b/datasource/tag_test.go
@@ -267,7 +267,6 @@ func TestTag_Update(t *testing.T) {
 			ConsumerServiceId: consumerId,
 			AppId:             "find_inst_tag_group_ms",
 			ServiceName:       "find_inst_tag_provider_ms",
-			VersionRule:       "1.0.0+",
 			Tags:              []string{"not-exist-tag"},
 		})
 		assert.NoError(t, err)
@@ -278,7 +277,6 @@ func TestTag_Update(t *testing.T) {
 			ConsumerServiceId: consumerId,
 			AppId:             "find_inst_tag_group_ms",
 			ServiceName:       "find_inst_tag_provider_ms",
-			VersionRule:       "1.0.0+",
 			Tags:              []string{"filter_tag"},
 		})
 		assert.NoError(t, err)
@@ -299,7 +297,6 @@ func TestTag_Update(t *testing.T) {
 			ConsumerServiceId: consumerId,
 			AppId:             "find_inst_tag_group_ms",
 			ServiceName:       "find_inst_tag_provider_ms",
-			VersionRule:       "1.0.0+",
 			Tags:              []string{"filter_tag"},
 		})
 		assert.NoError(t, err)
diff --git a/docs/openapi/v4.yaml b/docs/openapi/v4.yaml
index beb610a..cf7a930 100644
--- a/docs/openapi/v4.yaml
+++ b/docs/openapi/v4.yaml
@@ -1160,7 +1160,7 @@ paths:
   /v4/{project}/registry/instances:
     get:
       description: |
-        实例注册后可以根据微服务版本规则或字段条件 发现该微服务的实例。同时会将此微服务版本规则记录到依赖关系中,当发现相同微服务的不同版本规则时,会覆盖已有的依赖关系。
+        实例注册后可以根据微服务字段条件 发现该微服务的实例。同时会将此微服务记录到依赖关系中。
       operationId: find
       parameters:
         - name: x-domain-name
@@ -1189,11 +1189,6 @@ paths:
           description: 微服务名称。
           required: true
           type: string
-        - name: version
-          in: query
-          description: 版本规则:1.精确版本匹配 2.后续版本匹配 3.最新版本 4.版本范围
-          type: string
-          required: true
         - name: tags
           in: query
           description: Tag标签过滤,多个时逗号分隔。
@@ -2245,7 +2240,6 @@ definitions:
     required:
         - appId
         - serviceName
-        - version
     properties:
       environment:
         type: string
@@ -2255,11 +2249,7 @@ definitions:
         description: 应用app唯一标识。
       serviceName:
         type: string
-        description: 微服务名称,作为provider支持为*,表示依赖同一租户下的所有服务,当服务名称为*的时候,appId和version可以省略,consumer不支持*。
-      version:
-        type: string
-        description: 微服务版本,作为provider支持+,如1.0.1+[表示1.0.1以上的版本(包括1.0.1)]、固定版本和latest(当前最新版本),作为consumer只能为固定版本。
-
+        description: 微服务名称
   GetProDependenciesResponse:
     type: object
     properties:
diff --git a/integration/apis.go b/integration/apis.go
index f8aa164..6debf13 100644
--- a/integration/apis.go
+++ b/integration/apis.go
@@ -32,7 +32,6 @@ var UPDATESCHEMA = "/v4/default/registry/microservices/:serviceId/schemas/:schem
 var GETSCHEMAS = "/v4/default/registry/microservices/:serviceId/schemas"
 var UPDATESCHEMAS = "/v4/default/registry/microservices/:serviceId/schemas"
 var DELETESCHEMA = "/v4/default/registry/microservices/:serviceId/schemas/:schemaId"
-var CREATEDEPENDENCIES = "/v4/default/registry/dependencies"
 var GETCONPRODEPENDENCY = "/v4/default/registry/microservices/:consumerId/providers"
 var GETPROCONDEPENDENCY = "/v4/default/registry/microservices/:providerId/consumers"
 
@@ -54,12 +53,6 @@ var GETRELATIONGRAPH = "/v4/default/govern/relations"
 var GETALLSERVICEGOVERNANCEINFO = "/v4/default/govern/microservices"
 var GETALLAPPS = "/v4/default/govern/apps"
 
-//Rules API's
-var ADDRULE = "/v4/default/registry/microservices/:serviceId/rules"
-var GETRULES = "/v4/default/registry/microservices/:serviceId/rules"
-var UPDATERULES = "/v4/default/registry/microservices/:serviceId/rules/:rule_id"
-var DELETERULES = "/v4/default/registry/microservices/:serviceId/rules/:rule_id"
-
 //Tag API's
 var ADDTAGE = "/v4/default/registry/microservices/:serviceId/tags"
 var UPDATETAG = "/v4/default/registry/microservices/:serviceId/tags/:key"
diff --git a/integration/instances_test.go b/integration/instances_test.go
index 5467247..3b7a641 100644
--- a/integration/instances_test.go
+++ b/integration/instances_test.go
@@ -43,7 +43,8 @@ import (
 
 var _ = Describe("MicroService Api Test", func() {
 	var serviceName = ""
-	var serviceId = ""
+	var providerID = ""
+	var consumerID = ""
 	var serviceAppId = "integrationtestAppIdInstance"
 	var serviceVersion = "0.0.2"
 	var serviceInstanceID = ""
@@ -79,8 +80,29 @@ var _ = Describe("MicroService Api Test", func() {
 			// Validate the service creation
 			Expect(resp.StatusCode).To(Equal(http.StatusOK))
 			respbody, _ := ioutil.ReadAll(resp.Body)
-			serviceId = gojson.Json(string(respbody)).Get("serviceId").Tostring()
-			Expect(len(serviceId)).Should(BeNumerically("==", LengthUUID))
+			providerID = gojson.Json(string(respbody)).Get("serviceId").Tostring()
+			Expect(len(providerID)).Should(BeNumerically("==", LengthUUID))
+
+			servicemap = map[string]interface{}{
+				"serviceName": "C_" + serviceName,
+				"appId":       serviceAppId,
+				"version":     serviceVersion,
+			}
+			bodyParams = map[string]interface{}{
+				"service": servicemap,
+			}
+			body, _ = json.Marshal(bodyParams)
+			bodyBuf = bytes.NewReader(body)
+			req, _ = http.NewRequest(POST, SCURL+REGISTERMICROSERVICE, bodyBuf)
+			req.Header.Set("X-Domain-Name", "default")
+			resp, err = scclient.Do(req)
+			Expect(err).To(BeNil())
+			defer resp.Body.Close()
+
+			// Validate the service creation
+			Expect(resp.StatusCode).To(Equal(http.StatusOK))
+			respbody, _ = ioutil.ReadAll(resp.Body)
+			consumerID = gojson.Json(string(respbody)).Get("serviceId").Tostring()
 
 			//Register MicroService Instance
 			endpoints := []string{"cse://127.0.0.1:9984"}
@@ -106,7 +128,7 @@ var _ = Describe("MicroService Api Test", func() {
 			bodyParams = map[string]interface{}{
 				"instance": instance,
 			}
-			url := strings.Replace(REGISTERINSTANCE, ":serviceId", serviceId, 1)
+			url := strings.Replace(REGISTERINSTANCE, ":serviceId", providerID, 1)
 			body, _ = json.Marshal(bodyParams)
 			bodyBuf = bytes.NewReader(body)
 			req, _ = http.NewRequest(POST, SCURL+url, bodyBuf)
@@ -119,13 +141,13 @@ var _ = Describe("MicroService Api Test", func() {
 			Expect(resp.StatusCode).To(Equal(http.StatusOK))
 			respbody, _ = ioutil.ReadAll(resp.Body)
 			serviceInstanceID = gojson.Json(string(respbody)).Get("instanceId").Tostring()
-			Expect(len(serviceId)).Should(BeNumerically("==", LengthUUID))
+			Expect(len(providerID)).Should(BeNumerically("==", LengthUUID))
 
 		})
 
 		AfterEach(func() {
 			if serviceInstanceID != "" {
-				url := strings.Replace(UNREGISTERINSTANCE, ":serviceId", serviceId, 1)
+				url := strings.Replace(UNREGISTERINSTANCE, ":serviceId", providerID, 1)
 				url = strings.Replace(url, ":instanceId", serviceInstanceID, 1)
 				req, _ := http.NewRequest(DELETE, SCURL+url, nil)
 				req.Header.Set("X-Domain-Name", "default")
@@ -133,8 +155,8 @@ var _ = Describe("MicroService Api Test", func() {
 				Expect(resp.StatusCode).To(Equal(http.StatusOK))
 			}
 
-			if serviceId != "" {
-				url := strings.Replace(UNREGISTERMICROSERVICE, ":serviceId", serviceId, 1)
+			if providerID != "" {
+				url := strings.Replace(UNREGISTERMICROSERVICE, ":serviceId", providerID, 1)
 				req, _ := http.NewRequest(DELETE, SCURL+url, nil)
 				req.Header.Set("X-Domain-Name", "default")
 				resp, _ := scclient.Do(req)
@@ -154,7 +176,7 @@ var _ = Describe("MicroService Api Test", func() {
 				bodyParams := map[string]interface{}{
 					"instancse": instance,
 				}
-				url := strings.Replace(REGISTERINSTANCE, ":serviceId", serviceId, 1)
+				url := strings.Replace(REGISTERINSTANCE, ":serviceId", providerID, 1)
 				body, _ := json.Marshal(bodyParams)
 				bodyBuf := bytes.NewReader(body)
 				req, _ := http.NewRequest(POST, SCURL+url, bodyBuf)
@@ -191,7 +213,7 @@ var _ = Describe("MicroService Api Test", func() {
 				bodyParams := map[string]interface{}{
 					"instance": instance,
 				}
-				url := strings.Replace(REGISTERINSTANCE, ":serviceId", serviceId, 1)
+				url := strings.Replace(REGISTERINSTANCE, ":serviceId", providerID, 1)
 				body, _ := json.Marshal(bodyParams)
 				bodyBuf := bytes.NewReader(body)
 				req, _ := http.NewRequest(POST, SCURL+url, bodyBuf)
@@ -232,7 +254,7 @@ var _ = Describe("MicroService Api Test", func() {
 				bodyParams := map[string]interface{}{
 					"instance": instance,
 				}
-				url := strings.Replace(REGISTERINSTANCE, ":serviceId", serviceId, 1)
+				url := strings.Replace(REGISTERINSTANCE, ":serviceId", providerID, 1)
 				body, _ := json.Marshal(bodyParams)
 				bodyBuf := bytes.NewReader(body)
 				req, _ := http.NewRequest(POST, SCURL+url, bodyBuf)
@@ -249,7 +271,7 @@ var _ = Describe("MicroService Api Test", func() {
 				//Verify the instanceID is different for two instance
 				Expect(serviceInst).NotTo(Equal(serviceInstanceID))
 				//Delete Instance
-				url = strings.Replace(UNREGISTERINSTANCE, ":serviceId", serviceId, 1)
+				url = strings.Replace(UNREGISTERINSTANCE, ":serviceId", providerID, 1)
 				url = strings.Replace(url, ":instanceId", serviceInst, 1)
 				req, _ = http.NewRequest(DELETE, SCURL+url, nil)
 				req.Header.Set("X-Domain-Name", "default")
@@ -262,7 +284,7 @@ var _ = Describe("MicroService Api Test", func() {
 			It("Find Micro-service Info by AppID", func() {
 				req, _ := http.NewRequest(GET, SCURL+FINDINSTANCE+"?appId="+serviceAppId+"&serviceName="+serviceName+"&version="+serviceVersion, nil)
 				req.Header.Set("X-Domain-Name", "default")
-				req.Header.Set("X-ConsumerId", serviceId)
+				req.Header.Set("X-ConsumerId", consumerID)
 				resp, _ := scclient.Do(req)
 				respbody, _ := ioutil.ReadAll(resp.Body)
 				Expect(resp.StatusCode).To(Equal(http.StatusOK))
@@ -276,12 +298,44 @@ var _ = Describe("MicroService Api Test", func() {
 					}
 				}
 				Expect(foundMicroServiceInstance).To(Equal(true))
+
+				// wait dep handle
+				time.Sleep(3 * time.Second)
+
+				//Get Provider by ConsumerID
+				url := strings.Replace(GETCONPRODEPENDENCY, ":consumerId", consumerID, 1)
+				req, _ = http.NewRequest(GET, SCURL+url, nil)
+				req.Header.Set("X-Domain-Name", "default")
+				resp, _ = scclient.Do(req)
+				respbody, _ = ioutil.ReadAll(resp.Body)
+				Expect(resp.StatusCode).To(Equal(http.StatusOK))
+				respStruct := map[string][]map[string]interface{}{}
+				json.Unmarshal(respbody, &respStruct)
+				Expect(providerID).To(Equal(respStruct["providers"][0]["serviceId"]))
+
+				//Get Consumer by ProviderID
+				url = strings.Replace(GETPROCONDEPENDENCY, ":providerId", providerID, 1)
+				req, _ = http.NewRequest(GET, SCURL+url, nil)
+				req.Header.Set("X-Domain-Name", "default")
+				resp, _ = scclient.Do(req)
+				respbody, _ = ioutil.ReadAll(resp.Body)
+				Expect(resp.StatusCode).To(Equal(http.StatusOK))
+				respStruct = map[string][]map[string]interface{}{}
+				json.Unmarshal(respbody, &respStruct)
+				found := false
+				for _, c := range respStruct["consumers"] {
+					if c["serviceId"] == consumerID {
+						found = true
+						break
+					}
+				}
+				Expect(true).To(Equal(found))
 			})
 
 			It("Find Micro-service Info by invalid AppID", func() {
 				req, _ := http.NewRequest(GET, SCURL+FINDINSTANCE+"?appId=XXXX&serviceName="+serviceName+"&version="+serviceVersion, nil)
 				req.Header.Set("X-Domain-Name", "default")
-				req.Header.Set("X-ConsumerId", serviceId)
+				req.Header.Set("X-ConsumerId", consumerID)
 				resp, _ := scclient.Do(req)
 				Expect(resp.StatusCode).To(Equal(http.StatusBadRequest))
 			})
@@ -289,7 +343,7 @@ var _ = Describe("MicroService Api Test", func() {
 			It("Find Micro-service Info by alias", func() {
 				req, _ := http.NewRequest(GET, SCURL+FINDINSTANCE+"?appId="+serviceAppId+"&serviceName="+alias+"&version="+serviceVersion, nil)
 				req.Header.Set("X-Domain-Name", "default")
-				req.Header.Set("X-ConsumerId", serviceId)
+				req.Header.Set("X-ConsumerId", consumerID)
 				resp, _ := scclient.Do(req)
 				respbody, _ := ioutil.ReadAll(resp.Body)
 				Expect(resp.StatusCode).To(Equal(http.StatusOK))
@@ -306,10 +360,10 @@ var _ = Describe("MicroService Api Test", func() {
 			})
 
 			It("Find Micro-Service Instance by ServiceID", func() {
-				url := strings.Replace(GETINSTANCE, ":serviceId", serviceId, 1)
+				url := strings.Replace(GETINSTANCE, ":serviceId", providerID, 1)
 				req, _ := http.NewRequest(GET, SCURL+url, nil)
 				req.Header.Set("X-Domain-Name", "default")
-				req.Header.Set("X-ConsumerId", serviceId)
+				req.Header.Set("X-ConsumerId", consumerID)
 				resp, _ := scclient.Do(req)
 				respbody, _ := ioutil.ReadAll(resp.Body)
 				Expect(resp.StatusCode).To(Equal(http.StatusOK))
@@ -329,17 +383,17 @@ var _ = Describe("MicroService Api Test", func() {
 				url := strings.Replace(GETINSTANCE, ":serviceId", "XX", 1)
 				req, _ := http.NewRequest(GET, SCURL+url, nil)
 				req.Header.Set("X-Domain-Name", "default")
-				req.Header.Set("X-ConsumerId", serviceId)
+				req.Header.Set("X-ConsumerId", consumerID)
 				resp, _ := scclient.Do(req)
 				Expect(resp.StatusCode).To(Equal(http.StatusBadRequest))
 			})
 
 			It("Find MicroServiceInstance with Service and IstanceID", func() {
-				url := strings.Replace(GETINSTANCEBYINSTANCEID, ":serviceId", serviceId, 1)
+				url := strings.Replace(GETINSTANCEBYINSTANCEID, ":serviceId", providerID, 1)
 				url = strings.Replace(url, ":instanceId", serviceInstanceID, 1)
 				req, _ := http.NewRequest(GET, SCURL+url, nil)
 				req.Header.Set("X-Domain-Name", "default")
-				req.Header.Set("X-ConsumerId", serviceId)
+				req.Header.Set("X-ConsumerId", consumerID)
 				resp, _ := scclient.Do(req)
 				respbody, _ := ioutil.ReadAll(resp.Body)
 				Expect(resp.StatusCode).To(Equal(http.StatusOK))
@@ -350,11 +404,11 @@ var _ = Describe("MicroService Api Test", func() {
 			})
 
 			It("Find Micro-Service Instance by Invalid InstanceID", func() {
-				url := strings.Replace(GETINSTANCEBYINSTANCEID, ":serviceId", serviceId, 1)
+				url := strings.Replace(GETINSTANCEBYINSTANCEID, ":serviceId", providerID, 1)
 				url = strings.Replace(url, ":instanceId", "XX", 1)
 				req, _ := http.NewRequest(GET, SCURL+url, nil)
 				req.Header.Set("X-Domain-Name", "default")
-				req.Header.Set("X-ConsumerId", serviceId)
+				req.Header.Set("X-ConsumerId", consumerID)
 				resp, _ := scclient.Do(req)
 				Expect(resp.StatusCode).To(Equal(http.StatusBadRequest))
 			})
@@ -362,7 +416,7 @@ var _ = Describe("MicroService Api Test", func() {
 			It("Find Micro-Service Instance with rev", func() {
 				req, _ := http.NewRequest(GET, SCURL+FINDINSTANCE+"?appId="+serviceAppId+"&serviceName="+serviceName+"&version="+serviceVersion, nil)
 				req.Header.Set("X-Domain-Name", "default")
-				req.Header.Set("X-ConsumerId", serviceId)
+				req.Header.Set("X-ConsumerId", consumerID)
 				resp, _ := scclient.Do(req)
 				ioutil.ReadAll(resp.Body)
 				Expect(resp.StatusCode).To(Equal(http.StatusOK))
@@ -371,7 +425,7 @@ var _ = Describe("MicroService Api Test", func() {
 
 				req, _ = http.NewRequest(GET, SCURL+FINDINSTANCE+"?appId="+serviceAppId+"&serviceName="+serviceName+"&version="+serviceVersion+"&rev="+rev, nil)
 				req.Header.Set("X-Domain-Name", "default")
-				req.Header.Set("X-ConsumerId", serviceId)
+				req.Header.Set("X-ConsumerId", consumerID)
 				resp, _ = scclient.Do(req)
 				ioutil.ReadAll(resp.Body)
 				Expect(resp.StatusCode).To(Equal(http.StatusNotModified))
@@ -396,13 +450,13 @@ var _ = Describe("MicroService Api Test", func() {
 				}
 				notExistsInstance := map[string]interface{}{
 					"instance": map[string]interface{}{
-						"serviceId":  serviceId,
+						"serviceId":  providerID,
 						"instanceId": "notexisted",
 					},
 				}
 				providerInstance := map[string]interface{}{
 					"instance": map[string]interface{}{
-						"serviceId":  serviceId,
+						"serviceId":  providerID,
 						"instanceId": serviceInstanceID,
 					},
 				}
@@ -420,7 +474,7 @@ var _ = Describe("MicroService Api Test", func() {
 
 				req, _ := http.NewRequest(POST, SCURL+INSTANCEACTION, bytes.NewReader(body))
 				req.Header.Set("X-Domain-Name", "default")
-				req.Header.Set("X-ConsumerId", serviceId)
+				req.Header.Set("X-ConsumerId", consumerID)
 				resp, _ := scclient.Do(req)
 				ioutil.ReadAll(resp.Body)
 				Expect(resp.StatusCode).To(Equal(http.StatusBadRequest))
@@ -428,7 +482,7 @@ var _ = Describe("MicroService Api Test", func() {
 				bodyBuf := bytes.NewReader(body)
 				req, _ = http.NewRequest(POST, SCURL+INSTANCEACTION+"?type=query", bodyBuf)
 				req.Header.Set("X-Domain-Name", "default")
-				req.Header.Set("X-ConsumerId", serviceId)
+				req.Header.Set("X-ConsumerId", consumerID)
 				resp, _ = scclient.Do(req)
 				respbody, _ := ioutil.ReadAll(resp.Body)
 				Expect(resp.StatusCode).To(Equal(http.StatusOK))
@@ -475,7 +529,7 @@ var _ = Describe("MicroService Api Test", func() {
 				bodyParams := map[string]interface{}{
 					"properties": propertiesInstance,
 				}
-				url := strings.Replace(UPDATEINSTANCEMETADATA, ":serviceId", serviceId, 1)
+				url := strings.Replace(UPDATEINSTANCEMETADATA, ":serviceId", providerID, 1)
 				url = strings.Replace(url, ":instanceId", serviceInstanceID, 1)
 				body, _ := json.Marshal(bodyParams)
 				bodyBuf := bytes.NewReader(body)
@@ -489,10 +543,10 @@ var _ = Describe("MicroService Api Test", func() {
 				Expect(resp.StatusCode).To(Equal(http.StatusOK))
 
 				//Verify the updated properties
-				url = strings.Replace(GETINSTANCE, ":serviceId", serviceId, 1)
+				url = strings.Replace(GETINSTANCE, ":serviceId", providerID, 1)
 				req, _ = http.NewRequest(GET, SCURL+url, nil)
 				req.Header.Set("X-Domain-Name", "default")
-				req.Header.Set("X-ConsumerId", serviceId)
+				req.Header.Set("X-ConsumerId", consumerID)
 				resp, _ = scclient.Do(req)
 				respbody, _ := ioutil.ReadAll(resp.Body)
 				Expect(resp.StatusCode).To(Equal(http.StatusOK))
@@ -514,7 +568,7 @@ var _ = Describe("MicroService Api Test", func() {
 				bodyParams := map[string]interface{}{
 					"properties": propertiesInstance,
 				}
-				url := strings.Replace(UPDATEINSTANCEMETADATA, ":serviceId", serviceId, 1)
+				url := strings.Replace(UPDATEINSTANCEMETADATA, ":serviceId", providerID, 1)
 				url = strings.Replace(url, ":instanceId", "WRONGINSTANCEID", 1)
 				body, _ := json.Marshal(bodyParams)
 				bodyBuf := bytes.NewReader(body)
@@ -528,7 +582,7 @@ var _ = Describe("MicroService Api Test", func() {
 			})
 
 			It("Update Micro-Service Instance Status", func() {
-				url := strings.Replace(UPDATEINSTANCESTATUS, ":serviceId", serviceId, 1)
+				url := strings.Replace(UPDATEINSTANCESTATUS, ":serviceId", providerID, 1)
 				url = strings.Replace(url, ":instanceId", serviceInstanceID, 1)
 				req, _ := http.NewRequest(UPDATE, SCURL+url+"?value=DOWN", nil)
 				req.Header.Set("X-Domain-Name", "default")
@@ -540,10 +594,10 @@ var _ = Describe("MicroService Api Test", func() {
 				time.Sleep(time.Second)
 
 				//Verify the Instance Status
-				url = strings.Replace(GETINSTANCE, ":serviceId", serviceId, 1)
+				url = strings.Replace(GETINSTANCE, ":serviceId", providerID, 1)
 				req, _ = http.NewRequest(GET, SCURL+url, nil)
 				req.Header.Set("X-Domain-Name", "default")
-				req.Header.Set("X-ConsumerId", serviceId)
+				req.Header.Set("X-ConsumerId", consumerID)
 				resp, _ = scclient.Do(req)
 				respbody, _ := ioutil.ReadAll(resp.Body)
 				Expect(resp.StatusCode).To(Equal(http.StatusOK))
@@ -560,7 +614,7 @@ var _ = Describe("MicroService Api Test", func() {
 			})
 
 			It("Update Micro-Service Instance Status with invalid Status", func() {
-				url := strings.Replace(UPDATEINSTANCESTATUS, ":serviceId", serviceId, 1)
+				url := strings.Replace(UPDATEINSTANCESTATUS, ":serviceId", providerID, 1)
 				url = strings.Replace(url, ":instanceId", serviceInstanceID, 1)
 				req, _ := http.NewRequest(UPDATE, SCURL+url+"?value=INVALID", nil)
 				req.Header.Set("X-Domain-Name", "default")
@@ -571,10 +625,10 @@ var _ = Describe("MicroService Api Test", func() {
 				Expect(resp.StatusCode).To(Equal(http.StatusBadRequest))
 
 				//Verify the Instance Status does not change the value
-				url = strings.Replace(GETINSTANCE, ":serviceId", serviceId, 1)
+				url = strings.Replace(GETINSTANCE, ":serviceId", providerID, 1)
 				req, _ = http.NewRequest(GET, SCURL+url, nil)
 				req.Header.Set("X-Domain-Name", "default")
-				req.Header.Set("X-ConsumerId", serviceId)
+				req.Header.Set("X-ConsumerId", consumerID)
 				resp, _ = scclient.Do(req)
 				respbody, _ := ioutil.ReadAll(resp.Body)
 				Expect(resp.StatusCode).To(Equal(http.StatusOK))
@@ -592,7 +646,7 @@ var _ = Describe("MicroService Api Test", func() {
 
 		By("Micro-Service Instance heartbeat API", func() {
 			It("Send HeartBeat for micro-service instance", func() {
-				url := strings.Replace(INSTANCEHEARTBEAT, ":serviceId", serviceId, 1)
+				url := strings.Replace(INSTANCEHEARTBEAT, ":serviceId", providerID, 1)
 				url = strings.Replace(url, ":instanceId", serviceInstanceID, 1)
 				req, _ := http.NewRequest(UPDATE, SCURL+url, nil)
 				req.Header.Set("X-Domain-Name", "default")
@@ -604,7 +658,7 @@ var _ = Describe("MicroService Api Test", func() {
 			})
 
 			It("Send HeartBeat for wrong micro-service instance", func() {
-				url := strings.Replace(INSTANCEHEARTBEAT, ":serviceId", serviceId, 1)
+				url := strings.Replace(INSTANCEHEARTBEAT, ":serviceId", providerID, 1)
 				url = strings.Replace(url, ":instanceId", "XXX", 1)
 				req, _ := http.NewRequest(UPDATE, SCURL+url, nil)
 				req.Header.Set("X-Domain-Name", "default")
@@ -620,7 +674,7 @@ var _ = Describe("MicroService Api Test", func() {
 			It("Call the watcher API ", func() {
 				//This api gives 400 bad request for the integration test
 				// as integration test is not able to make ws connection
-				url := strings.Replace(INSTANCEWATCHER, ":serviceId", serviceId, 1)
+				url := strings.Replace(INSTANCEWATCHER, ":serviceId", providerID, 1)
 				req, _ := http.NewRequest(GET, SCURL+url, nil)
 				req.Header.Set("X-Domain-Name", "default")
 				resp, err := scclient.Do(req)
@@ -631,7 +685,6 @@ var _ = Describe("MicroService Api Test", func() {
 			})
 		})
 	})
-
 })
 
 func BenchmarkRegisterMicroServiceInstance(b *testing.B) {
diff --git a/integration/microservices_test.go b/integration/microservices_test.go
index 3450824..9d32504 100644
--- a/integration/microservices_test.go
+++ b/integration/microservices_test.go
@@ -22,16 +22,14 @@ import (
 
 	"bytes"
 	"encoding/json"
+	. "github.com/apache/servicecomb-service-center/integration"
+	"github.com/widuu/gojson"
 	"io/ioutil"
 	"math/rand"
 	"net/http"
 	"strconv"
 	"strings"
 	"testing"
-	"time"
-
-	. "github.com/apache/servicecomb-service-center/integration"
-	"github.com/widuu/gojson"
 )
 
 var serviceName = ""
@@ -261,267 +259,6 @@ var _ = Describe("MicroService Api Test", func() {
 			})
 
 			By("Test Dependency API for Provider and Consumer", func() {
-				It("test Valid dependency creation", func() {
-					//Register second microservice
-					getServiceName(serviceId)
-					schema := []string{"testSchema"}
-					properties := map[string]string{"attr1": "aa"}
-					consumerApp := strconv.Itoa(rand.Intn(15))
-					servicemap := map[string]interface{}{
-						"serviceName": consumerApp,
-						"appId":       "consumerAppId",
-						"version":     "2.0.0",
-						"description": "examples",
-						"level":       "FRONT",
-						"schemas":     schema,
-						"status":      "UP",
-						"properties":  properties,
-					}
-					bodyParams := map[string]interface{}{
-						"service": servicemap,
-					}
-					body, _ := json.Marshal(bodyParams)
-					bodyBuf := bytes.NewReader(body)
-					req, _ := http.NewRequest(POST, SCURL+REGISTERMICROSERVICE, bodyBuf)
-					req.Header.Set("X-Domain-Name", "default")
-					resp, err := scclient.Do(req)
-					Expect(err).To(BeNil())
-					defer resp.Body.Close()
-
-					// Validate the service creation
-					Expect(resp.StatusCode).To(Equal(http.StatusOK))
-					respbody, _ := ioutil.ReadAll(resp.Body)
-					consumerServiceID := gojson.Json(string(respbody)).Get("serviceId").Tostring()
-
-					//Create Dependency
-					consumer := map[string]string{
-						"appId":       "consumerAppId",
-						"serviceName": consumerApp,
-						"version":     "2.0.0",
-					}
-					provider := map[string]string{
-						"appId":       serviceAppId,
-						"serviceName": serviceName,
-						"version":     serviceVersion,
-					}
-					providersArray := []interface{}{provider}
-					dependency := map[string]interface{}{
-						"consumer":  consumer,
-						"providers": providersArray,
-					}
-					dependencyArray := []interface{}{dependency}
-					bodyParams = map[string]interface{}{
-						"dependencies": dependencyArray,
-					}
-					body, _ = json.Marshal(bodyParams)
-					bodyBuf = bytes.NewReader(body)
-					req, _ = http.NewRequest(UPDATE, SCURL+CREATEDEPENDENCIES, bodyBuf)
-					req.Header.Set("X-Domain-Name", "default")
-					resp, err = scclient.Do(req)
-					Expect(err).To(BeNil())
-					defer resp.Body.Close()
-
-					// Validate the dependency creation
-					Expect(resp.StatusCode).To(Equal(http.StatusOK))
-
-					/*
-						//Now try to delete the provider //this will fail as consumer needs to be deleted first
-						url := strings.Replace(UNREGISTERMICROSERVICE, ":serviceId", serviceId, 1)
-						req, _ = http.NewRequest(DELETE, SCURL+url, nil)
-						req.Header.Set("X-Domain-Name", "default")
-						resp, _ = scclient.Do(req)
-						Expect(resp.StatusCode).To(Equal(http.StatusBadRequest))*/
-
-					//Now delete consumer and then provider
-
-					url := strings.Replace(UNREGISTERMICROSERVICE, ":serviceId", consumerServiceID, 1)
-					req, _ = http.NewRequest(DELETE, SCURL+url, nil)
-					req.Header.Set("X-Domain-Name", "default")
-					resp, _ = scclient.Do(req)
-					Expect(resp.StatusCode).To(Equal(http.StatusOK))
-
-					url = strings.Replace(UNREGISTERMICROSERVICE, ":serviceId", serviceId, 1)
-					req, _ = http.NewRequest(DELETE, SCURL+url, nil)
-					req.Header.Set("X-Domain-Name", "default")
-					resp, _ = scclient.Do(req)
-					Expect(resp.StatusCode).To(Equal(http.StatusOK))
-					serviceId = ""
-
-				})
-
-				It("Get Dependencies for providers and consumers", func() {
-					getServiceName(serviceId)
-					schema := []string{"testSchema"}
-					properties := map[string]string{"attr1": "aa"}
-					consumerAppName := strconv.Itoa(rand.Intn(15))
-					servicemap := map[string]interface{}{
-						"serviceName": consumerAppName,
-						"appId":       "consumerAppId",
-						"version":     "2.0.0",
-						"description": "examples",
-						"level":       "FRONT",
-						"schemas":     schema,
-						"status":      "UP",
-						"properties":  properties,
-					}
-					bodyParams := map[string]interface{}{
-						"service": servicemap,
-					}
-					body, _ := json.Marshal(bodyParams)
-					bodyBuf := bytes.NewReader(body)
-					req, _ := http.NewRequest(POST, SCURL+REGISTERMICROSERVICE, bodyBuf)
-					req.Header.Set("X-Domain-Name", "default")
-					resp, err := scclient.Do(req)
-					Expect(err).To(BeNil())
-					defer resp.Body.Close()
-
-					// Validate the service creation
-					Expect(resp.StatusCode).To(Equal(http.StatusOK))
-					respbody, _ := ioutil.ReadAll(resp.Body)
-					consumerServiceID := gojson.Json(string(respbody)).Get("serviceId").Tostring()
-
-					//Create Dependency
-					consumer := map[string]string{
-						"appId":       "consumerAppId",
-						"serviceName": consumerAppName,
-						"version":     "2.0.0",
-					}
-					provider := map[string]string{
-						"appId":       serviceAppId,
-						"serviceName": serviceName,
-						"version":     serviceVersion,
-					}
-					providersArray := []interface{}{provider}
-					dependency := map[string]interface{}{
-						"consumer":  consumer,
-						"providers": providersArray,
-					}
-					dependencyArray := []interface{}{dependency}
-					bodyParams = map[string]interface{}{
-						"dependencies": dependencyArray,
-					}
-					body, _ = json.Marshal(bodyParams)
-					bodyBuf = bytes.NewReader(body)
-					req, _ = http.NewRequest(UPDATE, SCURL+CREATEDEPENDENCIES, bodyBuf)
-					req.Header.Set("X-Domain-Name", "default")
-					resp, err = scclient.Do(req)
-					Expect(err).To(BeNil())
-					defer resp.Body.Close()
-
-					// Validate the dependency creation
-					Expect(resp.StatusCode).To(Equal(http.StatusOK))
-
-					// add new dependency
-					dependency["providers"] = []interface{}{consumer}
-					body, _ = json.Marshal(bodyParams)
-					bodyBuf = bytes.NewReader(body)
-					req, _ = http.NewRequest(POST, SCURL+CREATEDEPENDENCIES, bodyBuf)
-					req.Header.Set("X-Domain-Name", "default")
-					resp, err = scclient.Do(req)
-					Expect(err).To(BeNil())
-					defer resp.Body.Close()
-
-					// Validate the dependency creation
-					Expect(resp.StatusCode).To(Equal(http.StatusOK))
-
-					//Get Provider by ConsumerID
-					<-time.After(time.Second)
-					url := strings.Replace(GETCONPRODEPENDENCY, ":consumerId", consumerServiceID, 1)
-					req, _ = http.NewRequest(GET, SCURL+url, nil)
-					req.Header.Set("X-Domain-Name", "default")
-					resp, _ = scclient.Do(req)
-					respbody, _ = ioutil.ReadAll(resp.Body)
-					Expect(resp.StatusCode).To(Equal(http.StatusOK))
-					servicesStruct := map[string][]map[string]interface{}{}
-
-					json.Unmarshal(respbody, &servicesStruct)
-					foundMicroService := false
-					for _, services := range servicesStruct["providers"] {
-						if services["serviceName"] == serviceName {
-							foundMicroService = true
-							break
-						}
-					}
-					Expect(foundMicroService).To(Equal(true))
-
-					//Get Consumer by ProviderID
-					url = strings.Replace(GETPROCONDEPENDENCY, ":providerId", serviceId, 1)
-					req, _ = http.NewRequest(GET, SCURL+url, nil)
-					req.Header.Set("X-Domain-Name", "default")
-					resp, _ = scclient.Do(req)
-					respbody, _ = ioutil.ReadAll(resp.Body)
-					Expect(resp.StatusCode).To(Equal(http.StatusOK))
-					servicesStruct = map[string][]map[string]interface{}{}
-
-					json.Unmarshal(respbody, &servicesStruct)
-					foundMicroService = false
-					for _, services := range servicesStruct["consumers"] {
-						if services["serviceName"] == consumerAppName {
-							foundMicroService = true
-							break
-						}
-					}
-					Expect(foundMicroService).To(Equal(true))
-
-					//Get new dependency by ConsumerID
-					url = strings.Replace(GETCONPRODEPENDENCY, ":consumerId", consumerServiceID, 1)
-					req, _ = http.NewRequest(GET, SCURL+url, nil)
-					req.Header.Set("X-Domain-Name", "default")
-					resp, _ = scclient.Do(req)
-					respbody, _ = ioutil.ReadAll(resp.Body)
-					Expect(resp.StatusCode).To(Equal(http.StatusOK))
-					servicesStruct = map[string][]map[string]interface{}{}
-
-					json.Unmarshal(respbody, &servicesStruct)
-					foundMicroService = false
-					for _, services := range servicesStruct["providers"] {
-						if services["serviceName"] == consumerAppName {
-							foundMicroService = true
-							break
-						}
-					}
-					Expect(foundMicroService).To(Equal(true))
-
-					// override the dependency
-					dependency["providers"] = []interface{}{}
-					body, _ = json.Marshal(bodyParams)
-					bodyBuf = bytes.NewReader(body)
-					req, _ = http.NewRequest(UPDATE, SCURL+CREATEDEPENDENCIES, bodyBuf)
-					req.Header.Set("X-Domain-Name", "default")
-					resp, err = scclient.Do(req)
-					Expect(err).To(BeNil())
-					defer resp.Body.Close()
-
-					// Validate the dependency creation
-					Expect(resp.StatusCode).To(Equal(http.StatusOK))
-
-					//Get Provider by ConsumerID again
-					<-time.After(time.Second)
-					url = strings.Replace(GETCONPRODEPENDENCY, ":consumerId", consumerServiceID, 1)
-					req, _ = http.NewRequest(GET, SCURL+url, nil)
-					req.Header.Set("X-Domain-Name", "default")
-					resp, _ = scclient.Do(req)
-					respbody, _ = ioutil.ReadAll(resp.Body)
-					Expect(resp.StatusCode).To(Equal(http.StatusOK))
-					servicesStruct = map[string][]map[string]interface{}{}
-					json.Unmarshal(respbody, &servicesStruct)
-					Expect(len(servicesStruct["providers"])).To(Equal(0))
-
-					//Delete Consumer and Provider
-					url = strings.Replace(UNREGISTERMICROSERVICE, ":serviceId", consumerServiceID, 1)
-					req, _ = http.NewRequest(DELETE, SCURL+url, nil)
-					req.Header.Set("X-Domain-Name", "default")
-					resp, _ = scclient.Do(req)
-					Expect(resp.StatusCode).To(Equal(http.StatusOK))
-
-					url = strings.Replace(UNREGISTERMICROSERVICE, ":serviceId", serviceId, 1)
-					req, _ = http.NewRequest(DELETE, SCURL+url, nil)
-					req.Header.Set("X-Domain-Name", "default")
-					resp, _ = scclient.Do(req)
-					Expect(resp.StatusCode).To(Equal(http.StatusOK))
-					serviceId = ""
-				})
-
 				It("Invalid scenario for GET Providers and Consumers", func() {
 					//Get Provider by ConsumerID
 					url := strings.Replace(GETCONPRODEPENDENCY, ":consumerId", "wrongID", 1)
diff --git a/pkg/proto/service.go b/pkg/proto/service.go
index 1cf5faf..5767d98 100644
--- a/pkg/proto/service.go
+++ b/pkg/proto/service.go
@@ -42,8 +42,6 @@ type ServiceCtrlServer interface {
 	DeleteSchema(context.Context, *discovery.DeleteSchemaRequest) (*discovery.DeleteSchemaResponse, error)
 	ModifySchema(context.Context, *discovery.ModifySchemaRequest) (*discovery.ModifySchemaResponse, error)
 	ModifySchemas(context.Context, *discovery.ModifySchemasRequest) (*discovery.ModifySchemasResponse, error)
-	AddDependenciesForMicroServices(context.Context, *discovery.AddDependenciesRequest) (*discovery.AddDependenciesResponse, error)
-	CreateDependenciesForMicroServices(context.Context, *discovery.CreateDependenciesRequest) (*discovery.CreateDependenciesResponse, error)
 	GetProviderDependencies(context.Context, *discovery.GetDependenciesRequest) (*discovery.GetProDependenciesResponse, error)
 	GetConsumerDependencies(context.Context, *discovery.GetDependenciesRequest) (*discovery.GetConDependenciesResponse, error)
 	DeleteServices(context.Context, *discovery.DelServicesRequest) (*discovery.DelServicesResponse, error)
diff --git a/pkg/validate/validator.go b/pkg/validate/validator.go
index 60b02af..3babae7 100644
--- a/pkg/validate/validator.go
+++ b/pkg/validate/validator.go
@@ -53,6 +53,13 @@ func (v *Validator) AddRule(name string, rule *Rule) {
 	v.rules[name] = rule
 }
 
+func (v *Validator) RemoveRule(name string) {
+	if v.rules == nil {
+		return
+	}
+	delete(v.rules, name)
+}
+
 func (v *Validator) GetRules() map[string](*Rule) {
 	return v.rules
 }
diff --git a/server/rest/controller/v3/dependency_controller.go b/server/rest/controller/v3/dependency_controller.go
index 5700198..5c94b0b 100644
--- a/server/rest/controller/v3/dependency_controller.go
+++ b/server/rest/controller/v3/dependency_controller.go
@@ -29,8 +29,6 @@ type DependencyService struct {
 
 func (this *DependencyService) URLPatterns() []rest.Route {
 	return []rest.Route{
-		{http.MethodPost, "/registry/v3/dependencies", this.AddDependenciesForMicroServices},
-		{http.MethodPut, "/registry/v3/dependencies", this.CreateDependenciesForMicroServices},
 		{http.MethodGet, "/registry/v3/microservices/:consumerId/providers", this.GetConProDependencies},
 		{http.MethodGet, "/registry/v3/microservices/:providerId/consumers", this.GetProConDependencies},
 	}
diff --git a/server/rest/controller/v4/dependency_controller.go b/server/rest/controller/v4/dependency_controller.go
index 482e1ce..d2607c4 100644
--- a/server/rest/controller/v4/dependency_controller.go
+++ b/server/rest/controller/v4/dependency_controller.go
@@ -18,13 +18,9 @@
 package v4
 
 import (
-	"encoding/json"
-	"io/ioutil"
 	"net/http"
 
-	"github.com/apache/servicecomb-service-center/pkg/log"
 	"github.com/apache/servicecomb-service-center/pkg/rest"
-	"github.com/apache/servicecomb-service-center/pkg/util"
 	"github.com/apache/servicecomb-service-center/server/core"
 	pb "github.com/go-chassis/cari/discovery"
 )
@@ -34,61 +30,11 @@ type DependencyService struct {
 
 func (s *DependencyService) URLPatterns() []rest.Route {
 	return []rest.Route{
-		{Method: http.MethodPost, Path: "/v4/:project/registry/dependencies", Func: s.AddDependenciesForMicroServices},
-		{Method: http.MethodPut, Path: "/v4/:project/registry/dependencies", Func: s.CreateDependenciesForMicroServices},
 		{Method: http.MethodGet, Path: "/v4/:project/registry/microservices/:consumerId/providers", Func: s.GetConProDependencies},
 		{Method: http.MethodGet, Path: "/v4/:project/registry/microservices/:providerId/consumers", Func: s.GetProConDependencies},
 	}
 }
 
-//Deprecated
-func (s *DependencyService) AddDependenciesForMicroServices(w http.ResponseWriter, r *http.Request) {
-	requestBody, err := ioutil.ReadAll(r.Body)
-	if err != nil {
-		log.Error("read body failed", err)
-		rest.WriteError(w, pb.ErrInvalidParams, err.Error())
-		return
-	}
-	request := &pb.AddDependenciesRequest{}
-	err = json.Unmarshal(requestBody, request)
-	if err != nil {
-		log.Errorf(err, "invalid json: %s", util.BytesToStringWithNoCopy(requestBody))
-		rest.WriteError(w, pb.ErrInvalidParams, err.Error())
-		return
-	}
-
-	resp, err := core.ServiceAPI.AddDependenciesForMicroServices(r.Context(), request)
-	if err != nil {
-		rest.WriteError(w, pb.ErrInternal, err.Error())
-	}
-	w.Header().Add("Deprecation", "version=\"v4\"")
-	rest.WriteResponse(w, r, resp.Response, nil)
-}
-
-//Deprecated
-func (s *DependencyService) CreateDependenciesForMicroServices(w http.ResponseWriter, r *http.Request) {
-	requestBody, err := ioutil.ReadAll(r.Body)
-	if err != nil {
-		log.Error("read body failed", err)
-		rest.WriteError(w, pb.ErrInvalidParams, err.Error())
-		return
-	}
-	request := &pb.CreateDependenciesRequest{}
-	err = json.Unmarshal(requestBody, request)
-	if err != nil {
-		log.Errorf(err, "invalid json: %s", util.BytesToStringWithNoCopy(requestBody))
-		rest.WriteError(w, pb.ErrInvalidParams, err.Error())
-		return
-	}
-
-	resp, err := core.ServiceAPI.CreateDependenciesForMicroServices(r.Context(), request)
-	if err != nil {
-		rest.WriteError(w, pb.ErrInternal, err.Error())
-	}
-	w.Header().Add("Deprecation", "version=\"v4\"")
-	rest.WriteResponse(w, r, resp.Response, nil)
-}
-
 func (s *DependencyService) GetConProDependencies(w http.ResponseWriter, r *http.Request) {
 	query := r.URL.Query()
 	request := &pb.GetDependenciesRequest{
diff --git a/server/rest/controller/v4/instance_controller.go b/server/rest/controller/v4/instance_controller.go
index 999cb5e..878c9f4 100644
--- a/server/rest/controller/v4/instance_controller.go
+++ b/server/rest/controller/v4/instance_controller.go
@@ -131,7 +131,6 @@ func (s *MicroServiceInstanceService) FindInstances(w http.ResponseWriter, r *ht
 		AppId:             query.Get("appId"),
 		ServiceName:       serviceName,
 		Alias:             serviceName,
-		VersionRule:       query.Get("version"),
 		Environment:       query.Get("env"),
 		Tags:              ids,
 	}
diff --git a/server/service/disco/dependency.go b/server/service/disco/dependency.go
index c9886d6..97e2dae 100644
--- a/server/service/disco/dependency.go
+++ b/server/service/disco/dependency.go
@@ -26,30 +26,6 @@ import (
 	pb "github.com/go-chassis/cari/discovery"
 )
 
-func (s *MicroServiceService) AddDependenciesForMicroServices(ctx context.Context,
-	in *pb.AddDependenciesRequest) (*pb.AddDependenciesResponse, error) {
-	if err := validator.Validate(in); err != nil {
-		return &pb.AddDependenciesResponse{
-			Response: datasource.BadParamsResponse(err.Error()).Response,
-		}, nil
-	}
-
-	resp, err := datasource.GetDependencyManager().AddOrUpdateDependencies(ctx, in.Dependencies, false)
-	return &pb.AddDependenciesResponse{Response: resp}, err
-}
-
-func (s *MicroServiceService) CreateDependenciesForMicroServices(ctx context.Context,
-	in *pb.CreateDependenciesRequest) (*pb.CreateDependenciesResponse, error) {
-	if err := validator.Validate(in); err != nil {
-		return &pb.CreateDependenciesResponse{
-			Response: datasource.BadParamsResponse(err.Error()).Response,
-		}, nil
-	}
-
-	resp, err := datasource.GetDependencyManager().AddOrUpdateDependencies(ctx, in.Dependencies, true)
-	return &pb.CreateDependenciesResponse{Response: resp}, err
-}
-
 func (s *MicroServiceService) GetProviderDependencies(ctx context.Context,
 	in *pb.GetDependenciesRequest) (*pb.GetProDependenciesResponse, error) {
 	err := validator.Validate(in)
diff --git a/server/service/disco/dependency_test.go b/server/service/disco/dependency_test.go
index 5597711..3525a21 100644
--- a/server/service/disco/dependency_test.go
+++ b/server/service/disco/dependency_test.go
@@ -17,8 +17,6 @@
 package disco_test
 
 import (
-	"strconv"
-
 	"github.com/apache/servicecomb-service-center/server/service/disco"
 
 	pb "github.com/go-chassis/cari/discovery"
@@ -35,586 +33,7 @@ import (
 var deh event.DependencyEventHandler
 
 var _ = Describe("'Dependency' service", func() {
-	Describe("execute 'create' operation", func() {
-		var (
-			consumerId1 string
-			consumerId2 string
-			consumerId3 string
-		)
-
-		It("should be passed", func() {
-			respCreateService, err := serviceResource.Create(getContext(), &pb.CreateServiceRequest{
-				Service: &pb.MicroService{
-					AppId:       "create_dep_group",
-					ServiceName: "create_dep_consumer",
-					Version:     "1.0.0",
-					Level:       "FRONT",
-					Status:      pb.MS_UP,
-				},
-			})
-			Expect(err).To(BeNil())
-			Expect(respCreateService.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-			consumerId1 = respCreateService.ServiceId
-
-			respCreateService, err = serviceResource.Create(getContext(), &pb.CreateServiceRequest{
-				Service: &pb.MicroService{
-					AppId:       "create_dep_group",
-					ServiceName: "create_dep_consumer_all",
-					Version:     "1.0.0",
-					Level:       "FRONT",
-					Status:      pb.MS_UP,
-				},
-			})
-			Expect(err).To(BeNil())
-			Expect(respCreateService.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-			consumerId3 = respCreateService.ServiceId
-
-			respCreateService, err = serviceResource.Create(getContext(), &pb.CreateServiceRequest{
-				Service: &pb.MicroService{
-					Environment: pb.ENV_PROD,
-					AppId:       "create_dep_group",
-					ServiceName: "create_dep_consumer",
-					Version:     "1.0.0",
-					Level:       "FRONT",
-					Status:      pb.MS_UP,
-				},
-			})
-			Expect(err).To(BeNil())
-			Expect(respCreateService.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-			consumerId2 = respCreateService.ServiceId
-
-			respCreateService, err = serviceResource.Create(getContext(), &pb.CreateServiceRequest{
-				Service: &pb.MicroService{
-					AppId:       "create_dep_group",
-					ServiceName: "create_dep_provider",
-					Version:     "1.0.0",
-					Level:       "FRONT",
-					Status:      pb.MS_UP,
-				},
-			})
-			Expect(err).To(BeNil())
-			Expect(respCreateService.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-
-			respCreateService, err = serviceResource.Create(getContext(), &pb.CreateServiceRequest{
-				Service: &pb.MicroService{
-					AppId:       "create_dep_group",
-					ServiceName: "create_dep_provider",
-					Version:     "1.0.1",
-					Level:       "FRONT",
-					Status:      pb.MS_UP,
-				},
-			})
-			Expect(err).To(BeNil())
-			Expect(respCreateService.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-
-			respCreateService, err = serviceResource.Create(getContext(), &pb.CreateServiceRequest{
-				Service: &pb.MicroService{
-					Environment: pb.ENV_PROD,
-					AppId:       "create_dep_group",
-					ServiceName: "create_dep_provider",
-					Version:     "1.0.0",
-					Level:       "FRONT",
-					Status:      pb.MS_UP,
-				},
-			})
-			Expect(err).To(BeNil())
-			Expect(respCreateService.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-		})
-
-		Context("when request is invalid", func() {
-			It("should be failed", func() {
-				By("dependency is nil")
-				respCreateDependency, err := serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{})
-				Expect(err).To(BeNil())
-				Expect(respCreateDependency.Response.GetCode()).ToNot(Equal(pb.ResponseSuccess))
-
-				consumer := &pb.MicroServiceKey{
-					AppId:       "create_dep_group",
-					ServiceName: "create_dep_consumer",
-					Version:     "1.0.0",
-				}
-				providers := []*pb.MicroServiceKey{
-					{
-						AppId:       "create_dep_group",
-						ServiceName: "create_dep_provider",
-						Version:     "1.0.0",
-					},
-				}
-
-				By("consumer does not exist")
-				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.ConsumerDependency{
-						{
-							Consumer: &pb.MicroServiceKey{
-								AppId:       "noexistapp",
-								ServiceName: "noexistservice",
-								Version:     "1.0.0",
-							},
-							Providers: providers,
-						},
-					},
-				})
-				Expect(err).To(BeNil())
-				Expect(respCreateDependency.Response.GetCode()).ToNot(Equal(pb.ResponseSuccess))
-
-				By("provider version is invalid")
-				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.ConsumerDependency{
-						{
-							Consumer: consumer,
-							Providers: []*pb.MicroServiceKey{
-								{
-									AppId:       "create_dep_group",
-									ServiceName: "create_dep_provider",
-									Version:     "1.0.32768",
-								},
-							},
-						},
-					},
-				})
-				Expect(err).To(BeNil())
-				Expect(respCreateDependency.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
-
-				By("consumer version is invalid")
-				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.ConsumerDependency{
-						{
-							Consumer: &pb.MicroServiceKey{
-								AppId:       "create_dep_group",
-								ServiceName: "create_dep_consumer",
-								Version:     "1.0.0+",
-							},
-							Providers: providers,
-						},
-					},
-				})
-				Expect(err).To(BeNil())
-				Expect(respCreateDependency.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
-				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.ConsumerDependency{
-						{
-							Consumer: &pb.MicroServiceKey{
-								AppId:       "create_dep_group",
-								ServiceName: "create_dep_consumer",
-								Version:     "1.0.0-1.0.1",
-							},
-							Providers: providers,
-						},
-					},
-				})
-				Expect(err).To(BeNil())
-				Expect(respCreateDependency.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
-				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.ConsumerDependency{
-						{
-							Consumer: &pb.MicroServiceKey{
-								AppId:       "create_dep_group",
-								ServiceName: "create_dep_consumer",
-								Version:     "latest",
-							},
-							Providers: providers,
-						},
-					},
-				})
-				Expect(err).To(BeNil())
-				Expect(respCreateDependency.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
-				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.ConsumerDependency{
-						{
-							Consumer: &pb.MicroServiceKey{
-								AppId:       "create_dep_group",
-								ServiceName: "create_dep_consumer",
-								Version:     "",
-							},
-							Providers: providers,
-						},
-					},
-				})
-				Expect(err).To(BeNil())
-				Expect(respCreateDependency.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
-				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.ConsumerDependency{
-						{
-							Consumer: &pb.MicroServiceKey{
-								AppId:       "create_dep_group",
-								ServiceName: "create_dep_consumer",
-								Version:     "1.0.32768",
-							},
-							Providers: providers,
-						},
-					},
-				})
-				Expect(err).To(BeNil())
-				Expect(respCreateDependency.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
-
-				By("consumer serviceName is invalid")
-				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.ConsumerDependency{
-						{
-							Consumer: &pb.MicroServiceKey{
-								AppId:       "create_dep_group",
-								ServiceName: "*",
-								Version:     "1.0.0",
-							},
-							Providers: providers,
-						},
-					},
-				})
-				Expect(err).To(BeNil())
-				Expect(respCreateDependency.Response.GetCode()).ToNot(Equal(pb.ResponseSuccess))
-
-				By("provider app is invalid")
-				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.ConsumerDependency{
-						{
-							Consumer: consumer,
-							Providers: []*pb.MicroServiceKey{
-								{
-									AppId:       "*",
-									ServiceName: "service_name_provider",
-									Version:     "2.0.0",
-								},
-							},
-						},
-					},
-				})
-				Expect(err).To(BeNil())
-				Expect(respCreateDependency.Response.GetCode()).ToNot(Equal(pb.ResponseSuccess))
-
-				By("provider serviceName is invalid")
-				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.ConsumerDependency{
-						{
-							Consumer: consumer,
-							Providers: []*pb.MicroServiceKey{
-								{
-									AppId:       "service_group_provider",
-									ServiceName: "-",
-									Version:     "2.0.0",
-								},
-							},
-						},
-					},
-				})
-				Expect(err).To(BeNil())
-				Expect(respCreateDependency.Response.GetCode()).ToNot(Equal(pb.ResponseSuccess))
-
-				By("provider version is invalid")
-				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.ConsumerDependency{
-						{
-							Consumer: consumer,
-							Providers: []*pb.MicroServiceKey{
-								{
-									AppId:       "service_group_provider",
-									ServiceName: "service_name_provider",
-									Version:     "",
-								},
-							},
-						},
-					},
-				})
-				Expect(err).To(BeNil())
-				Expect(respCreateDependency.Response.GetCode()).ToNot(Equal(pb.ResponseSuccess))
-
-				By("provider in diff env")
-				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.ConsumerDependency{
-						{
-							Consumer: consumer,
-							Providers: []*pb.MicroServiceKey{
-								{
-									Environment: pb.ENV_PROD,
-									AppId:       "service_group_provider",
-									ServiceName: "service_name_provider",
-									Version:     "latest",
-								},
-							},
-						},
-					},
-				})
-				Expect(err).To(BeNil())
-				Expect(respCreateDependency.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-
-				By("consumer in diff env")
-				consumer.Environment = pb.ENV_PROD
-				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.ConsumerDependency{
-						{
-							Consumer: consumer,
-							Providers: []*pb.MicroServiceKey{
-								{
-									AppId:       "service_group_provider",
-									ServiceName: "service_name_provider",
-									Version:     "latest",
-								},
-							},
-						},
-					},
-				})
-				Expect(err).To(BeNil())
-				Expect(respCreateDependency.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-
-				DependencyHandle()
-
-				respCon, err := serviceResource.GetConsumerDependencies(getContext(), &pb.GetDependenciesRequest{
-					ServiceId: consumerId1,
-				})
-				Expect(err).To(BeNil())
-				Expect(respCon.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-				Expect(len(respCon.Providers)).To(Equal(0))
-
-				respCon, err = serviceResource.GetConsumerDependencies(getContext(), &pb.GetDependenciesRequest{
-					ServiceId: consumerId2,
-				})
-				Expect(err).To(BeNil())
-				Expect(respCon.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-				Expect(len(respCon.Providers)).To(Equal(0))
-
-				By("dependencies is invalid")
-				var deps []*pb.ConsumerDependency
-				for i := 0; i < 101; i++ {
-					deps = append(deps, &pb.ConsumerDependency{
-						Consumer: &pb.MicroServiceKey{
-							AppId:       "create_dep_group",
-							ServiceName: "create_dep_consumer" + strconv.Itoa(i),
-							Version:     "1.0.0",
-						},
-						Providers: []*pb.MicroServiceKey{
-							{
-								AppId:       "service_group_provider",
-								ServiceName: "service_name_provider",
-								Version:     "latest",
-							},
-						},
-					})
-				}
-				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: deps,
-				})
-				Expect(err).To(BeNil())
-				Expect(respCreateDependency.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
-			})
-		})
-
-		Context("when request is valid", func() {
-			It("should be passed", func() {
-				consumer := &pb.MicroServiceKey{
-					ServiceName: "create_dep_consumer",
-					AppId:       "create_dep_group",
-					Version:     "1.0.0",
-				}
-
-				By("add latest")
-				respCreateDependency, err := serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.ConsumerDependency{
-						{
-							Consumer: consumer,
-							Providers: []*pb.MicroServiceKey{
-								{
-									AppId:       "create_dep_group",
-									ServiceName: "create_dep_provider",
-									Version:     "latest",
-								},
-							},
-						},
-					},
-				})
-				Expect(err).To(BeNil())
-				Expect(respCreateDependency.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-
-				DependencyHandle()
-
-				respPro, err := serviceResource.GetConsumerDependencies(getContext(), &pb.GetDependenciesRequest{
-					ServiceId: consumerId1,
-				})
-				Expect(err).To(BeNil())
-				Expect(respPro.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-				Expect(len(respPro.Providers)).To(Equal(1))
-				Expect(respPro.Providers[0].Version).To(Equal("1.0.1"))
-
-				By("add 1.0.0+")
-				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.ConsumerDependency{
-						{
-							Consumer: consumer,
-							Providers: []*pb.MicroServiceKey{
-								{
-									AppId:       "create_dep_group",
-									ServiceName: "create_dep_provider",
-									Version:     "1.0.0+",
-								},
-							},
-						},
-					},
-				})
-				Expect(err).To(BeNil())
-				Expect(respCreateDependency.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-
-				DependencyHandle()
-
-				respPro, err = serviceResource.GetConsumerDependencies(getContext(), &pb.GetDependenciesRequest{
-					ServiceId: consumerId1,
-				})
-				Expect(err).To(BeNil())
-				Expect(respPro.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-				Expect(len(respPro.Providers)).To(Equal(2))
-
-				By("add *")
-				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.ConsumerDependency{
-						{
-							Consumer: &pb.MicroServiceKey{
-								ServiceName: "create_dep_consumer_all",
-								AppId:       "create_dep_group",
-								Version:     "1.0.0",
-							},
-							Providers: []*pb.MicroServiceKey{
-								{
-									ServiceName: "*",
-								},
-							},
-						},
-					},
-				})
-				Expect(err).To(BeNil())
-				Expect(respCreateDependency.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-
-				DependencyHandle()
-
-				respPro, err = serviceResource.GetConsumerDependencies(getContext(), &pb.GetDependenciesRequest{
-					ServiceId: consumerId3,
-				})
-				Expect(err).To(BeNil())
-				Expect(respPro.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-				Expect(len(respPro.Providers)).ToNot(Equal(0))
-
-				By("clean all")
-				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.ConsumerDependency{
-						{
-							Consumer: &pb.MicroServiceKey{
-								ServiceName: "create_dep_consumer_all",
-								AppId:       "create_dep_group",
-								Version:     "1.0.0",
-							},
-							Providers: nil,
-						},
-					},
-				})
-				Expect(err).To(BeNil())
-				Expect(respCreateDependency.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-
-				By("add multiple providers")
-				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.ConsumerDependency{
-						{
-							Consumer: consumer,
-							Providers: []*pb.MicroServiceKey{
-								{
-									AppId:       "create_dep_group",
-									ServiceName: "create_dep_provider",
-									Version:     "1.0.0",
-								},
-								{
-									ServiceName: "*",
-								},
-							},
-						},
-					},
-				})
-				Expect(err).To(BeNil())
-				Expect(respCreateDependency.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-
-				By("add 1.0.0-2.0.0 to override *")
-				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.ConsumerDependency{
-						{
-							Consumer: consumer,
-							Providers: []*pb.MicroServiceKey{
-								{
-									AppId:       "create_dep_group",
-									ServiceName: "create_dep_provider",
-									Version:     "1.0.0-1.0.1",
-								},
-							},
-						},
-					},
-				})
-				Expect(err).To(BeNil())
-				Expect(respCreateDependency.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-
-				DependencyHandle()
-
-				respPro, err = serviceResource.GetConsumerDependencies(getContext(), &pb.GetDependenciesRequest{
-					ServiceId: consumerId1,
-				})
-				Expect(err).To(BeNil())
-				Expect(respPro.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-				Expect(len(respPro.Providers)).To(Equal(1))
-				Expect(respPro.Providers[0].Version).To(Equal("1.0.0"))
-
-				By("add not override")
-				respAddDependency, err := serviceResource.AddDependenciesForMicroServices(getContext(), &pb.AddDependenciesRequest{
-					Dependencies: []*pb.ConsumerDependency{
-						{
-							Consumer: consumer,
-							Providers: []*pb.MicroServiceKey{
-								{
-									AppId:       "create_dep_group",
-									ServiceName: "create_dep_provider",
-									Version:     "1.0.0-3.0.0",
-								},
-							},
-						},
-					},
-				})
-				Expect(err).To(BeNil())
-				Expect(respAddDependency.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-
-				DependencyHandle()
-
-				respPro, err = serviceResource.GetConsumerDependencies(getContext(), &pb.GetDependenciesRequest{
-					ServiceId: consumerId1,
-				})
-				Expect(err).To(BeNil())
-				Expect(respPro.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-				Expect(len(respPro.Providers)).To(Equal(2))
-
-				By("add provider is empty")
-				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.ConsumerDependency{
-						{
-							Consumer:  consumer,
-							Providers: []*pb.MicroServiceKey{},
-						},
-					},
-				})
-				Expect(err).To(BeNil())
-				Expect(respCreateDependency.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-				respCreateDependency, err = serviceResource.CreateDependenciesForMicroServices(getContext(), &pb.CreateDependenciesRequest{
-					Dependencies: []*pb.ConsumerDependency{
-						{
-							Consumer: consumer,
-						},
-					},
-				})
-				Expect(err).To(BeNil())
-				Expect(respCreateDependency.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-
-				DependencyHandle()
-
-				respPro, err = serviceResource.GetConsumerDependencies(getContext(), &pb.GetDependenciesRequest{
-					ServiceId: consumerId1,
-				})
-				Expect(err).To(BeNil())
-				Expect(respPro.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-				Expect(len(respPro.Providers)).To(Equal(0))
-			})
-		})
-	})
-
-	Describe("execute 'get' operartion", func() {
+	Describe("execute 'get' operation", func() {
 		var (
 			consumerId1 string
 			providerId1 string
@@ -719,7 +138,6 @@ var _ = Describe("'Dependency' service", func() {
 					ConsumerServiceId: consumerId1,
 					AppId:             "get_dep_group",
 					ServiceName:       "get_dep_provider",
-					VersionRule:       "1.0.0+",
 				})
 				Expect(err).To(BeNil())
 				Expect(resp.Response.GetCode()).To(Equal(pb.ResponseSuccess))
@@ -743,61 +161,38 @@ var _ = Describe("'Dependency' service", func() {
 				Expect(respGetC.Response.GetCode()).To(Equal(pb.ResponseSuccess))
 				Expect(len(respGetC.Providers)).To(Equal(2))
 
-				//重复find
+				By("get self deps")
 				resp, err = disco.FindInstances(getContext(), &pb.FindInstancesRequest{
 					ConsumerServiceId: consumerId1,
 					AppId:             "get_dep_group",
-					ServiceName:       "get_dep_provider",
-					VersionRule:       "2.0.0+",
+					ServiceName:       "get_dep_consumer",
 				})
 				Expect(err).To(BeNil())
 				Expect(resp.Response.GetCode()).To(Equal(pb.ResponseSuccess))
 
 				DependencyHandle()
 
-				By("get consumer again")
-				respGetP, err = serviceResource.GetProviderDependencies(getContext(), &pb.GetDependenciesRequest{
-					ServiceId: providerId1,
-				})
-				Expect(err).To(BeNil())
-				Expect(respGetP.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-				Expect(len(respGetP.Consumers)).To(Equal(0))
-
-				By("get provider again")
 				respGetC, err = serviceResource.GetConsumerDependencies(getContext(), &pb.GetDependenciesRequest{
 					ServiceId: consumerId1,
+					NoSelf:    true,
 				})
 				Expect(err).To(BeNil())
 				Expect(respGetC.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-				Expect(len(respGetC.Providers)).To(Equal(1))
-				Expect(respGetC.Providers[0].ServiceId).To(Equal(providerId2))
-
-				By("get self deps")
-				resp, err = disco.FindInstances(getContext(), &pb.FindInstancesRequest{
-					ConsumerServiceId: consumerId1,
-					AppId:             "get_dep_group",
-					ServiceName:       "get_dep_consumer",
-					VersionRule:       "1.0.0+",
-				})
-				Expect(err).To(BeNil())
-				Expect(resp.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-
-				DependencyHandle()
+				Expect(len(respGetC.Providers)).To(Equal(2))
 
 				respGetC, err = serviceResource.GetConsumerDependencies(getContext(), &pb.GetDependenciesRequest{
 					ServiceId: consumerId1,
-					NoSelf:    true,
+					NoSelf:    false,
 				})
 				Expect(err).To(BeNil())
 				Expect(respGetC.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-				Expect(len(respGetC.Providers)).To(Equal(1))
+				Expect(len(respGetC.Providers)).To(Equal(3))
 
 				By("find before provider register")
 				resp, err = disco.FindInstances(getContext(), &pb.FindInstancesRequest{
 					ConsumerServiceId: providerId2,
 					AppId:             "get_dep_group",
 					ServiceName:       "get_dep_finder",
-					VersionRule:       "1.0.0+",
 				})
 				Expect(err).To(BeNil())
 				Expect(resp.Response.GetCode()).To(Equal(pb.ErrServiceNotExists))
@@ -819,7 +214,6 @@ var _ = Describe("'Dependency' service", func() {
 					ConsumerServiceId: providerId2,
 					AppId:             "get_dep_group",
 					ServiceName:       "get_dep_finder",
-					VersionRule:       "1.0.0+",
 				})
 				Expect(err).To(BeNil())
 				Expect(resp.Response.GetCode()).To(Equal(pb.ResponseSuccess))
@@ -867,7 +261,6 @@ var _ = Describe("'Dependency' service", func() {
 					ConsumerServiceId: providerId2,
 					AppId:             "get_dep_group",
 					ServiceName:       "get_dep_finder",
-					VersionRule:       "1.0.0+",
 				})
 				Expect(err).To(BeNil())
 				Expect(resp.Response.GetCode()).To(Equal(pb.ResponseSuccess))
diff --git a/server/service/disco/instance_test.go b/server/service/disco/instance_test.go
index bb19355..9ee916e 100644
--- a/server/service/disco/instance_test.go
+++ b/server/service/disco/instance_test.go
@@ -990,6 +990,7 @@ var _ = Describe("'Instance' service", func() {
 			Expect(err).To(BeNil())
 			Expect(resp.Response.GetCode()).To(Equal(pb.ResponseSuccess))
 			instanceId1 = resp.InstanceId
+			Expect(instanceId1).To(Equal(instanceId1))
 
 			resp, err = discosvc.RegisterInstance(getContext(), &pb.RegisterInstanceRequest{
 				Instance: &pb.MicroServiceInstance{
@@ -1083,7 +1084,6 @@ var _ = Describe("'Instance' service", func() {
 					ConsumerServiceId: serviceId1,
 					AppId:             TOO_LONG_APPID,
 					ServiceName:       "query_instance_service",
-					VersionRule:       "1.0.0",
 				})
 				Expect(err).To(BeNil())
 				Expect(respFind.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
@@ -1091,7 +1091,6 @@ var _ = Describe("'Instance' service", func() {
 					ConsumerServiceId: serviceId1,
 					AppId:             "",
 					ServiceName:       "query_instance_service",
-					VersionRule:       "1.0.0",
 				})
 				Expect(err).To(BeNil())
 				Expect(respFind.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
@@ -1099,7 +1098,6 @@ var _ = Describe("'Instance' service", func() {
 					ConsumerServiceId: serviceId1,
 					AppId:             " ",
 					ServiceName:       "query_instance_service",
-					VersionRule:       "1.0.0",
 				})
 				Expect(err).To(BeNil())
 				Expect(respFind.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
@@ -1109,7 +1107,6 @@ var _ = Describe("'Instance' service", func() {
 					ConsumerServiceId: serviceId1,
 					AppId:             "query_instance",
 					ServiceName:       TOO_LONG_EXISTENCE,
-					VersionRule:       "1.0.0",
 				})
 				Expect(err).To(BeNil())
 				Expect(respFind.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
@@ -1117,7 +1114,6 @@ var _ = Describe("'Instance' service", func() {
 					ConsumerServiceId: serviceId1,
 					AppId:             "query_instance",
 					ServiceName:       "",
-					VersionRule:       "1.0.0",
 				})
 				Expect(err).To(BeNil())
 				Expect(respFind.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
@@ -1125,93 +1121,15 @@ var _ = Describe("'Instance' service", func() {
 					ConsumerServiceId: serviceId1,
 					AppId:             "query_instance",
 					ServiceName:       " ",
-					VersionRule:       "1.0.0",
 				})
 				Expect(err).To(BeNil())
 				Expect(respFind.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
 
-				By("invalid version")
-				respFind, err = discosvc.FindInstances(getContext(), &pb.FindInstancesRequest{
-					ConsumerServiceId: serviceId1,
-					AppId:             "query_instance",
-					ServiceName:       "query_instance_service",
-					VersionRule:       "1.32768.0",
-				})
-				Expect(err).To(BeNil())
-				Expect(respFind.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
-				respFind, err = discosvc.FindInstances(getContext(), &pb.FindInstancesRequest{
-					ConsumerServiceId: serviceId1,
-					AppId:             "query_instance",
-					ServiceName:       "query_instance_service",
-					VersionRule:       "1.0.0-1.32768.0",
-				})
-				Expect(err).To(BeNil())
-				Expect(respFind.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
-				respFind, err = discosvc.FindInstances(getContext(), &pb.FindInstancesRequest{
-					ConsumerServiceId: serviceId1,
-					AppId:             "query_instance",
-					ServiceName:       "query_instance_service",
-					VersionRule:       " ",
-				})
-				Expect(err).To(BeNil())
-				Expect(respFind.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
-				respFind, err = discosvc.FindInstances(getContext(), &pb.FindInstancesRequest{
-					ConsumerServiceId: serviceId1,
-					AppId:             "query_instance",
-					ServiceName:       "query_instance_service",
-					VersionRule:       "",
-				})
-				Expect(err).To(BeNil())
-				Expect(respFind.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
-
-				By("consumerId is empty")
-				respFind, err = discosvc.FindInstances(getContext(), &pb.FindInstancesRequest{
-					ConsumerServiceId: "",
-					AppId:             "query_instance",
-					ServiceName:       "query_instance_service",
-					VersionRule:       "1.0.0+",
-				})
-				Expect(err).To(BeNil())
-				Expect(respFind.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-
 				By("provider does not exist")
 				respFind, err = discosvc.FindInstances(getContext(), &pb.FindInstancesRequest{
 					ConsumerServiceId: serviceId1,
 					AppId:             "query_instance",
 					ServiceName:       "noneservice",
-					VersionRule:       "latest",
-				})
-				Expect(err).To(BeNil())
-				Expect(respFind.Response.GetCode()).To(Equal(pb.ErrServiceNotExists))
-
-				By("provider does not contain 3.0.0+ versions")
-				respFind, err = discosvc.FindInstances(getContext(), &pb.FindInstancesRequest{
-					ConsumerServiceId: serviceId1,
-					AppId:             "query_instance",
-					ServiceName:       "query_instance_service",
-					VersionRule:       "3.0.0+",
-				})
-				Expect(err).To(BeNil())
-				Expect(respFind.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-				Expect(len(respFind.Instances)).To(Equal(0))
-
-				By("provider does not contain 2.0.0-2.0.1 versions")
-				respFind, err = discosvc.FindInstances(getContext(), &pb.FindInstancesRequest{
-					ConsumerServiceId: serviceId1,
-					AppId:             "query_instance",
-					ServiceName:       "query_instance_service",
-					VersionRule:       "2.0.0-2.0.1",
-				})
-				Expect(err).To(BeNil())
-				Expect(respFind.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-				Expect(len(respFind.Instances)).To(Equal(0))
-
-				By("provider does not contain 2.0.0 version")
-				respFind, err = discosvc.FindInstances(getContext(), &pb.FindInstancesRequest{
-					ConsumerServiceId: serviceId1,
-					AppId:             "query_instance",
-					ServiceName:       "query_instance_service",
-					VersionRule:       "2.0.0",
 				})
 				Expect(err).To(BeNil())
 				Expect(respFind.Response.GetCode()).To(Equal(pb.ErrServiceNotExists))
@@ -1221,7 +1139,6 @@ var _ = Describe("'Instance' service", func() {
 					ConsumerServiceId: "notExistServiceId",
 					AppId:             "query_instance",
 					ServiceName:       "query_instance_service",
-					VersionRule:       "2.0.0",
 				})
 				Expect(err).To(BeNil())
 				Expect(respFind.Response.GetCode()).To(Equal(pb.ErrServiceNotExists))
@@ -1266,7 +1183,6 @@ var _ = Describe("'Instance' service", func() {
 							Service: &pb.MicroServiceKey{
 								AppId:       TOO_LONG_APPID,
 								ServiceName: "query_instance_service",
-								Version:     "1.0.0",
 							},
 						},
 					},
@@ -1280,7 +1196,6 @@ var _ = Describe("'Instance' service", func() {
 							Service: &pb.MicroServiceKey{
 								AppId:       "",
 								ServiceName: "query_instance_service",
-								Version:     "1.0.0",
 							},
 						},
 					},
@@ -1294,7 +1209,6 @@ var _ = Describe("'Instance' service", func() {
 							Service: &pb.MicroServiceKey{
 								AppId:       " ",
 								ServiceName: "query_instance_service",
-								Version:     "1.0.0",
 							},
 						},
 					},
@@ -1310,7 +1224,6 @@ var _ = Describe("'Instance' service", func() {
 							Service: &pb.MicroServiceKey{
 								AppId:       "query_instance",
 								ServiceName: TOO_LONG_EXISTENCE,
-								Version:     "1.0.0",
 							},
 						},
 					},
@@ -1324,7 +1237,6 @@ var _ = Describe("'Instance' service", func() {
 							Service: &pb.MicroServiceKey{
 								AppId:       "query_instance",
 								ServiceName: "",
-								Version:     "1.0.0",
 							},
 						},
 					},
@@ -1338,65 +1250,6 @@ var _ = Describe("'Instance' service", func() {
 							Service: &pb.MicroServiceKey{
 								AppId:       "query_instance",
 								ServiceName: " ",
-								Version:     "1.0.0",
-							},
-						},
-					},
-				})
-				Expect(err).To(BeNil())
-				Expect(respFind.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
-
-				By("invalid version")
-				respFind, err = discosvc.BatchFindInstances(getContext(), &pb.BatchFindInstancesRequest{
-					ConsumerServiceId: serviceId1,
-					Services: []*pb.FindService{
-						{
-							Service: &pb.MicroServiceKey{
-								AppId:       "query_instance",
-								ServiceName: "query_instance_service",
-								Version:     "1.32768.0",
-							},
-						},
-					},
-				})
-				Expect(err).To(BeNil())
-				Expect(respFind.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
-				respFind, err = discosvc.BatchFindInstances(getContext(), &pb.BatchFindInstancesRequest{
-					ConsumerServiceId: serviceId1,
-					Services: []*pb.FindService{
-						{
-							Service: &pb.MicroServiceKey{
-								AppId:       "query_instance",
-								ServiceName: "query_instance_service",
-								Version:     "1.0.0-1.32768.0",
-							},
-						},
-					},
-				})
-				Expect(err).To(BeNil())
-				Expect(respFind.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
-				respFind, err = discosvc.BatchFindInstances(getContext(), &pb.BatchFindInstancesRequest{
-					ConsumerServiceId: serviceId1,
-					Services: []*pb.FindService{
-						{
-							Service: &pb.MicroServiceKey{
-								AppId:       "query_instance",
-								ServiceName: "query_instance_service",
-								Version:     " ",
-							},
-						},
-					},
-				})
-				Expect(err).To(BeNil())
-				Expect(respFind.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
-				respFind, err = discosvc.BatchFindInstances(getContext(), &pb.BatchFindInstancesRequest{
-					ConsumerServiceId: serviceId1,
-					Services: []*pb.FindService{
-						{
-							Service: &pb.MicroServiceKey{
-								AppId:       "query_instance",
-								ServiceName: "query_instance_service",
-								Version:     "",
 							},
 						},
 					},
@@ -1432,13 +1285,11 @@ var _ = Describe("'Instance' service", func() {
 
 				By("consumerId is empty")
 				respFind, err = discosvc.BatchFindInstances(getContext(), &pb.BatchFindInstancesRequest{
-					ConsumerServiceId: serviceId1,
 					Services: []*pb.FindService{
 						{
 							Service: &pb.MicroServiceKey{
 								AppId:       "query_instance",
 								ServiceName: "query_instance_service",
-								Version:     "1.0.0+",
 							},
 						},
 					},
@@ -1454,7 +1305,6 @@ var _ = Describe("'Instance' service", func() {
 							Service: &pb.MicroServiceKey{
 								AppId:       "query_instance",
 								ServiceName: "noneservice",
-								Version:     "latest",
 							},
 						},
 					},
@@ -1479,25 +1329,6 @@ var _ = Describe("'Instance' service", func() {
 				Expect(respFind.Instances.Failed[0].Error.Code).To(Equal(pb.ErrInstanceNotExists))
 				Expect(respFind.Instances.Failed[0].Indexes[0]).To(Equal(int64(0)))
 
-				By("provider does not contain 3.0.0+ versions")
-				respFind, err = discosvc.BatchFindInstances(getContext(), &pb.BatchFindInstancesRequest{
-					ConsumerServiceId: serviceId1,
-					Services: []*pb.FindService{
-						{
-							Service: &pb.MicroServiceKey{
-								AppId:       "query_instance",
-								ServiceName: "query_instance_service",
-								Version:     "3.0.0+",
-							},
-						},
-					},
-				})
-				Expect(err).To(BeNil())
-				Expect(respFind.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-				Expect(len(respFind.Services.Updated[0].Instances)).To(Equal(0))
-				Expect(respFind.Services.Updated[0].Index).To(Equal(int64(0)))
-				Expect(respFind.Services.Updated[0].Rev).ToNot(Equal(""))
-
 				By("consumer does not exist")
 				respFind, err = discosvc.BatchFindInstances(getContext(), &pb.BatchFindInstancesRequest{
 					ConsumerServiceId: "notExistServiceId",
@@ -1506,7 +1337,6 @@ var _ = Describe("'Instance' service", func() {
 							Service: &pb.MicroServiceKey{
 								AppId:       "query_instance",
 								ServiceName: "query_instance_service",
-								Version:     "2.0.0",
 							},
 						},
 					},
@@ -1519,64 +1349,33 @@ var _ = Describe("'Instance' service", func() {
 		})
 
 		Context("when query instances", func() {
-			It("should be passed", func() {
-				By("find with version rule")
+			It("without consumerID should be passed", func() {
+				By("consumerId is empty")
 				respFind, err := discosvc.FindInstances(getContext(), &pb.FindInstancesRequest{
-					ConsumerServiceId: serviceId1,
+					ConsumerServiceId: "",
 					AppId:             "query_instance",
 					ServiceName:       "query_instance_service",
-					VersionRule:       "latest",
 				})
 				Expect(err).To(BeNil())
 				Expect(respFind.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-				Expect(respFind.Instances[0].InstanceId).To(Equal(instanceId2))
+			})
 
-				respFind, err = discosvc.FindInstances(getContext(), &pb.FindInstancesRequest{
+			It("with consumerID should be passed", func() {
+				By("find with version rule")
+				respFind, err := discosvc.FindInstances(getContext(), &pb.FindInstancesRequest{
 					ConsumerServiceId: serviceId1,
 					AppId:             "query_instance",
 					ServiceName:       "query_instance_service",
-					VersionRule:       "1.0.0+",
-					Tags:              []string{},
 				})
 				Expect(err).To(BeNil())
 				Expect(respFind.Response.GetCode()).To(Equal(pb.ResponseSuccess))
 				Expect(respFind.Instances[0].InstanceId).To(Equal(instanceId2))
 
-				respFind, err = discosvc.FindInstances(getContext(), &pb.FindInstancesRequest{
-					ConsumerServiceId: serviceId1,
-					AppId:             "query_instance",
-					ServiceName:       "query_instance_service",
-					VersionRule:       "1.0.0-1.0.1",
-				})
-				Expect(err).To(BeNil())
-				Expect(respFind.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-				Expect(respFind.Instances[0].InstanceId).To(Equal(instanceId1))
-
-				respFind, err = discosvc.FindInstances(getContext(), &pb.FindInstancesRequest{
-					ConsumerServiceId: serviceId1,
-					AppId:             "query_instance",
-					ServiceName:       "query_instance_service",
-					VersionRule:       "1.0.0",
-				})
-				Expect(err).To(BeNil())
-				Expect(respFind.Response.GetCode()).To(Equal(pb.ResponseSuccess))
-				Expect(respFind.Instances[0].InstanceId).To(Equal(instanceId1))
-
-				respFind, err = discosvc.FindInstances(getContext(), &pb.FindInstancesRequest{
-					ConsumerServiceId: serviceId1,
-					AppId:             "query_instance",
-					ServiceName:       "query_instance_service",
-					VersionRule:       "0.0.0",
-				})
-				Expect(err).To(BeNil())
-				Expect(respFind.Response.GetCode()).To(Equal(pb.ErrServiceNotExists))
-
 				By("find with env")
 				respFind, err = discosvc.FindInstances(getContext(), &pb.FindInstancesRequest{
 					ConsumerServiceId: serviceId4,
 					AppId:             "query_instance",
 					ServiceName:       "query_instance_diff_env_service",
-					VersionRule:       "1.0.0",
 				})
 				Expect(err).To(BeNil())
 				Expect(respFind.Response.GetCode()).To(Equal(pb.ResponseSuccess))
@@ -1587,7 +1386,6 @@ var _ = Describe("'Instance' service", func() {
 					Environment: pb.ENV_PROD,
 					AppId:       "query_instance",
 					ServiceName: "query_instance_diff_env_service",
-					VersionRule: "1.0.0",
 				})
 				Expect(err).To(BeNil())
 				Expect(respFind.Response.GetCode()).To(Equal(pb.ResponseSuccess))
@@ -1600,7 +1398,6 @@ var _ = Describe("'Instance' service", func() {
 					ConsumerServiceId: serviceId8,
 					AppId:             "query_instance",
 					ServiceName:       "query_instance_with_rev",
-					VersionRule:       "1.0.0",
 				})
 				Expect(err).To(BeNil())
 				Expect(respFind.Response.GetCode()).To(Equal(pb.ResponseSuccess))
@@ -1613,7 +1410,6 @@ var _ = Describe("'Instance' service", func() {
 					ConsumerServiceId: serviceId8,
 					AppId:             "query_instance",
 					ServiceName:       "query_instance_with_rev",
-					VersionRule:       "1.0.0",
 				})
 				Expect(err).To(BeNil())
 				Expect(respFind.Response.GetCode()).To(Equal(pb.ResponseSuccess))
@@ -1625,7 +1421,6 @@ var _ = Describe("'Instance' service", func() {
 					ConsumerServiceId: serviceId8,
 					AppId:             "query_instance",
 					ServiceName:       "query_instance_with_rev",
-					VersionRule:       "1.0.0",
 				})
 				Expect(err).To(BeNil())
 				Expect(respFind.Response.GetCode()).To(Equal(pb.ResponseSuccess))
@@ -1637,7 +1432,6 @@ var _ = Describe("'Instance' service", func() {
 					ConsumerServiceId: serviceId3,
 					AppId:             "query_instance",
 					ServiceName:       "query_instance_service",
-					VersionRule:       "1.0.5",
 				})
 				Expect(err).To(BeNil())
 				Expect(respFind.Response.GetCode()).To(Equal(pb.ResponseSuccess))
@@ -1648,7 +1442,6 @@ var _ = Describe("'Instance' service", func() {
 					ConsumerServiceId: serviceId1,
 					AppId:             "query_instance",
 					ServiceName:       "query_instance_service",
-					VersionRule:       "latest",
 					Tags:              []string{"notexisttag"},
 				})
 				Expect(err).To(BeNil())
@@ -1668,7 +1461,6 @@ var _ = Describe("'Instance' service", func() {
 						ConsumerServiceId: serviceId6,
 						AppId:             "default",
 						ServiceName:       "query_instance_shared_provider",
-						VersionRule:       "1.0.0",
 					})
 				Expect(err).To(BeNil())
 				Expect(respFind.Response.GetCode()).To(Equal(pb.ResponseSuccess))
@@ -1679,7 +1471,6 @@ var _ = Describe("'Instance' service", func() {
 					ConsumerServiceId: serviceId7,
 					AppId:             "default",
 					ServiceName:       "query_instance_shared_provider",
-					VersionRule:       "1.0.0",
 				})
 				Expect(err).To(BeNil())
 				Expect(respFind.Response.GetCode()).To(Equal(pb.ResponseSuccess))
@@ -1705,7 +1496,6 @@ var _ = Describe("'Instance' service", func() {
 					AppId:             "query_instance_alias",
 					ServiceName:       "query_instance_alias:query_instance_alias",
 					Alias:             "query_instance_alias:query_instance_alias",
-					VersionRule:       "0.0.0.0+",
 				})
 				Expect(err).To(BeNil())
 				Expect(respFind.Response.GetCode()).To(Equal(pb.ResponseSuccess))
@@ -1724,21 +1514,24 @@ var _ = Describe("'Instance' service", func() {
 							Service: &pb.MicroServiceKey{
 								AppId:       "query_instance",
 								ServiceName: "query_instance_service",
-								Version:     "latest",
 							},
 						},
 						{
 							Service: &pb.MicroServiceKey{
 								AppId:       "query_instance",
-								ServiceName: "query_instance_service",
-								Version:     "1.0.0+",
+								ServiceName: "query_instance_diff_env_service",
 							},
 						},
 						{
 							Service: &pb.MicroServiceKey{
-								AppId:       "query_instance",
+								AppId:       "query_instance_diff_app",
 								ServiceName: "query_instance_service",
-								Version:     "0.0.0",
+							},
+						},
+						{
+							Service: &pb.MicroServiceKey{
+								AppId:       "not-exists",
+								ServiceName: "not-exists",
 							},
 						},
 					},
@@ -1746,10 +1539,11 @@ var _ = Describe("'Instance' service", func() {
 				Expect(err).To(BeNil())
 				Expect(respFind.Response.GetCode()).To(Equal(pb.ResponseSuccess))
 				Expect(respFind.Services.Updated[0].Index).To(Equal(int64(0)))
-				Expect(respFind.Services.Updated[0].Instances[0].InstanceId).To(Equal(instanceId2))
-				Expect(respFind.Services.Updated[1].Index).To(Equal(int64(1)))
-				Expect(respFind.Services.Updated[1].Instances[0].InstanceId).To(Equal(instanceId2))
-				Expect(respFind.Services.Failed[0].Indexes[0]).To(Equal(int64(2)))
+				assertInstanceContain(respFind.Services.Updated[0].Instances, instanceId1)
+				assertInstanceContain(respFind.Services.Updated[0].Instances, instanceId2)
+				Expect(respFind.Services.Updated[1].Index).To(Equal(int64(2)))
+				Expect(respFind.Services.Updated[1].Instances).To(BeEmpty())
+				Expect(len(respFind.Services.Failed[0].Indexes)).To(Equal(2))
 				Expect(respFind.Services.Failed[0].Error.Code).To(Equal(pb.ErrServiceNotExists))
 
 				By("find with env")
@@ -1760,7 +1554,6 @@ var _ = Describe("'Instance' service", func() {
 							Service: &pb.MicroServiceKey{
 								AppId:       "query_instance",
 								ServiceName: "query_instance_diff_env_service",
-								Version:     "1.0.0",
 							},
 						},
 					},
@@ -1777,7 +1570,6 @@ var _ = Describe("'Instance' service", func() {
 								Environment: pb.ENV_PROD,
 								AppId:       "query_instance",
 								ServiceName: "query_instance_diff_env_service",
-								Version:     "1.0.0",
 							},
 						},
 					},
@@ -1796,14 +1588,12 @@ var _ = Describe("'Instance' service", func() {
 							Service: &pb.MicroServiceKey{
 								AppId:       "query_instance",
 								ServiceName: "query_instance_with_rev",
-								Version:     "1.0.0",
 							},
 						},
 						{
 							Service: &pb.MicroServiceKey{
 								AppId:       "query_instance",
 								ServiceName: "batch_query_instance_with_rev",
-								Version:     "1.0.0",
 							},
 						},
 					},
@@ -1844,7 +1634,6 @@ var _ = Describe("'Instance' service", func() {
 							Service: &pb.MicroServiceKey{
 								AppId:       "query_instance",
 								ServiceName: "query_instance_with_rev",
-								Version:     "1.0.0",
 							},
 							Rev: "x",
 						},
@@ -1873,7 +1662,6 @@ var _ = Describe("'Instance' service", func() {
 							Service: &pb.MicroServiceKey{
 								AppId:       "query_instance",
 								ServiceName: "query_instance_with_rev",
-								Version:     "1.0.0",
 							},
 							Rev: rev,
 						},
@@ -1901,7 +1689,6 @@ var _ = Describe("'Instance' service", func() {
 							Service: &pb.MicroServiceKey{
 								AppId:       "query_instance",
 								ServiceName: "query_instance_service",
-								Version:     "1.0.5",
 							},
 						},
 					},
@@ -1926,7 +1713,6 @@ var _ = Describe("'Instance' service", func() {
 								Service: &pb.MicroServiceKey{
 									AppId:       "default",
 									ServiceName: "query_instance_shared_provider",
-									Version:     "1.0.0",
 								},
 							},
 						},
@@ -1943,7 +1729,6 @@ var _ = Describe("'Instance' service", func() {
 							Service: &pb.MicroServiceKey{
 								AppId:       "default",
 								ServiceName: "query_instance_shared_provider",
-								Version:     "1.0.0",
 							},
 						},
 					},
@@ -2306,3 +2091,14 @@ var _ = Describe("'Instance' service", func() {
 		})
 	})
 })
+
+func assertInstanceContain(instances []*pb.MicroServiceInstance, instanceID string) {
+	found := false
+	for _, instance := range instances {
+		if instance.InstanceId == instanceID {
+			found = true
+			break
+		}
+	}
+	Expect(found).To(BeTrue())
+}
diff --git a/server/service/disco/microservice_test.go b/server/service/disco/microservice_test.go
index 8badaad..9230ffc 100644
--- a/server/service/disco/microservice_test.go
+++ b/server/service/disco/microservice_test.go
@@ -868,6 +868,30 @@ var _ = Describe("'Micro-service' service", func() {
 				})
 				Expect(err).To(BeNil())
 				Expect(resp.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
+				resp, err = serviceResource.Exist(getContext(), &pb.GetExistenceRequest{
+					Type:        "microservice",
+					AppId:       "exist_appId",
+					ServiceName: "exist_service",
+					Version:     "0.0.0-1.0.0",
+				})
+				Expect(err).To(BeNil())
+				Expect(resp.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
+				resp, err = serviceResource.Exist(getContext(), &pb.GetExistenceRequest{
+					Type:        "microservice",
+					AppId:       "exist_appId",
+					ServiceName: "exist_service",
+					Version:     "0.0.0+",
+				})
+				Expect(err).To(BeNil())
+				Expect(resp.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
+				resp, err = serviceResource.Exist(getContext(), &pb.GetExistenceRequest{
+					Type:        "microservice",
+					AppId:       "exist_appId",
+					ServiceName: "exist_service",
+					Version:     "latest",
+				})
+				Expect(err).To(BeNil())
+				Expect(resp.Response.GetCode()).To(Equal(pb.ErrInvalidParams))
 			})
 		})
 
@@ -913,14 +937,6 @@ var _ = Describe("'Micro-service' service", func() {
 					Version:     "2.0.0",
 				})
 				Expect(err).To(BeNil())
-				Expect(resp.Response.GetCode()).To(Equal(pb.ErrServiceNotExists))
-				resp, err = serviceResource.Exist(getContext(), &pb.GetExistenceRequest{
-					Type:        "microservice",
-					AppId:       "exist_appId",
-					ServiceName: "exist_service",
-					Version:     "0.0.0-1.0.0",
-				})
-				Expect(err).To(BeNil())
 				Expect(resp.Response.GetCode()).To(Equal(pb.ErrServiceVersionNotExists))
 			})
 		})
@@ -968,36 +984,6 @@ var _ = Describe("'Micro-service' service", func() {
 				})
 				Expect(err).To(BeNil())
 				Expect(resp.ServiceId).To(Equal(serviceId2))
-
-				By("search with latest versionRule")
-				resp, err = serviceResource.Exist(getContext(), &pb.GetExistenceRequest{
-					Type:        "microservice",
-					AppId:       "exist_appId",
-					ServiceName: "exist_service",
-					Version:     "latest",
-				})
-				Expect(err).To(BeNil())
-				Expect(resp.ServiceId).To(Equal(serviceId1))
-
-				By("search with 1.0.0+ versionRule")
-				resp, err = serviceResource.Exist(getContext(), &pb.GetExistenceRequest{
-					Type:        "microservice",
-					AppId:       "exist_appId",
-					ServiceName: "exist_service",
-					Version:     "1.0.0+",
-				})
-				Expect(err).To(BeNil())
-				Expect(resp.ServiceId).To(Equal(serviceId1))
-
-				By("search with range versionRule")
-				resp, err = serviceResource.Exist(getContext(), &pb.GetExistenceRequest{
-					Type:        "microservice",
-					AppId:       "exist_appId",
-					ServiceName: "exist_service",
-					Version:     "0.9.1-1.0.1",
-				})
-				Expect(err).To(BeNil())
-				Expect(resp.ServiceId).To(Equal(serviceId1))
 			})
 		})
 	})
@@ -1192,7 +1178,6 @@ var _ = Describe("'Micro-service' service", func() {
 				ConsumerServiceId: serviceConsumerId,
 				AppId:             provider.AppId,
 				ServiceName:       provider.ServiceName,
-				VersionRule:       provider.Version,
 			})
 			Expect(err).To(BeNil())
 			Expect(respFind.Response.GetCode()).To(Equal(pb.ResponseSuccess))
diff --git a/server/service/disco/tag_test.go b/server/service/disco/tag_test.go
index 7483d50..9b2193c 100644
--- a/server/service/disco/tag_test.go
+++ b/server/service/disco/tag_test.go
@@ -368,7 +368,6 @@ var _ = Describe("'Tag' service", func() {
 					ConsumerServiceId: consumerId,
 					AppId:             "find_inst_tag_group",
 					ServiceName:       "find_inst_tag_provider",
-					VersionRule:       "1.0.0+",
 					Tags:              []string{"not-exist-tag"},
 				})
 				Expect(err).To(BeNil())
@@ -379,7 +378,6 @@ var _ = Describe("'Tag' service", func() {
 					ConsumerServiceId: consumerId,
 					AppId:             "find_inst_tag_group",
 					ServiceName:       "find_inst_tag_provider",
-					VersionRule:       "1.0.0+",
 					Tags:              []string{"filter_tag"},
 				})
 				Expect(err).To(BeNil())
diff --git a/server/service/validator/dependency_validator.go b/server/service/validator/dependency_validator.go
deleted file mode 100644
index 024c860..0000000
--- a/server/service/validator/dependency_validator.go
+++ /dev/null
@@ -1,76 +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 validator
-
-import (
-	"regexp"
-
-	"github.com/apache/servicecomb-service-center/pkg/validate"
-)
-
-var (
-	addDependenciesReqValidator       validate.Validator
-	overwriteDependenciesReqValidator validate.Validator
-)
-
-var (
-	nameFuzzyRegex, _         = regexp.Compile(`^[a-zA-Z0-9]*$|^[a-zA-Z0-9][a-zA-Z0-9_\-.]*[a-zA-Z0-9]$|^\*$`)
-	versionAllowEmptyRegex, _ = regexp.Compile(`^(^\d+(\.\d+){0,2}\+?$|^\d+(\.\d+){0,2}-\d+(\.\d+){0,2}$|^latest$)?$`)
-)
-
-func defaultDependencyValidator() *validate.Validator {
-	appIDRule := *(MicroServiceKeyValidator().GetRule("AppId"))
-	appIDRule.Min = 0
-	serviceNameRule := *(MicroServiceKeyValidator().GetRule("ServiceName"))
-	serviceNameRule.Regexp = nameFuzzyRegex
-	versionRule := &validate.Rule{Max: 128, Regexp: &validate.VersionRegexp{Fuzzy: true, Regex: versionAllowEmptyRegex}}
-
-	var (
-		consumerMsValidator validate.Validator
-		providerMsValidator validate.Validator
-	)
-	consumerMsValidator.AddRules(MicroServiceKeyValidator().GetRules())
-
-	providerMsValidator.AddRules(MicroServiceKeyValidator().GetRules())
-	providerMsValidator.AddRule("AppId", &appIDRule)
-	providerMsValidator.AddRule("ServiceName", &serviceNameRule)
-	providerMsValidator.AddRule("Version", versionRule)
-
-	var dependenciesValidator validate.Validator
-	dependenciesValidator.AddRule("Consumer", &validate.Rule{Min: 1})
-	dependenciesValidator.AddSub("Consumer", &consumerMsValidator)
-	dependenciesValidator.AddSub("Providers", &providerMsValidator)
-
-	return &dependenciesValidator
-}
-
-func AddDependenciesReqValidator() *validate.Validator {
-	return addDependenciesReqValidator.Init(func(v *validate.Validator) {
-		dep := defaultDependencyValidator()
-		dep.AddRule("Providers", &validate.Rule{Min: 1})
-		v.AddRule("Dependencies", &validate.Rule{Min: 1, Max: 100})
-		v.AddSub("Dependencies", dep)
-	})
-}
-
-func CreateDependenciesReqValidator() *validate.Validator {
-	return overwriteDependenciesReqValidator.Init(func(v *validate.Validator) {
-		v.AddRule("Dependencies", &validate.Rule{Min: 1, Max: 100})
-		v.AddSub("Dependencies", defaultDependencyValidator())
-	})
-}
diff --git a/server/service/validator/instance_validator.go b/server/service/validator/instance_validator.go
index 78fcb02..09a9a20 100644
--- a/server/service/validator/instance_validator.go
+++ b/server/service/validator/instance_validator.go
@@ -52,10 +52,8 @@ var (
 func FindInstanceReqValidator() *validate.Validator {
 	return findInstanceReqValidator.Init(func(v *validate.Validator) {
 		v.AddRule("ConsumerServiceId", GetInstanceReqValidator().GetRule("ConsumerServiceId"))
-		v.AddRules(ExistenceReqValidator().GetRules())
-		v.AddRule("VersionRule", ExistenceReqValidator().GetRule("Version"))
+		v.AddRules(MicroServiceSearchKeyValidator().GetRules())
 		v.AddRule("Tags", UpdateTagReqValidator().GetRule("Key"))
-		v.AddRule("Environment", MicroServiceKeyValidator().GetRule("Environment"))
 	})
 }
 
@@ -63,7 +61,7 @@ func BatchFindInstanceReqValidator() *validate.Validator {
 	return batchFindInstanceReqValidator.Init(func(v *validate.Validator) {
 		var findServiceValidator validate.Validator
 		findServiceValidator.AddRule("Service", &validate.Rule{Min: 1})
-		findServiceValidator.AddSub("Service", ExistenceReqValidator())
+		findServiceValidator.AddSub("Service", MicroServiceSearchKeyValidator())
 		var findInstanceValidator validate.Validator
 		findInstanceValidator.AddRule("Instance", &validate.Rule{Min: 1})
 		findInstanceValidator.AddSub("Instance", HeartbeatReqValidator())
diff --git a/server/service/validator/microservice_validator.go b/server/service/validator/microservice_validator.go
index d02f170..486721f 100644
--- a/server/service/validator/microservice_validator.go
+++ b/server/service/validator/microservice_validator.go
@@ -28,6 +28,7 @@ import (
 
 var (
 	microServiceKeyValidator       validate.Validator
+	microServiceKeySearchValidator validate.Validator
 	existenceReqValidator          validate.Validator
 	getServiceReqValidator         validate.Validator
 	createServiceReqValidator      validate.Validator
@@ -40,9 +41,7 @@ var (
 	// find 支持alias,多个:
 	serviceNameForFindRegex, _ = regexp.Compile(`^[a-zA-Z0-9]*$|^[a-zA-Z0-9][a-zA-Z0-9_\-.:]*[a-zA-Z0-9]$`)
 	// version規則: x[.y[.z]]
-	versionRegex = validate.NewVersionRegexp(false)
-	// version模糊规则: 1.0, 1.0+, 1.0-2.0, latest
-	versionFuzzyRegex  = validate.NewVersionRegexp(true)
+	versionRegex       = validate.NewVersionRegexp(false)
 	pathRegex, _       = regexp.Compile(`^[A-Za-z0-9.,?'\\/+&amp;%$#=~_\-@{}]*$`)
 	levelRegex, _      = regexp.Compile(`^(FRONT|MIDDLE|BACK)$`)
 	statusRegex, _     = regexp.Compile("^(" + discovery.MS_UP + "|" + discovery.MS_DOWN + ")?$")
@@ -65,11 +64,19 @@ func MicroServiceKeyValidator() *validate.Validator {
 	})
 }
 
+func MicroServiceSearchKeyValidator() *validate.Validator {
+	return microServiceKeySearchValidator.Init(func(v *validate.Validator) {
+		v.AddRule("Environment", &validate.Rule{Regexp: envRegex})
+		v.AddRule("AppId", &validate.Rule{Min: 1, Max: 160, Regexp: nameRegex})
+		// support name or alias
+		v.AddRule("ServiceName", &validate.Rule{Min: 1, Max: 160 + 1 + 128, Regexp: serviceNameForFindRegex})
+	})
+}
+
 func ExistenceReqValidator() *validate.Validator {
 	return existenceReqValidator.Init(func(v *validate.Validator) {
-		v.AddRules(MicroServiceKeyValidator().GetRules())
-		v.AddRule("ServiceName", &validate.Rule{Min: 1, Max: 160 + 1 + 128, Regexp: serviceNameForFindRegex})
-		v.AddRule("Version", &validate.Rule{Min: 1, Max: 129, Regexp: versionFuzzyRegex})
+		v.AddRules(MicroServiceSearchKeyValidator().GetRules())
+		v.AddRule("Version", &validate.Rule{Min: 1, Max: 64, Regexp: versionRegex})
 	})
 }
 
diff --git a/server/service/validator/validator.go b/server/service/validator/validator.go
index 02cf2c3..7e0f10f 100644
--- a/server/service/validator/validator.go
+++ b/server/service/validator/validator.go
@@ -51,6 +51,7 @@ func init() {
 	accountLoginValidator.AddRule("TokenExpirationTime", &validate.Rule{Regexp: &validate.TokenExpirationTimeChecker{}})
 }
 
+// deprecated use the ValidateXXX func instead, e.g. rbac_validator.go
 func Validate(v interface{}) error {
 	err := baseCheck(v)
 	if err != nil {
@@ -65,10 +66,6 @@ func Validate(v interface{}) error {
 		return GetServiceReqValidator().Validate(v)
 	case *pb.UpdateServicePropsRequest:
 		return UpdateServicePropsReqValidator().Validate(v)
-	case *pb.CreateDependenciesRequest:
-		return CreateDependenciesReqValidator().Validate(v)
-	case *pb.AddDependenciesRequest:
-		return AddDependenciesReqValidator().Validate(v)
 	case *pb.GetServiceTagsRequest:
 		return GetTagsReqValidator().Validate(v)
 	case *pb.AddServiceTagsRequest: