You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by la...@apache.org on 2021/11/19 13:56:46 UTC

[dubbo-go] branch 3.0 updated: [fix #1590] filter single instance (#1591)

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

laurence pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git


The following commit(s) were added to refs/heads/3.0 by this push:
     new df9f3f9  [fix #1590] filter single instance (#1591)
df9f3f9 is described below

commit df9f3f925cd5d852e60a53cfcb7c4cd3befd9773
Author: wangxw <24...@qq.com>
AuthorDate: Fri Nov 19 21:56:40 2021 +0800

    [fix #1590] filter single instance (#1591)
    
    * filter single instance
    
    * filter single instance
    
    Co-authored-by: wangxiaowei14227 <wa...@autohome.com.cn>
---
 filter/accesslog/filter.go                    | 30 ++++++++++------
 filter/active/filter.go                       | 26 ++++++++++----
 filter/active/filter_test.go                  |  4 +--
 filter/auth/accesskey_storage.go              | 25 ++++++++++----
 filter/auth/accesskey_storage_test.go         |  2 +-
 filter/auth/consumer_sign_filter.go           | 32 ++++++++++-------
 filter/auth/consumer_sign_filter_test.go      |  2 +-
 filter/auth/default_authenticator.go          | 27 +++++++++++----
 filter/auth/default_authenticator_test.go     |  4 +--
 filter/auth/provider_auth_filter.go           | 30 +++++++++++-----
 filter/auth/provider_auth_filter_test.go      |  2 +-
 filter/echo/filter.go                         | 27 ++++++++++-----
 filter/echo/filter_test.go                    |  2 +-
 filter/{execlmt => exec_limit}/filter.go      | 40 +++++++++++-----------
 filter/{execlmt => exec_limit}/filter_test.go |  2 +-
 filter/filter_impl/import.go                  |  2 +-
 filter/generic/filter.go                      | 27 +++++++++++----
 filter/generic/filter_test.go                 |  4 +--
 filter/generic/service_filter.go              | 26 ++++++++++----
 filter/generic/service_filter_test.go         |  4 +--
 filter/seata/filter.go                        | 30 +++++++++++-----
 filter/seata/filter_test.go                   |  2 +-
 filter/sentinel/filter.go                     | 49 ++++++++++++++++++++-------
 filter/sentinel/filter_test.go                |  6 ++--
 filter/token/filter.go                        | 27 +++++++++++----
 filter/token/filter_test.go                   |  8 ++---
 filter/tps/filter.go                          | 25 ++++++++++----
 filter/tps/filter_test.go                     |  6 ++--
 imports/imports.go                            |  2 +-
 29 files changed, 322 insertions(+), 151 deletions(-)

diff --git a/filter/accesslog/filter.go b/filter/accesslog/filter.go
index 21d2a80..94a5a65 100644
--- a/filter/accesslog/filter.go
+++ b/filter/accesslog/filter.go
@@ -22,6 +22,7 @@ import (
 	"os"
 	"reflect"
 	"strings"
+	"sync"
 	"time"
 )
 
@@ -52,6 +53,11 @@ const (
 	Arguments = "arguments"
 )
 
+var (
+	once            sync.Once
+	accessLogFilter *Filter
+)
+
 func init() {
 	extension.SetFilter(constant.AccessLogFilterKey, newFilter)
 }
@@ -76,6 +82,20 @@ type Filter struct {
 	logChan chan Data
 }
 
+func newFilter() filter.Filter {
+	if accessLogFilter == nil {
+		once.Do(func() {
+			accessLogFilter = &Filter{logChan: make(chan Data, LogMaxBuffer)}
+			go func() {
+				for accessLogData := range accessLogFilter.logChan {
+					accessLogFilter.writeLogToFile(accessLogData)
+				}
+			}()
+		})
+	}
+	return accessLogFilter
+}
+
 // Invoke will check whether user wants to use this filter.
 // If we find the value of key constant.AccessLogFilterKey, we will log the invocation info
 func (f *Filter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
@@ -220,16 +240,6 @@ func isDefault(accessLog string) bool {
 	return strings.EqualFold("true", accessLog) || strings.EqualFold("default", accessLog)
 }
 
-func newFilter() filter.Filter {
-	accessLogFilter := &Filter{logChan: make(chan Data, LogMaxBuffer)}
-	go func() {
-		for accessLogData := range accessLogFilter.logChan {
-			accessLogFilter.writeLogToFile(accessLogData)
-		}
-	}()
-	return accessLogFilter
-}
-
 // Data defines the data that will be log into file
 type Data struct {
 	accessLog string
diff --git a/filter/active/filter.go b/filter/active/filter.go
index 723a554..4228c19 100644
--- a/filter/active/filter.go
+++ b/filter/active/filter.go
@@ -20,6 +20,7 @@ package active
 import (
 	"context"
 	"strconv"
+	"sync"
 )
 
 import (
@@ -35,25 +36,36 @@ const (
 	dubboInvokeStartTime = "dubboInvokeStartTime"
 )
 
+var (
+	once   sync.Once
+	active *activeFilter
+)
+
 func init() {
-	extension.SetFilter(constant.ActiveFilterKey, func() filter.Filter {
-		return &Filter{}
-	})
+	extension.SetFilter(constant.ActiveFilterKey, newActiveFilter)
 }
 
 // Filter tracks the requests status
-type Filter struct{}
+type activeFilter struct{}
+
+func newActiveFilter() filter.Filter {
+	if active == nil {
+		once.Do(func() {
+			active = &activeFilter{}
+		})
+	}
+	return active
+}
 
 // Invoke starts to record the requests status
-func (f *Filter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
-	logger.Infof("invoking active filter. %v,%v", invocation.MethodName(), len(invocation.Arguments()))
+func (f *activeFilter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
 	invocation.(*invocation2.RPCInvocation).SetAttachments(dubboInvokeStartTime, strconv.FormatInt(protocol.CurrentTimeMillis(), 10))
 	protocol.BeginCount(invoker.GetURL(), invocation.MethodName())
 	return invoker.Invoke(ctx, invocation)
 }
 
 // OnResponse update the active count base on the request result.
-func (f *Filter) OnResponse(ctx context.Context, result protocol.Result, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
+func (f *activeFilter) OnResponse(ctx context.Context, result protocol.Result, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
 	startTime, err := strconv.ParseInt(invocation.(*invocation2.RPCInvocation).AttachmentsByKey(dubboInvokeStartTime, "0"), 10, 64)
 	if err != nil {
 		result.SetError(err)
diff --git a/filter/active/filter_test.go b/filter/active/filter_test.go
index 964d18a..1d751aa 100644
--- a/filter/active/filter_test.go
+++ b/filter/active/filter_test.go
@@ -40,7 +40,7 @@ import (
 func TestFilterInvoke(t *testing.T) {
 	invoc := invocation.NewRPCInvocation("test", []interface{}{"OK"}, make(map[string]interface{}))
 	url, _ := common.NewURL("dubbo://192.168.10.10:20000/com.ikurento.user.UserProvider")
-	filter := Filter{}
+	filter := activeFilter{}
 	ctrl := gomock.NewController(t)
 	defer ctrl.Finish()
 	invoker := mock.NewMockInvoker(ctrl)
@@ -57,7 +57,7 @@ func TestFilterOnResponse(t *testing.T) {
 		dubboInvokeStartTime: strconv.FormatInt(c-int64(elapsed), 10),
 	})
 	url, _ := common.NewURL("dubbo://192.168.10.10:20000/com.ikurento.user.UserProvider")
-	filter := Filter{}
+	filter := activeFilter{}
 	ctrl := gomock.NewController(t)
 	defer ctrl.Finish()
 	invoker := mock.NewMockInvoker(ctrl)
diff --git a/filter/auth/accesskey_storage.go b/filter/auth/accesskey_storage.go
index 4566cfb..f46c7b8 100644
--- a/filter/auth/accesskey_storage.go
+++ b/filter/auth/accesskey_storage.go
@@ -23,19 +23,32 @@ import (
 	"dubbo.apache.org/dubbo-go/v3/common/extension"
 	"dubbo.apache.org/dubbo-go/v3/filter"
 	"dubbo.apache.org/dubbo-go/v3/protocol"
+	"sync"
+)
+
+var (
+	storageOnce sync.Once
+	storage     *defaultAccesskeyStorage
 )
 
 func init() {
-	extension.SetAccessKeyStorages(constant.DefaultAccessKeyStorage, func() filter.AccessKeyStorage {
-		return &DefaultAccesskeyStorage{}
-	})
+	extension.SetAccessKeyStorages(constant.DefaultAccessKeyStorage, newDefaultAccesskeyStorage)
 }
 
-// DefaultAccesskeyStorage is the default implementation of AccesskeyStorage
-type DefaultAccesskeyStorage struct{}
+// defaultAccesskeyStorage is the default implementation of AccesskeyStorage
+type defaultAccesskeyStorage struct{}
+
+func newDefaultAccesskeyStorage() filter.AccessKeyStorage {
+	if storage == nil {
+		storageOnce.Do(func() {
+			storage = &defaultAccesskeyStorage{}
+		})
+	}
+	return storage
+}
 
 // GetAccessKeyPair retrieves AccessKeyPair from url by the key "accessKeyId" and "secretAccessKey"
-func (storage *DefaultAccesskeyStorage) GetAccessKeyPair(invocation protocol.Invocation, url *common.URL) *filter.AccessKeyPair {
+func (storage *defaultAccesskeyStorage) GetAccessKeyPair(invocation protocol.Invocation, url *common.URL) *filter.AccessKeyPair {
 	return &filter.AccessKeyPair{
 		AccessKey: url.GetParam(constant.AccessKeyIDKey, ""),
 		SecretKey: url.GetParam(constant.SecretAccessKeyKey, ""),
diff --git a/filter/auth/accesskey_storage_test.go b/filter/auth/accesskey_storage_test.go
index 8c72e7c..77ffd0a 100644
--- a/filter/auth/accesskey_storage_test.go
+++ b/filter/auth/accesskey_storage_test.go
@@ -38,7 +38,7 @@ func TestDefaultAccesskeyStorage_GetAccesskeyPair(t *testing.T) {
 		common.WithParamsValue(constant.SecretAccessKeyKey, "skey"),
 		common.WithParamsValue(constant.AccessKeyIDKey, "akey"))
 	invocation := &invocation2.RPCInvocation{}
-	storage := &DefaultAccesskeyStorage{}
+	storage = &defaultAccesskeyStorage{}
 	accesskeyPair := storage.GetAccessKeyPair(invocation, url)
 	assert.Equal(t, "skey", accesskeyPair.SecretKey)
 	assert.Equal(t, "akey", accesskeyPair.AccessKey)
diff --git a/filter/auth/consumer_sign_filter.go b/filter/auth/consumer_sign_filter.go
index ac2bf96..99e5c57 100644
--- a/filter/auth/consumer_sign_filter.go
+++ b/filter/auth/consumer_sign_filter.go
@@ -20,31 +20,39 @@ package auth
 import (
 	"context"
 	"fmt"
+	"sync"
 )
 
 import (
 	"dubbo.apache.org/dubbo-go/v3/common/constant"
 	"dubbo.apache.org/dubbo-go/v3/common/extension"
-	"dubbo.apache.org/dubbo-go/v3/common/logger"
 	"dubbo.apache.org/dubbo-go/v3/filter"
 	"dubbo.apache.org/dubbo-go/v3/protocol"
 )
 
+var (
+	signOnce sync.Once
+	sign     *signFilter
+)
+
 func init() {
-	extension.SetFilter(constant.AuthConsumerFilterKey, func() filter.Filter {
-		return &ConsumerSignFilter{}
-	})
-	extension.SetFilter(constant.AuthProviderFilterKey, func() filter.Filter {
-		return &ProviderAuthFilter{}
-	})
+	extension.SetFilter(constant.AuthConsumerFilterKey, newSignFilter)
 }
 
-// ConsumerSignFilter signs the request on consumer side
-type ConsumerSignFilter struct{}
+// signFilter signs the request on consumer side
+type signFilter struct{}
+
+func newSignFilter() filter.Filter {
+	if sign == nil {
+		signOnce.Do(func() {
+			sign = &signFilter{}
+		})
+	}
+	return sign
+}
 
 // Invoke retrieves the configured Authenticator to add signature to invocation
-func (csf *ConsumerSignFilter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
-	logger.Infof("invoking ConsumerSign filter.")
+func (sf *signFilter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
 	url := invoker.GetURL()
 
 	err := doAuthWork(url, func(authenticator filter.Authenticator) error {
@@ -57,6 +65,6 @@ func (csf *ConsumerSignFilter) Invoke(ctx context.Context, invoker protocol.Invo
 }
 
 // OnResponse dummy process, returns the result directly
-func (csf *ConsumerSignFilter) OnResponse(ctx context.Context, result protocol.Result, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
+func (sf *signFilter) OnResponse(ctx context.Context, result protocol.Result, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
 	return result
 }
diff --git a/filter/auth/consumer_sign_filter_test.go b/filter/auth/consumer_sign_filter_test.go
index 187f125..05f5c19 100644
--- a/filter/auth/consumer_sign_filter_test.go
+++ b/filter/auth/consumer_sign_filter_test.go
@@ -41,7 +41,7 @@ func TestConsumerSignFilter_Invoke(t *testing.T) {
 	url.SetParam(constant.SecretAccessKeyKey, "sk")
 	url.SetParam(constant.AccessKeyIDKey, "ak")
 	inv := invocation.NewRPCInvocation("test", []interface{}{"OK"}, nil)
-	filter := &ConsumerSignFilter{}
+	filter := &signFilter{}
 	ctrl := gomock.NewController(t)
 	defer ctrl.Finish()
 	invoker := mock.NewMockInvoker(ctrl)
diff --git a/filter/auth/default_authenticator.go b/filter/auth/default_authenticator.go
index 845bc2e..71da50b 100644
--- a/filter/auth/default_authenticator.go
+++ b/filter/auth/default_authenticator.go
@@ -21,6 +21,7 @@ import (
 	"errors"
 	"fmt"
 	"strconv"
+	"sync"
 	"time"
 )
 
@@ -33,17 +34,29 @@ import (
 	invocation_impl "dubbo.apache.org/dubbo-go/v3/protocol/invocation"
 )
 
+var (
+	authenticatorOnce sync.Once
+	authenticator     *defaultAuthenticator
+)
+
 func init() {
-	extension.SetAuthenticator(constant.DefaultAuthenticator, func() filter.Authenticator {
-		return &DefaultAuthenticator{}
-	})
+	extension.SetAuthenticator(constant.DefaultAuthenticator, newDefaultAuthenticator)
 }
 
-// DefaultAuthenticator is the default implementation of Authenticator
-type DefaultAuthenticator struct{}
+// defaultAuthenticator is the default implementation of Authenticator
+type defaultAuthenticator struct{}
+
+func newDefaultAuthenticator() filter.Authenticator {
+	if authenticator == nil {
+		authenticatorOnce.Do(func() {
+			authenticator = &defaultAuthenticator{}
+		})
+	}
+	return authenticator
+}
 
 // Sign adds the signature to the invocation
-func (authenticator *DefaultAuthenticator) Sign(invocation protocol.Invocation, url *common.URL) error {
+func (authenticator *defaultAuthenticator) Sign(invocation protocol.Invocation, url *common.URL) error {
 	currentTimeMillis := strconv.Itoa(int(time.Now().Unix() * 1000))
 
 	consumer := url.GetParam(constant.ApplicationKey, "")
@@ -83,7 +96,7 @@ func getSignature(url *common.URL, invocation protocol.Invocation, secrectKey st
 }
 
 // Authenticate verifies whether the signature sent by the requester is correct
-func (authenticator *DefaultAuthenticator) Authenticate(invocation protocol.Invocation, url *common.URL) error {
+func (authenticator *defaultAuthenticator) Authenticate(invocation protocol.Invocation, url *common.URL) error {
 	accessKeyId := invocation.AttachmentsByKey(constant.AKKey, "")
 
 	requestTimestamp := invocation.AttachmentsByKey(constant.RequestTimestampKey, "")
diff --git a/filter/auth/default_authenticator_test.go b/filter/auth/default_authenticator_test.go
index d6ce6ef..57197f1 100644
--- a/filter/auth/default_authenticator_test.go
+++ b/filter/auth/default_authenticator_test.go
@@ -50,7 +50,7 @@ func TestDefaultAuthenticator_Authenticate(t *testing.T) {
 	requestTime := strconv.Itoa(int(time.Now().Unix() * 1000))
 	signature, _ := getSignature(testurl, inv, secret, requestTime)
 
-	authenticator := &DefaultAuthenticator{}
+	authenticator = &defaultAuthenticator{}
 
 	invcation := invocation.NewRPCInvocation("test", parmas, map[string]interface{}{
 		constant.RequestSignatureKey: signature,
@@ -72,7 +72,7 @@ func TestDefaultAuthenticator_Authenticate(t *testing.T) {
 }
 
 func TestDefaultAuthenticator_Sign(t *testing.T) {
-	authenticator := &DefaultAuthenticator{}
+	authenticator = &defaultAuthenticator{}
 	testurl, _ := common.NewURL("dubbo://127.0.0.1:20000/com.ikurento.user.UserProvider?application=test&interface=com.ikurento.user.UserProvider&group=gg&version=2.6.0")
 	testurl.SetParam(constant.AccessKeyIDKey, "akey")
 	testurl.SetParam(constant.SecretAccessKeyKey, "skey")
diff --git a/filter/auth/provider_auth_filter.go b/filter/auth/provider_auth_filter.go
index 381b025..332ff43 100644
--- a/filter/auth/provider_auth_filter.go
+++ b/filter/auth/provider_auth_filter.go
@@ -19,6 +19,7 @@ package auth
 
 import (
 	"context"
+	"sync"
 )
 
 import (
@@ -29,23 +30,36 @@ import (
 	"dubbo.apache.org/dubbo-go/v3/protocol"
 )
 
+var (
+	authOnce sync.Once
+	auth     *authFilter
+)
+
 func init() {
-	extension.SetFilter(constant.AuthProviderFilterKey, newProviderAuthFilter)
+	extension.SetFilter(constant.AuthProviderFilterKey, newAuthFilter)
 }
 
-// ProviderAuthFilter verifies the correctness of the signature on provider side
-type ProviderAuthFilter struct{}
+// authFilter verifies the correctness of the signature on provider side
+type authFilter struct{}
+
+func newAuthFilter() filter.Filter {
+	if auth == nil {
+		authOnce.Do(func() {
+			auth = &authFilter{}
+		})
+	}
+	return auth
+}
 
 // Invoke retrieves the configured Authenticator to verify the signature in an invocation
-func (paf *ProviderAuthFilter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
-	logger.Infof("invoking providerAuth filter.")
+func (paf *authFilter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
 	url := invoker.GetURL()
 
 	err := doAuthWork(url, func(authenticator filter.Authenticator) error {
 		return authenticator.Authenticate(invocation, url)
 	})
 	if err != nil {
-		logger.Infof("auth the request: %v occur exception, cause: %s", invocation, err.Error())
+		logger.Errorf("auth the request: %v occur exception, cause: %s", invocation, err.Error())
 		return &protocol.RPCResult{
 			Err: err,
 		}
@@ -55,10 +69,10 @@ func (paf *ProviderAuthFilter) Invoke(ctx context.Context, invoker protocol.Invo
 }
 
 // OnResponse dummy process, returns the result directly
-func (paf *ProviderAuthFilter) OnResponse(ctx context.Context, result protocol.Result, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
+func (paf *authFilter) OnResponse(ctx context.Context, result protocol.Result, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
 	return result
 }
 
 func newProviderAuthFilter() filter.Filter {
-	return &ProviderAuthFilter{}
+	return &authFilter{}
 }
diff --git a/filter/auth/provider_auth_filter_test.go b/filter/auth/provider_auth_filter_test.go
index edf1dc6..1cdf159 100644
--- a/filter/auth/provider_auth_filter_test.go
+++ b/filter/auth/provider_auth_filter_test.go
@@ -62,7 +62,7 @@ func TestProviderAuthFilter_Invoke(t *testing.T) {
 		constant.AKKey:               access,
 	})
 	ctrl := gomock.NewController(t)
-	filter := &ProviderAuthFilter{}
+	filter := &authFilter{}
 	defer ctrl.Finish()
 	invoker := mock.NewMockInvoker(ctrl)
 	result := &protocol.RPCResult{}
diff --git a/filter/echo/filter.go b/filter/echo/filter.go
index f1bc7c3..9fb8ab7 100644
--- a/filter/echo/filter.go
+++ b/filter/echo/filter.go
@@ -19,31 +19,42 @@ package echo
 
 import (
 	"context"
+	"sync"
 )
 
 import (
 	"dubbo.apache.org/dubbo-go/v3/common/constant"
 	"dubbo.apache.org/dubbo-go/v3/common/extension"
-	"dubbo.apache.org/dubbo-go/v3/common/logger"
 	"dubbo.apache.org/dubbo-go/v3/filter"
 	"dubbo.apache.org/dubbo-go/v3/protocol"
 )
 
+var (
+	once sync.Once
+	echo *echoFilter
+)
+
 func init() {
-	extension.SetFilter(constant.EchoFilterKey, func() filter.Filter {
-		return &Filter{}
-	})
+	extension.SetFilter(constant.EchoFilterKey, newEchoFilter)
 }
 
 // Filter health check
 // RPCService need a Echo method in consumer, if you want to use Filter
 // eg:
 //		Echo func(ctx context.Context, arg interface{}, rsp *Xxx) error
-type Filter struct{}
+type echoFilter struct{}
+
+func newEchoFilter() filter.Filter {
+	if echo == nil {
+		once.Do(func() {
+			echo = &echoFilter{}
+		})
+	}
+	return echo
+}
 
 // Invoke response to the callers with its first argument.
-func (f *Filter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
-	logger.Debugf("%v,%v", invocation.MethodName(), len(invocation.Arguments()))
+func (f *echoFilter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
 	if invocation.MethodName() == constant.Echo && len(invocation.Arguments()) == 1 {
 		return &protocol.RPCResult{
 			Rest:  invocation.Arguments()[0],
@@ -55,7 +66,7 @@ func (f *Filter) Invoke(ctx context.Context, invoker protocol.Invoker, invocatio
 }
 
 // OnResponse dummy process, returns the result directly
-func (f *Filter) OnResponse(_ context.Context, result protocol.Result, _ protocol.Invoker,
+func (f *echoFilter) OnResponse(_ context.Context, result protocol.Result, _ protocol.Invoker,
 	_ protocol.Invocation) protocol.Result {
 
 	return result
diff --git a/filter/echo/filter_test.go b/filter/echo/filter_test.go
index bda26ca..33fbe3b 100644
--- a/filter/echo/filter_test.go
+++ b/filter/echo/filter_test.go
@@ -33,7 +33,7 @@ import (
 )
 
 func TestFilterInvoke(t *testing.T) {
-	filter := &Filter{}
+	filter := &echoFilter{}
 	result := filter.Invoke(context.Background(), protocol.NewBaseInvoker(&common.URL{}), invocation.NewRPCInvocation("$echo", []interface{}{"OK"}, nil))
 	assert.Equal(t, "OK", result.Result())
 
diff --git a/filter/execlmt/filter.go b/filter/exec_limit/filter.go
similarity index 89%
rename from filter/execlmt/filter.go
rename to filter/exec_limit/filter.go
index c313c62..b61d9fa 100644
--- a/filter/execlmt/filter.go
+++ b/filter/exec_limit/filter.go
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package execlmt
+package exec_limit
 
 import (
 	"context"
@@ -37,6 +37,11 @@ import (
 	"dubbo.apache.org/dubbo-go/v3/protocol"
 )
 
+var (
+	once         sync.Once
+	executeLimit *executeLimitFilter
+)
+
 func init() {
 	extension.SetFilter(constant.ExecuteLimitFilterKey, newFilter)
 }
@@ -66,7 +71,7 @@ func init() {
  * Sometimes we want to do something, like log the request or return default value when the request is over limitation.
  * Then you can implement the RejectedExecutionHandler interface and register it by invoking SetRejectedExecutionHandler.
  */
-type Filter struct {
+type executeLimitFilter struct {
 	executeState *concurrent.Map
 }
 
@@ -75,8 +80,20 @@ type ExecuteState struct {
 	concurrentCount int64
 }
 
+// newFilter returns the singleton Filter instance
+func newFilter() filter.Filter {
+	if executeLimit == nil {
+		once.Do(func() {
+			executeLimit = &executeLimitFilter{
+				executeState: concurrent.NewMap(),
+			}
+		})
+	}
+	return executeLimit
+}
+
 // Invoke judges whether the current processing requests over the threshold
-func (f *Filter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
+func (f *executeLimitFilter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
 	methodConfigPrefix := "methods." + invocation.MethodName() + "."
 	ivkURL := invoker.GetURL()
 	limitTarget := ivkURL.ServiceKey()
@@ -118,7 +135,7 @@ func (f *Filter) Invoke(ctx context.Context, invoker protocol.Invoker, invocatio
 }
 
 // OnResponse dummy process, returns the result directly
-func (f *Filter) OnResponse(_ context.Context, result protocol.Result, _ protocol.Invoker, _ protocol.Invocation) protocol.Result {
+func (f *executeLimitFilter) OnResponse(_ context.Context, result protocol.Result, _ protocol.Invoker, _ protocol.Invocation) protocol.Result {
 	return result
 }
 
@@ -129,18 +146,3 @@ func (state *ExecuteState) increase() int64 {
 func (state *ExecuteState) decrease() {
 	atomic.AddInt64(&state.concurrentCount, -1)
 }
-
-var (
-	executeLimitOnce   sync.Once
-	executeLimitFilter *Filter
-)
-
-// newFilter returns the singleton Filter instance
-func newFilter() filter.Filter {
-	executeLimitOnce.Do(func() {
-		executeLimitFilter = &Filter{
-			executeState: concurrent.NewMap(),
-		}
-	})
-	return executeLimitFilter
-}
diff --git a/filter/execlmt/filter_test.go b/filter/exec_limit/filter_test.go
similarity index 99%
rename from filter/execlmt/filter_test.go
rename to filter/exec_limit/filter_test.go
index c255c5a..400db8a 100644
--- a/filter/execlmt/filter_test.go
+++ b/filter/exec_limit/filter_test.go
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package execlmt
+package exec_limit
 
 import (
 	"context"
diff --git a/filter/filter_impl/import.go b/filter/filter_impl/import.go
index 46bfd45..f54bf82 100644
--- a/filter/filter_impl/import.go
+++ b/filter/filter_impl/import.go
@@ -25,7 +25,7 @@ import (
 	_ "dubbo.apache.org/dubbo-go/v3/filter/active"
 	_ "dubbo.apache.org/dubbo-go/v3/filter/auth"
 	_ "dubbo.apache.org/dubbo-go/v3/filter/echo"
-	_ "dubbo.apache.org/dubbo-go/v3/filter/execlmt"
+	_ "dubbo.apache.org/dubbo-go/v3/filter/exec_limit"
 	_ "dubbo.apache.org/dubbo-go/v3/filter/generic"
 	_ "dubbo.apache.org/dubbo-go/v3/filter/gshutdown"
 	_ "dubbo.apache.org/dubbo-go/v3/filter/hystrix"
diff --git a/filter/generic/filter.go b/filter/generic/filter.go
index 38fa76b..c63b30c 100644
--- a/filter/generic/filter.go
+++ b/filter/generic/filter.go
@@ -19,6 +19,7 @@ package generic
 
 import (
 	"context"
+	"sync"
 )
 
 import (
@@ -34,17 +35,29 @@ import (
 	invocation2 "dubbo.apache.org/dubbo-go/v3/protocol/invocation"
 )
 
+var (
+	genericOnce sync.Once
+	instance    *genericFilter
+)
+
 func init() {
-	extension.SetFilter(constant.GenericFilterKey, func() filter.Filter {
-		return &Filter{}
-	})
+	extension.SetFilter(constant.GenericFilterKey, newGenericFilter)
 }
 
-// Filter ensures the structs are converted to maps, this filter is for consumer
-type Filter struct{}
+// genericFilter ensures the structs are converted to maps, this filter is for consumer
+type genericFilter struct{}
+
+func newGenericFilter() filter.Filter {
+	if instance == nil {
+		genericOnce.Do(func() {
+			instance = &genericFilter{}
+		})
+	}
+	return instance
+}
 
 // Invoke turns the parameters to map for generic method
-func (f *Filter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
+func (f *genericFilter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
 	if isCallingToGenericService(invoker, invocation) {
 
 		mtdname := invocation.MethodName()
@@ -91,7 +104,7 @@ func (f *Filter) Invoke(ctx context.Context, invoker protocol.Invoker, invocatio
 }
 
 // OnResponse dummy process, returns the result directly
-func (f *Filter) OnResponse(_ context.Context, result protocol.Result, _ protocol.Invoker,
+func (f *genericFilter) OnResponse(_ context.Context, result protocol.Result, _ protocol.Invoker,
 	_ protocol.Invocation) protocol.Result {
 	return result
 }
diff --git a/filter/generic/filter_test.go b/filter/generic/filter_test.go
index 8ad669d..cccd21a 100644
--- a/filter/generic/filter_test.go
+++ b/filter/generic/filter_test.go
@@ -44,7 +44,7 @@ func TestFilter_Invoke(t *testing.T) {
 	invokeUrl := common.NewURLWithOptions(
 		common.WithParams(url.Values{}),
 		common.WithParamsValue(constant.GenericKey, constant.GenericSerializationDefault))
-	filter := &Filter{}
+	filter := &genericFilter{}
 
 	ctrl := gomock.NewController(t)
 	defer ctrl.Finish()
@@ -73,7 +73,7 @@ func TestFilter_InvokeWithGenericCall(t *testing.T) {
 	invokeUrl := common.NewURLWithOptions(
 		common.WithParams(url.Values{}),
 		common.WithParamsValue(constant.GenericKey, constant.GenericSerializationDefault))
-	filter := &Filter{}
+	filter := &genericFilter{}
 
 	ctrl := gomock.NewController(t)
 	defer ctrl.Finish()
diff --git a/filter/generic/service_filter.go b/filter/generic/service_filter.go
index 3693825..d3109d5 100644
--- a/filter/generic/service_filter.go
+++ b/filter/generic/service_filter.go
@@ -19,6 +19,7 @@ package generic
 
 import (
 	"context"
+	"sync"
 )
 
 import (
@@ -37,16 +38,27 @@ import (
 	invocation2 "dubbo.apache.org/dubbo-go/v3/protocol/invocation"
 )
 
+var (
+	serviceGenericOnce sync.Once
+	serviceGeneric     *genericServiceFilter
+)
+
 func init() {
-	extension.SetFilter(constant.GenericServiceFilterKey, func() filter.Filter {
-		return &ServiceFilter{}
-	})
+	extension.SetFilter(constant.GenericServiceFilterKey, newGenericServiceFilter)
 }
 
-// ServiceFilter is for Server
-type ServiceFilter struct{}
+// genericServiceFilter is for Server
+type genericServiceFilter struct{}
 
-func (f *ServiceFilter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
+func newGenericServiceFilter() filter.Filter {
+	if serviceGeneric == nil {
+		serviceGenericOnce.Do(func() {
+			serviceGeneric = &genericServiceFilter{}
+		})
+	}
+	return serviceGeneric
+}
+func (f *genericServiceFilter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
 	if !isGenericInvocation(invocation) {
 		return invoker.Invoke(ctx, invocation)
 	}
@@ -111,7 +123,7 @@ func (f *ServiceFilter) Invoke(ctx context.Context, invoker protocol.Invoker, in
 	return invoker.Invoke(ctx, newivc)
 }
 
-func (f *ServiceFilter) OnResponse(_ context.Context, result protocol.Result, _ protocol.Invoker, invocation protocol.Invocation) protocol.Result {
+func (f *genericServiceFilter) OnResponse(_ context.Context, result protocol.Result, _ protocol.Invoker, invocation protocol.Invocation) protocol.Result {
 	if isGenericInvocation(invocation) && result.Result() != nil {
 		// get generic info from attachments of invocation, the default value is "true"
 		generic := invocation.AttachmentsByKey(constant.GenericKey, constant.GenericSerializationDefault)
diff --git a/filter/generic/service_filter_test.go b/filter/generic/service_filter_test.go
index 24bd7be..cf57a4f 100644
--- a/filter/generic/service_filter_test.go
+++ b/filter/generic/service_filter_test.go
@@ -70,7 +70,7 @@ func (s *MockHelloService) HelloPB(req *generalizer.RequestType) (*generalizer.R
 }
 
 func TestServiceFilter_Invoke(t *testing.T) {
-	filter := &ServiceFilter{}
+	filter := &genericServiceFilter{}
 
 	ctrl := gomock.NewController(t)
 	defer ctrl.Finish()
@@ -193,7 +193,7 @@ func TestServiceFilter_Invoke(t *testing.T) {
 }
 
 func TestServiceFilter_OnResponse(t *testing.T) {
-	filter := &ServiceFilter{}
+	filter := &genericServiceFilter{}
 
 	// invoke a method without errors
 	invocation1 := invocation.NewRPCInvocation(constant.Generic,
diff --git a/filter/seata/filter.go b/filter/seata/filter.go
index 61e4aa3..b1a75e4 100644
--- a/filter/seata/filter.go
+++ b/filter/seata/filter.go
@@ -20,6 +20,7 @@ package seata
 import (
 	"context"
 	"strings"
+	"sync"
 )
 
 import (
@@ -34,20 +35,31 @@ const (
 	SEATA_XID = constant.DubboCtxKey("SEATA_XID")
 )
 
+var (
+	once  sync.Once
+	seata *seataFilter
+)
+
 func init() {
-	extension.SetFilter(constant.SeataFilterKey, func() filter.Filter {
-		return &Filter{}
-	})
+	extension.SetFilter(constant.SeataFilterKey, newSeataFilter)
 }
 
-// Filter when use seata-golang, use this filter to transfer xid
-type Filter struct{}
+// seataFilter when use seata-golang, use this filter to transfer xid
+type seataFilter struct{}
+
+func newSeataFilter() filter.Filter {
+	if seata == nil {
+		once.Do(func() {
+			seata = &seataFilter{}
+		})
+	}
+	return seata
+}
 
 // Invoke Get Xid by attachment key `SEATA_XID`. When use Seata, transfer xid by attachments
-func (f *Filter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
-	logger.Infof("invoking seata filter.")
+func (f *seataFilter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
 	xid := invocation.AttachmentsByKey(string(SEATA_XID), "")
-	if strings.TrimSpace(xid) != "" {
+	if len(strings.TrimSpace(xid)) > 0 {
 		logger.Debugf("Method: %v,Xid: %v", invocation.MethodName(), xid)
 		return invoker.Invoke(context.WithValue(ctx, SEATA_XID, xid), invocation)
 	}
@@ -55,6 +67,6 @@ func (f *Filter) Invoke(ctx context.Context, invoker protocol.Invoker, invocatio
 }
 
 // OnResponse dummy process, returns the result directly
-func (f *Filter) OnResponse(ctx context.Context, result protocol.Result, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
+func (f *seataFilter) OnResponse(ctx context.Context, result protocol.Result, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
 	return result
 }
diff --git a/filter/seata/filter_test.go b/filter/seata/filter_test.go
index 511ba67..cdbf0a0 100644
--- a/filter/seata/filter_test.go
+++ b/filter/seata/filter_test.go
@@ -47,7 +47,7 @@ func (iv *testMockSeataInvoker) Invoke(ctx context.Context, _ protocol.Invocatio
 }
 
 func TestSeataFilter_Invoke(t *testing.T) {
-	filter := &Filter{}
+	filter := &seataFilter{}
 	result := filter.Invoke(context.Background(), &testMockSeataInvoker{}, invocation.NewRPCInvocation("$echo",
 		[]interface{}{"OK"}, map[string]interface{}{
 			string(SEATA_XID): "10.30.21.227:8091:2000047792",
diff --git a/filter/sentinel/filter.go b/filter/sentinel/filter.go
index 2bbb46c..2fe2341 100644
--- a/filter/sentinel/filter.go
+++ b/filter/sentinel/filter.go
@@ -21,6 +21,7 @@ import (
 	"context"
 	"fmt"
 	"strings"
+	"sync"
 )
 
 import (
@@ -43,12 +44,8 @@ import (
 //     refer to https://github.com/alibaba/sentinel-golang/blob/master/api/init.go
 // 2. Register rules for resources user want to guard
 func init() {
-	extension.SetFilter(constant.SentinelConsumerFilterKey, func() filter.Filter {
-		return &ConsumerFilter{}
-	})
-	extension.SetFilter(constant.SentinelProviderFilterKey, func() filter.Filter {
-		return &ProviderFilter{}
-	})
+	extension.SetFilter(constant.SentinelConsumerFilterKey, newSentinelConsumerFilter)
+	extension.SetFilter(constant.SentinelProviderFilterKey, newSentinelProviderFilter)
 	if err := logging.ResetGlobalLogger(DubboLoggerWrapper{Logger: logger.GetLogger()}); err != nil {
 		logger.Errorf("[Sentinel Filter] fail to ingest dubbo logger into sentinel")
 	}
@@ -103,9 +100,23 @@ func sentinelExit(ctx context.Context, result protocol.Result) {
 	}
 }
 
-type ProviderFilter struct{}
+var (
+	providerOnce     sync.Once
+	sentinelProvider *sentinelProviderFilter
+)
+
+type sentinelProviderFilter struct{}
+
+func newSentinelProviderFilter() filter.Filter {
+	if sentinelProvider == nil {
+		providerOnce.Do(func() {
+			sentinelProvider = &sentinelProviderFilter{}
+		})
+	}
+	return sentinelProvider
+}
 
-func (d *ProviderFilter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
+func (d *sentinelProviderFilter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
 	interfaceResourceName, methodResourceName := getResourceName(invoker, invocation, getProviderPrefix())
 
 	var (
@@ -132,14 +143,28 @@ func (d *ProviderFilter) Invoke(ctx context.Context, invoker protocol.Invoker, i
 	return invoker.Invoke(ctx, invocation)
 }
 
-func (d *ProviderFilter) OnResponse(ctx context.Context, result protocol.Result, _ protocol.Invoker, _ protocol.Invocation) protocol.Result {
+func (d *sentinelProviderFilter) OnResponse(ctx context.Context, result protocol.Result, _ protocol.Invoker, _ protocol.Invocation) protocol.Result {
 	sentinelExit(ctx, result)
 	return result
 }
 
-type ConsumerFilter struct{}
+var (
+	consumerOnce     sync.Once
+	sentinelConsumer *sentinelConsumerFilter
+)
+
+type sentinelConsumerFilter struct{}
+
+func newSentinelConsumerFilter() filter.Filter {
+	if sentinelConsumer == nil {
+		consumerOnce.Do(func() {
+			sentinelConsumer = &sentinelConsumerFilter{}
+		})
+	}
+	return sentinelConsumer
+}
 
-func (d *ConsumerFilter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
+func (d *sentinelConsumerFilter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
 	interfaceResourceName, methodResourceName := getResourceName(invoker, invocation, getConsumerPrefix())
 	var (
 		interfaceEntry *base.SentinelEntry
@@ -165,7 +190,7 @@ func (d *ConsumerFilter) Invoke(ctx context.Context, invoker protocol.Invoker, i
 	return invoker.Invoke(ctx, invocation)
 }
 
-func (d *ConsumerFilter) OnResponse(ctx context.Context, result protocol.Result, _ protocol.Invoker, _ protocol.Invocation) protocol.Result {
+func (d *sentinelConsumerFilter) OnResponse(ctx context.Context, result protocol.Result, _ protocol.Invoker, _ protocol.Invocation) protocol.Result {
 	sentinelExit(ctx, result)
 	return result
 }
diff --git a/filter/sentinel/filter_test.go b/filter/sentinel/filter_test.go
index ff1ff3a..e981513 100644
--- a/filter/sentinel/filter_test.go
+++ b/filter/sentinel/filter_test.go
@@ -64,7 +64,7 @@ func TestSentinelFilter_QPS(t *testing.T) {
 
 	wg := sync.WaitGroup{}
 	wg.Add(10)
-	f := &ProviderFilter{}
+	f := &sentinelProviderFilter{}
 	pass := int64(0)
 	block := int64(0)
 	for i := 0; i < 10; i++ {
@@ -87,7 +87,7 @@ func TestSentinelFilter_QPS(t *testing.T) {
 }
 
 func TestConsumerFilter_Invoke(t *testing.T) {
-	f := &ConsumerFilter{}
+	f := &sentinelConsumerFilter{}
 	url, err := common.NewURL("dubbo://127.0.0.1:20000/UserProvider?anyhost=true&" +
 		"application=BDTService&category=providers&default.timeout=10000&dubbo=dubbo-provider-golang-1.0.0&" +
 		"environment=dev&interface=com.ikurento.user.UserProvider&ip=192.168.56.1&methods=GetUser%2C&" +
@@ -101,7 +101,7 @@ func TestConsumerFilter_Invoke(t *testing.T) {
 }
 
 func TestProviderFilter_Invoke(t *testing.T) {
-	f := &ProviderFilter{}
+	f := &sentinelProviderFilter{}
 	url, err := common.NewURL("dubbo://127.0.0.1:20000/UserProvider?anyhost=true&" +
 		"application=BDTService&category=providers&default.timeout=10000&dubbo=dubbo-provider-golang-1.0.0&" +
 		"environment=dev&interface=com.ikurento.user.UserProvider&ip=192.168.56.1&methods=GetUser%2C&" +
diff --git a/filter/token/filter.go b/filter/token/filter.go
index c7eba70..8a9ca04 100644
--- a/filter/token/filter.go
+++ b/filter/token/filter.go
@@ -20,6 +20,7 @@ package token
 import (
 	"context"
 	"strings"
+	"sync"
 )
 
 import (
@@ -33,17 +34,29 @@ import (
 	"dubbo.apache.org/dubbo-go/v3/protocol"
 )
 
+var (
+	once  sync.Once
+	token *tokenFilter
+)
+
 func init() {
-	extension.SetFilter(constant.TokenFilterKey, func() filter.Filter {
-		return &Filter{}
-	})
+	extension.SetFilter(constant.TokenFilterKey, newTokenFilter)
 }
 
-// Filter will verify if the token is valid
-type Filter struct{}
+// tokenFilter will verify if the token is valid
+type tokenFilter struct{}
+
+func newTokenFilter() filter.Filter {
+	if token == nil {
+		once.Do(func() {
+			token = &tokenFilter{}
+		})
+	}
+	return token
+}
 
 // Invoke verifies the incoming token with the service configured token
-func (f *Filter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
+func (f *tokenFilter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
 	invokerTkn := invoker.GetURL().GetParam(constant.TokenKey, "")
 	if len(invokerTkn) > 0 {
 		attachs := invocation.Attachments()
@@ -59,6 +72,6 @@ func (f *Filter) Invoke(ctx context.Context, invoker protocol.Invoker, invocatio
 }
 
 // OnResponse dummy process, returns the result directly
-func (f *Filter) OnResponse(ctx context.Context, result protocol.Result, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
+func (f *tokenFilter) OnResponse(ctx context.Context, result protocol.Result, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
 	return result
 }
diff --git a/filter/token/filter_test.go b/filter/token/filter_test.go
index 10edd3f..ce18229 100644
--- a/filter/token/filter_test.go
+++ b/filter/token/filter_test.go
@@ -35,7 +35,7 @@ import (
 )
 
 func TestTokenFilterInvoke(t *testing.T) {
-	filter := &Filter{}
+	filter := &tokenFilter{}
 
 	url := common.NewURLWithOptions(
 		common.WithParams(url.Values{}),
@@ -51,7 +51,7 @@ func TestTokenFilterInvoke(t *testing.T) {
 }
 
 func TestTokenFilterInvokeEmptyToken(t *testing.T) {
-	filter := &Filter{}
+	filter := &tokenFilter{}
 
 	testUrl := common.URL{}
 	attch := make(map[string]interface{})
@@ -62,7 +62,7 @@ func TestTokenFilterInvokeEmptyToken(t *testing.T) {
 }
 
 func TestTokenFilterInvokeEmptyAttach(t *testing.T) {
-	filter := &Filter{}
+	filter := &tokenFilter{}
 
 	testUrl := common.NewURLWithOptions(
 		common.WithParams(url.Values{}),
@@ -73,7 +73,7 @@ func TestTokenFilterInvokeEmptyAttach(t *testing.T) {
 }
 
 func TestTokenFilterInvokeNotEqual(t *testing.T) {
-	filter := &Filter{}
+	filter := &tokenFilter{}
 
 	testUrl := common.NewURLWithOptions(
 		common.WithParams(url.Values{}),
diff --git a/filter/tps/filter.go b/filter/tps/filter.go
index 32f45f5..c62675f 100644
--- a/filter/tps/filter.go
+++ b/filter/tps/filter.go
@@ -19,6 +19,7 @@ package tps
 
 import (
 	"context"
+	"sync"
 )
 
 import (
@@ -31,10 +32,13 @@ import (
 	"dubbo.apache.org/dubbo-go/v3/protocol"
 )
 
+var (
+	once     sync.Once
+	tpsLimit *tpsLimitFilter
+)
+
 func init() {
-	extension.SetFilter(constant.TpsLimitFilterKey, func() filter.Filter {
-		return &Filter{}
-	})
+	extension.SetFilter(constant.TpsLimitFilterKey, newTpsLimitFilter)
 }
 
 // Filter filters the requests by TPS
@@ -51,10 +55,19 @@ func init() {
  *   tps.limit.rejected.handler: "default", # optional, or the name of the implementation
  *   if the value of 'tps.limiter' is nil or empty string, the tps filter will do nothing
  */
-type Filter struct{}
+type tpsLimitFilter struct{}
+
+func newTpsLimitFilter() filter.Filter {
+	if tpsLimit == nil {
+		once.Do(func() {
+			tpsLimit = &tpsLimitFilter{}
+		})
+	}
+	return tpsLimit
+}
 
 // Invoke gets the configured limter to impose TPS limiting
-func (t *Filter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
+func (t *tpsLimitFilter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
 	url := invoker.GetURL()
 	tpsLimiter := url.GetParam(constant.TPSLimiterKey, "")
 	rejectedExeHandler := url.GetParam(constant.TPSRejectedExecutionHandlerKey, constant.DefaultKey)
@@ -70,7 +83,7 @@ func (t *Filter) Invoke(ctx context.Context, invoker protocol.Invoker, invocatio
 }
 
 // OnResponse dummy process, returns the result directly
-func (t *Filter) OnResponse(_ context.Context, result protocol.Result, _ protocol.Invoker,
+func (t *tpsLimitFilter) OnResponse(_ context.Context, result protocol.Result, _ protocol.Invoker,
 	_ protocol.Invocation) protocol.Result {
 	return result
 }
diff --git a/filter/tps/filter_test.go b/filter/tps/filter_test.go
index 11f553d..9135e52 100644
--- a/filter/tps/filter_test.go
+++ b/filter/tps/filter_test.go
@@ -41,7 +41,7 @@ import (
 )
 
 func TestTpsLimitFilterInvokeWithNoTpsLimiter(t *testing.T) {
-	tpsFilter := &Filter{}
+	tpsFilter := &tpsLimitFilter{}
 	invokeUrl := common.NewURLWithOptions(
 		common.WithParams(url.Values{}),
 		common.WithParamsValue(constant.TPSLimiterKey, ""))
@@ -64,7 +64,7 @@ func TestGenericFilterInvokeWithDefaultTpsLimiter(t *testing.T) {
 		return mockLimiter
 	})
 
-	tpsFilter := &Filter{}
+	tpsFilter := &tpsLimitFilter{}
 	invokeUrl := common.NewURLWithOptions(
 		common.WithParams(url.Values{}),
 		common.WithParamsValue(constant.TPSLimiterKey, constant.DefaultKey))
@@ -95,7 +95,7 @@ func TestGenericFilterInvokeWithDefaultTpsLimiterNotAllow(t *testing.T) {
 		return mockRejectedHandler
 	})
 
-	tpsFilter := &Filter{}
+	tpsFilter := &tpsLimitFilter{}
 	invokeUrl := common.NewURLWithOptions(
 		common.WithParams(url.Values{}),
 		common.WithParamsValue(constant.TPSLimiterKey, constant.DefaultKey))
diff --git a/imports/imports.go b/imports/imports.go
index 02c685e..443e97a 100644
--- a/imports/imports.go
+++ b/imports/imports.go
@@ -39,7 +39,7 @@ import (
 	_ "dubbo.apache.org/dubbo-go/v3/filter/active"
 	_ "dubbo.apache.org/dubbo-go/v3/filter/auth"
 	_ "dubbo.apache.org/dubbo-go/v3/filter/echo"
-	_ "dubbo.apache.org/dubbo-go/v3/filter/execlmt"
+	_ "dubbo.apache.org/dubbo-go/v3/filter/exec_limit"
 	_ "dubbo.apache.org/dubbo-go/v3/filter/generic"
 	_ "dubbo.apache.org/dubbo-go/v3/filter/gshutdown"
 	_ "dubbo.apache.org/dubbo-go/v3/filter/hystrix"