diff --git a/cluster/cluster_impl/broadcast_cluster.go b/cluster/cluster_impl/broadcast_cluster.go
index ba454af6a8553f31b72b1d30ef5f44ec7a8278d2..024cf4f533b91937ca998136d48e6b147bab03b7 100644
--- a/cluster/cluster_impl/broadcast_cluster.go
+++ b/cluster/cluster_impl/broadcast_cluster.go
@@ -39,6 +39,7 @@ func NewBroadcastCluster() cluster.Cluster {
 	return &broadcastCluster{}
 }
 
+// Join would return baseClusterInvoker instance
 func (cluster *broadcastCluster) Join(directory cluster.Directory) protocol.Invoker {
 	return newBroadcastClusterInvoker(directory)
 }
diff --git a/cluster/cluster_impl/failback_cluster.go b/cluster/cluster_impl/failback_cluster.go
index 432e33122c2ee599bc848ca9ab1842084da5ef68..589b6bfc46993ba680a0eaa11fba6d45306dd865 100644
--- a/cluster/cluster_impl/failback_cluster.go
+++ b/cluster/cluster_impl/failback_cluster.go
@@ -39,6 +39,7 @@ func NewFailbackCluster() cluster.Cluster {
 	return &failbackCluster{}
 }
 
+// Join would return baseClusterInvoker instance
 func (cluster *failbackCluster) Join(directory cluster.Directory) protocol.Invoker {
 	return newFailbackClusterInvoker(directory)
 }
diff --git a/cluster/cluster_impl/failback_cluster_invoker.go b/cluster/cluster_impl/failback_cluster_invoker.go
index af17a93756a6f558c7da063eec9d8052b83cbe69..62f48045ec6edbc19d6603509fa1ae8c2d4ce9ee 100644
--- a/cluster/cluster_impl/failback_cluster_invoker.go
+++ b/cluster/cluster_impl/failback_cluster_invoker.go
@@ -126,6 +126,7 @@ func (invoker *failbackClusterInvoker) checkRetry(retryTask *retryTimerTask, err
 	}
 }
 
+// nolint
 func (invoker *failbackClusterInvoker) Invoke(ctx context.Context, invocation protocol.Invocation) protocol.Result {
 	invokers := invoker.directory.List(invocation)
 	if err := invoker.checkInvokers(invokers, invocation); err != nil {
diff --git a/cluster/cluster_impl/failfast_cluster.go b/cluster/cluster_impl/failfast_cluster.go
index ac9ec6b821c1d0333c73fae56169d5bc8256ec5b..d8b7e9543bd7e02f9aef20530f3e5dbf3076a0f1 100644
--- a/cluster/cluster_impl/failfast_cluster.go
+++ b/cluster/cluster_impl/failfast_cluster.go
@@ -39,6 +39,7 @@ func NewFailFastCluster() cluster.Cluster {
 	return &failfastCluster{}
 }
 
+// Join would return baseClusterInvoker instance
 func (cluster *failfastCluster) Join(directory cluster.Directory) protocol.Invoker {
 	return newFailFastClusterInvoker(directory)
 }
diff --git a/cluster/cluster_impl/failfast_cluster_invoker.go b/cluster/cluster_impl/failfast_cluster_invoker.go
index 3b4dc9b721720948cf635f57191d1e6bce023a1e..d71ef5f5a1dfed2d29f6ae4f29fb08d34aae9c5d 100644
--- a/cluster/cluster_impl/failfast_cluster_invoker.go
+++ b/cluster/cluster_impl/failfast_cluster_invoker.go
@@ -35,6 +35,7 @@ func newFailFastClusterInvoker(directory cluster.Directory) protocol.Invoker {
 	}
 }
 
+// nolint
 func (invoker *failfastClusterInvoker) Invoke(ctx context.Context, invocation protocol.Invocation) protocol.Result {
 	invokers := invoker.directory.List(invocation)
 	err := invoker.checkInvokers(invokers, invocation)
diff --git a/cluster/cluster_impl/failover_cluster.go b/cluster/cluster_impl/failover_cluster.go
index d30a743e034dafabad87381cdaa356e7603b74d1..ecc3596f8ac4602ad8508bfdc99726688e61e6d5 100644
--- a/cluster/cluster_impl/failover_cluster.go
+++ b/cluster/cluster_impl/failover_cluster.go
@@ -40,6 +40,7 @@ func NewFailoverCluster() cluster.Cluster {
 	return &failoverCluster{}
 }
 
+// Join would return baseClusterInvoker instance
 func (cluster *failoverCluster) Join(directory cluster.Directory) protocol.Invoker {
 	return newFailoverClusterInvoker(directory)
 }
diff --git a/cluster/cluster_impl/failover_cluster_invoker.go b/cluster/cluster_impl/failover_cluster_invoker.go
index 66adabd1043d6e5d770704774dda22ba9e6faebe..2ce393cc3c84479b95d5df3d7e8ab47c0ca07e74 100644
--- a/cluster/cluster_impl/failover_cluster_invoker.go
+++ b/cluster/cluster_impl/failover_cluster_invoker.go
@@ -44,6 +44,7 @@ func newFailoverClusterInvoker(directory cluster.Directory) protocol.Invoker {
 	}
 }
 
+// nolint
 func (invoker *failoverClusterInvoker) Invoke(ctx context.Context, invocation protocol.Invocation) protocol.Result {
 	var (
 		result    protocol.Result
diff --git a/cluster/cluster_impl/failover_cluster_test.go b/cluster/cluster_impl/failover_cluster_test.go
index e05b79202cd202334db1c19421e3163ee28bac26..d3ac2c8a5ffd7fce647649c53fe343ba93999636 100644
--- a/cluster/cluster_impl/failover_cluster_test.go
+++ b/cluster/cluster_impl/failover_cluster_test.go
@@ -43,6 +43,7 @@ import (
 // mock invoker
 // ///////////////////////////
 
+// nolint
 type MockInvoker struct {
 	url       common.URL
 	available bool
@@ -51,6 +52,7 @@ type MockInvoker struct {
 	successCount int
 }
 
+// nolint
 func NewMockInvoker(url common.URL, successCount int) *MockInvoker {
 	return &MockInvoker{
 		url:          url,
@@ -60,23 +62,28 @@ func NewMockInvoker(url common.URL, successCount int) *MockInvoker {
 	}
 }
 
+// nolint
 func (bi *MockInvoker) GetUrl() common.URL {
 	return bi.url
 }
 
+// nolint
 func (bi *MockInvoker) IsAvailable() bool {
 	return bi.available
 }
 
+// nolint
 func (bi *MockInvoker) IsDestroyed() bool {
 	return bi.destroyed
 }
 
+// nolint
 type rest struct {
 	tried   int
 	success bool
 }
 
+// nolint
 func (bi *MockInvoker) Invoke(c context.Context, invocation protocol.Invocation) protocol.Result {
 	count++
 	var (
@@ -93,14 +100,17 @@ func (bi *MockInvoker) Invoke(c context.Context, invocation protocol.Invocation)
 	return result
 }
 
+// nolint
 func (bi *MockInvoker) Destroy() {
 	logger.Infof("Destroy invoker: %v", bi.GetUrl().String())
 	bi.destroyed = true
 	bi.available = false
 }
 
+// nolint
 var count int
 
+// nolint
 func normalInvoke(successCount int, urlParam url.Values, invocations ...*invocation.RPCInvocation) protocol.Result {
 	extension.SetLoadbalance("random", loadbalance.NewRandomLoadBalance)
 	failoverCluster := NewFailoverCluster()
@@ -119,6 +129,7 @@ func normalInvoke(successCount int, urlParam url.Values, invocations ...*invocat
 	return clusterInvoker.Invoke(context.Background(), &invocation.RPCInvocation{})
 }
 
+// nolint
 func TestFailoverInvokeSuccess(t *testing.T) {
 	urlParams := url.Values{}
 	result := normalInvoke(3, urlParams)
@@ -126,6 +137,7 @@ func TestFailoverInvokeSuccess(t *testing.T) {
 	count = 0
 }
 
+// nolint
 func TestFailoverInvokeFail(t *testing.T) {
 	urlParams := url.Values{}
 	result := normalInvoke(4, urlParams)
@@ -133,6 +145,7 @@ func TestFailoverInvokeFail(t *testing.T) {
 	count = 0
 }
 
+// nolint
 func TestFailoverInvoke1(t *testing.T) {
 	urlParams := url.Values{}
 	urlParams.Set(constant.RETRIES_KEY, "3")
@@ -141,6 +154,7 @@ func TestFailoverInvoke1(t *testing.T) {
 	count = 0
 }
 
+// nolint
 func TestFailoverInvoke2(t *testing.T) {
 	urlParams := url.Values{}
 	urlParams.Set(constant.RETRIES_KEY, "2")
@@ -152,6 +166,7 @@ func TestFailoverInvoke2(t *testing.T) {
 	count = 0
 }
 
+// nolint
 func TestFailoverDestroy(t *testing.T) {
 	extension.SetLoadbalance("random", loadbalance.NewRandomLoadBalance)
 	failoverCluster := NewFailoverCluster()
diff --git a/cluster/cluster_impl/failsafe_cluster.go b/cluster/cluster_impl/failsafe_cluster.go
index f708b7fb9108bdd17fec5dc68dc1e4249c8199d4..25f42dd0a9d534f904f73ba97ae6174c3b954aec 100644
--- a/cluster/cluster_impl/failsafe_cluster.go
+++ b/cluster/cluster_impl/failsafe_cluster.go
@@ -39,6 +39,7 @@ func NewFailsafeCluster() cluster.Cluster {
 	return &failsafeCluster{}
 }
 
+// Join would return baseClusterInvoker instance
 func (cluster *failsafeCluster) Join(directory cluster.Directory) protocol.Invoker {
 	return newFailsafeClusterInvoker(directory)
 }
diff --git a/cluster/cluster_impl/failsafe_cluster_invoker.go b/cluster/cluster_impl/failsafe_cluster_invoker.go
index 4d8fe27719eb71fa287fe4142d8e92ca17acfba4..27c59fff18d4a93fc693d7edbca467e0ffef549a 100644
--- a/cluster/cluster_impl/failsafe_cluster_invoker.go
+++ b/cluster/cluster_impl/failsafe_cluster_invoker.go
@@ -45,6 +45,7 @@ func newFailsafeClusterInvoker(directory cluster.Directory) protocol.Invoker {
 	}
 }
 
+// nolint
 func (invoker *failsafeClusterInvoker) Invoke(ctx context.Context, invocation protocol.Invocation) protocol.Result {
 	invokers := invoker.directory.List(invocation)
 
diff --git a/cluster/cluster_impl/forking_cluster.go b/cluster/cluster_impl/forking_cluster.go
index 0e6cd26882788a1f897d0d4dc8e0d4eb0a9d4218..9dd366d0b5b31f538b16d42ecbcff4bd4854f425 100644
--- a/cluster/cluster_impl/forking_cluster.go
+++ b/cluster/cluster_impl/forking_cluster.go
@@ -39,6 +39,7 @@ func NewForkingCluster() cluster.Cluster {
 	return &forkingCluster{}
 }
 
+// Join would return baseClusterInvoker instance
 func (cluster *forkingCluster) Join(directory cluster.Directory) protocol.Invoker {
 	return newForkingClusterInvoker(directory)
 }
diff --git a/cluster/cluster_impl/forking_cluster_invoker.go b/cluster/cluster_impl/forking_cluster_invoker.go
index a5a3f2ec6605dfb843fab09dff0a53000bbc3298..168444881653ca38ef61a9bc8e50f2d4bc3e624c 100644
--- a/cluster/cluster_impl/forking_cluster_invoker.go
+++ b/cluster/cluster_impl/forking_cluster_invoker.go
@@ -44,7 +44,7 @@ func newForkingClusterInvoker(directory cluster.Directory) protocol.Invoker {
 	}
 }
 
-// Invoke ...
+// nolint
 func (invoker *forkingClusterInvoker) Invoke(ctx context.Context, invocation protocol.Invocation) protocol.Result {
 	if err := invoker.checkWhetherDestroyed(); err != nil {
 		return &protocol.RPCResult{Err: err}
diff --git a/cluster/cluster_impl/mock_cluster.go b/cluster/cluster_impl/mock_cluster.go
index d887cfb45b9c92c859b1396046c1c1c73d46b295..a7fa5d4f02087d4ec8ee0e011c09b11805f79a3f 100644
--- a/cluster/cluster_impl/mock_cluster.go
+++ b/cluster/cluster_impl/mock_cluster.go
@@ -33,6 +33,7 @@ func NewMockCluster() cluster.Cluster {
 	return &mockCluster{}
 }
 
+// nolint
 func (cluster *mockCluster) Join(directory cluster.Directory) protocol.Invoker {
 	return protocol.NewBaseInvoker(directory.GetUrl())
 }
diff --git a/cluster/cluster_impl/registry_aware_cluster.go b/cluster/cluster_impl/registry_aware_cluster.go
index fcefa52862a39eece98dca8660e62d9ca144e955..f4c08973713e6b3736b4ca1ed0d6e5275cf61d01 100644
--- a/cluster/cluster_impl/registry_aware_cluster.go
+++ b/cluster/cluster_impl/registry_aware_cluster.go
@@ -34,6 +34,7 @@ func NewRegistryAwareCluster() cluster.Cluster {
 	return &registryAwareCluster{}
 }
 
+// nolint
 func (cluster *registryAwareCluster) Join(directory cluster.Directory) protocol.Invoker {
 	return newRegistryAwareClusterInvoker(directory)
 }
diff --git a/cluster/cluster_impl/registry_aware_cluster_invoker.go b/cluster/cluster_impl/registry_aware_cluster_invoker.go
index cded5bf16432e6b0c590e15b81c28369889a5f88..7840da5218090a995298e718a4bbce9d7f5480b4 100644
--- a/cluster/cluster_impl/registry_aware_cluster_invoker.go
+++ b/cluster/cluster_impl/registry_aware_cluster_invoker.go
@@ -36,6 +36,7 @@ func newRegistryAwareClusterInvoker(directory cluster.Directory) protocol.Invoke
 	}
 }
 
+// nolint
 func (invoker *registryAwareClusterInvoker) Invoke(ctx context.Context, invocation protocol.Invocation) protocol.Result {
 	invokers := invoker.directory.List(invocation)
 	//First, pick the invoker (XXXClusterInvoker) that comes from the local registry, distinguish by a 'default' key.
diff --git a/cluster/loadbalance/consistent_hash.go b/cluster/loadbalance/consistent_hash.go
index 84fbb268c7a8ec32f007a734e2d6da56ef3c6d25..3266b4f11c6730bb0af3b3875eef691deb1e4d29 100644
--- a/cluster/loadbalance/consistent_hash.go
+++ b/cluster/loadbalance/consistent_hash.go
@@ -157,6 +157,7 @@ func (c *ConsistentHashSelector) selectForKey(hash uint32) protocol.Invoker {
 	return c.virtualInvokers[c.keys[idx]]
 }
 
+// nolint
 func (c *ConsistentHashSelector) hash(digest [16]byte, i int) uint32 {
 	return uint32((digest[3+i*4]&0xFF)<<24) | uint32((digest[2+i*4]&0xFF)<<16) |
 		uint32((digest[1+i*4]&0xFF)<<8) | uint32(digest[i*4]&0xFF)&0xFFFFFFF
diff --git a/cluster/loadbalance/least_active.go b/cluster/loadbalance/least_active.go
index 37ad91c3ed6b44370820a989b7af8ccaa82c48a2..87767359a94c29c9aa83ae1fa5b042d7bac2548b 100644
--- a/cluster/loadbalance/least_active.go
+++ b/cluster/loadbalance/least_active.go
@@ -46,6 +46,7 @@ func NewLeastActiveLoadBalance() cluster.LoadBalance {
 	return &leastActiveLoadBalance{}
 }
 
+// Select gets invoker based on least active load balancing strategy
 func (lb *leastActiveLoadBalance) Select(invokers []protocol.Invoker, invocation protocol.Invocation) protocol.Invoker {
 	count := len(invokers)
 	if count == 0 {
diff --git a/cluster/loadbalance/round_robin.go b/cluster/loadbalance/round_robin.go
index c44b239dbcbcc744f47ca3c97128f92567e32a78..8d1324e27ad6037b586095ce3f3425bc145fca89 100644
--- a/cluster/loadbalance/round_robin.go
+++ b/cluster/loadbalance/round_robin.go
@@ -59,6 +59,7 @@ func NewRoundRobinLoadBalance() cluster.LoadBalance {
 	return &roundRobinLoadBalance{}
 }
 
+// Select gets invoker based on round robin load balancing strategy
 func (lb *roundRobinLoadBalance) Select(invokers []protocol.Invoker, invocation protocol.Invocation) protocol.Invoker {
 	count := len(invokers)
 	if count == 0 {
diff --git a/cluster/router/healthcheck/factory_test.go b/cluster/router/healthcheck/factory_test.go
index c3a26a93896e185f0dea3732ca5afcf7687ad5ea..e80fd4c4d38dbb1c0f2b14ba1e22971249bc54b6 100644
--- a/cluster/router/healthcheck/factory_test.go
+++ b/cluster/router/healthcheck/factory_test.go
@@ -31,34 +31,43 @@ import (
 	"github.com/apache/dubbo-go/protocol"
 )
 
+// nolint
 type MockInvoker struct {
 	url common.URL
 }
 
+// nolint
 func NewMockInvoker(url common.URL) *MockInvoker {
 	return &MockInvoker{
 		url: url,
 	}
 }
 
+// nolint
 func (bi *MockInvoker) GetUrl() common.URL {
 	return bi.url
 }
+
+// nolint
 func (bi *MockInvoker) IsAvailable() bool {
 	return true
 }
 
+// nolint
 func (bi *MockInvoker) IsDestroyed() bool {
 	return true
 }
 
+// nolint
 func (bi *MockInvoker) Invoke(_ context.Context, _ protocol.Invocation) protocol.Result {
 	return nil
 }
 
+// nolint
 func (bi *MockInvoker) Destroy() {
 }
 
+// nolint
 func TestHealthCheckRouteFactory(t *testing.T) {
 	factory := newHealthCheckRouteFactory()
 	assert.NotNil(t, factory)
diff --git a/cluster/router/tag/tag_router.go b/cluster/router/tag/tag_router.go
index 87da418943e90c63a905f35260ada7880d6f51b9..74f51075c7896177884e16f9736ebcf21262f112 100644
--- a/cluster/router/tag/tag_router.go
+++ b/cluster/router/tag/tag_router.go
@@ -31,12 +31,14 @@ import (
 	"github.com/apache/dubbo-go/protocol"
 )
 
+// tagRouter defines url, enable and the priority
 type tagRouter struct {
 	url      *common.URL
 	enabled  bool
 	priority int64
 }
 
+// NewTagRouter would return tagRouter instance if url is not nil
 func NewTagRouter(url *common.URL) (*tagRouter, error) {
 	if url == nil {
 		return nil, perrors.Errorf("Illegal route URL!")
@@ -48,10 +50,12 @@ func NewTagRouter(url *common.URL) (*tagRouter, error) {
 	}, nil
 }
 
+// nolint
 func (c *tagRouter) isEnabled() bool {
 	return c.enabled
 }
 
+// Route gets a list of invoker
 func (c *tagRouter) Route(invokers []protocol.Invoker, url *common.URL, invocation protocol.Invocation) []protocol.Invoker {
 	if !c.isEnabled() {
 		return invokers
@@ -62,14 +66,17 @@ func (c *tagRouter) Route(invokers []protocol.Invoker, url *common.URL, invocati
 	return filterUsingStaticTag(invokers, url, invocation)
 }
 
+// URL gets the url of tagRouter
 func (c *tagRouter) URL() common.URL {
 	return *c.url
 }
 
+// Priority gets the priority of tagRouter
 func (c *tagRouter) Priority() int64 {
 	return c.priority
 }
 
+// filterUsingStaticTag gets a list of invoker using static tag
 func filterUsingStaticTag(invokers []protocol.Invoker, url *common.URL, invocation protocol.Invocation) []protocol.Invoker {
 	if tag, ok := invocation.Attachments()[constant.Tagkey]; ok {
 		result := make([]protocol.Invoker, 0, 8)
@@ -86,6 +93,7 @@ func filterUsingStaticTag(invokers []protocol.Invoker, url *common.URL, invocati
 	return invokers
 }
 
+// isForceUseTag returns whether force use tag
 func isForceUseTag(url *common.URL, invocation protocol.Invocation) bool {
 	if b, e := strconv.ParseBool(invocation.AttachmentsByKey(constant.ForceUseTag, url.GetParam(constant.ForceUseTag, "false"))); e == nil {
 		return b