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"