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

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


The following commit(s) were added to refs/heads/develop by this push:
     new 53d81d17c chore: prepare the release for version 3.3.2 (#3469)
53d81d17c is described below

commit 53d81d17c0f658b7151fb8c44f0d80371ef047e7
Author: Xuetao Li <[email protected]>
AuthorDate: Mon Jul 27 02:21:58 2026 +0000

    chore: prepare the release for version 3.3.2 (#3469)
    
    * chore: prepare 3.3.2 release
    
    * ci: use local source for integration tests
    
    * fix(registry): add lock protection for serviceListeners map access (#3442)
    
    * fix(registry): add lock protection for serviceListeners map access
    
    serviceListeners map was read/written without holding the lock in
    SubscribeURL and UnSubscribe, while the same struct's 
serviceMappingListeners
    already had proper lock protection. This could cause data races when
    concurrent subscribe/unsubscribe operations access the map.
    
    - SubscribeURL: use s.lock.Lock() to protect the check-then-act read+write
      of serviceListeners (write lock needed to prevent TOCTOU race)
    - UnSubscribe: use s.lock.RLock() for the read access of serviceListeners
    
    Co-Authored-By: Claude <[email protected]>
    
    * fix(registry): use defer+lambda for serviceListeners lock to prevent 
deadlock on panic
    
    Wrap lock/unlock in anonymous functions with defer to ensure the lock
    is always released even if a panic occurs between Lock() and Unlock(),
    as suggested in PR review.
    
    Co-Authored-By: Claude <[email protected]>
    
    * fix(registry): narrow service-discovery lock to map check/install only
    
    Address [P1] review on PR #3442: the write lock previously wrapped
    GetInstances and listener.OnEvent, which may perform external RPC /
    metadata-report calls and block every other subscribe/unsubscribe on
    the same registry.
    
    - Move GetInstances/OnEvent out of the lock; build the listener first.
    - Install under a short write lock with a double-check so a concurrent
      subscriber for the same key does not install a duplicate listener.
    - UnSubscribe uses the new getServiceListener helper (short RLock) in
      place of the inline lambda.
    - Add TestServiceDiscoveryRegistrySubscribeURLDoesNotHoldLockOnExternalCall
      which blocks GetInstances for one service and asserts that subscribing a
      different service is not stalled. The test fails on the previous
      lock-during-GetInstances implementation.
    
    Co-Authored-By: Claude <[email protected]>
    
    * chore: trigger CI rerun on Integration Test
    
    Re-runs the Integration Test job, which previously failed due to a
    transient 500 from sum.golang.org while indexing the freshly-pushed
    fork commit (not a code issue; the CI unit-test job passed).
    
    Co-Authored-By: Claude <[email protected]>
    
    * ci: skip sumdb for fork integration test replace
    
    ---------
    
    Co-authored-by: Claude <[email protected]>
    
    ---------
    
    Co-authored-by: aias00 <[email protected]>
    Co-authored-by: Claude <[email protected]>
---
 Makefile                                           |  5 +++-
 client/action.go                                   |  5 ++--
 client/options.go                                  |  7 +++--
 cluster/cluster/base/cluster_invoker_test.go       |  8 +++---
 cluster/loadbalance/loadbalance_benchmarks_test.go |  8 +++---
 common/config/environment.go                       |  4 +--
 common/constant/key.go                             | 12 ++++++---
 common/constant/version.go                         |  4 +--
 common/rpc_service_test.go                         | 24 +++++++----------
 common/url.go                                      | 12 ++++-----
 config_center/zookeeper/listener.go                |  4 +--
 filter/generic/generalizer/gson_test.go            |  4 +--
 filter/generic/generalizer/map_test.go             | 10 +++----
 filter/generic/generalizer/protobuf_json_test.go   |  4 +--
 global/protocol_config.go                          |  6 +++--
 global/provider_config.go                          |  4 ++-
 global/reference_config.go                         | 19 ++++++++++---
 go.mod                                             | 16 +++++------
 go.sum                                             | 31 +++++++++++-----------
 integrate_test.sh                                  |  9 ++-----
 loader.go                                          |  1 +
 metrics/util/aggregate/aggregator_test.go          |  4 +--
 protocol/compat.go                                 | 28 ++++++++++++++-----
 protocol/dubbo/hessian2/hessian_response_test.go   |  3 +--
 protocol/dubbo3/doc.go                             |  3 +++
 protocol/grpc/doc.go                               |  4 +++
 .../protoc-gen-dubbo/plugin/dubbo}/doc.go          |  6 +++--
 protocol/options.go                                |  2 +-
 protocol/result/result_test.go                     | 15 ++++-------
 protocol/triple/client.go                          |  4 +--
 protocol/triple/common_low_version.go              |  1 -
 protocol/triple/dubbo3_invoker.go                  |  4 +--
 protocol/triple/openapi/schema_resolver_test.go    |  2 +-
 protocol/triple/server.go                          |  8 +++---
 .../triple/triple_protocol/maxbytes_low_version.go |  1 -
 proxy/proxy_test.go                                |  4 +--
 registry/polaris/core.go                           |  5 ++--
 registry/registry.go                               |  6 +++--
 server/options.go                                  |  6 +++++
 server/server.go                                   |  8 ++++--
 40 files changed, 179 insertions(+), 132 deletions(-)

diff --git a/Makefile b/Makefile
index 3d517e31b..ca0328ef9 100644
--- a/Makefile
+++ b/Makefile
@@ -43,7 +43,7 @@ test: clean
 
 fmt: install-imports-formatter
        # replace interface{} with any
-       go run 
golang.org/x/tools/gopls/internal/analysis/modernize/cmd/[email protected] 
-any=true -fix -test ./...
+       go run 
golang.org/x/tools/gopls/internal/analysis/modernize/cmd/[email protected] -fix 
-test ./...
        go fmt ./... && GOROOT=$(shell go env GOROOT) imports-formatter
        cd $(CLI_DIR) && go fmt ./...
 
@@ -55,6 +55,9 @@ check-fmt:
                echo "Error: The following files have formatting changes:"; \
                git diff --name-only; \
                echo ""; \
+               echo "Formatting diff:"; \
+               git --no-pager diff --; \
+               echo ""; \
                echo "Please run 'make fmt' to fix formatting issues and commit 
the changes."; \
                exit 1; \
        fi
diff --git a/client/action.go b/client/action.go
index c3f4e7490..c3242f17c 100644
--- a/client/action.go
+++ b/client/action.go
@@ -138,8 +138,8 @@ func (refOpts *ReferenceOptions) refer(srv 
common.RPCService, info *ClientInfo)
                // TODO: remove TimeoutKey after old confid removed
                common.WithParamsValue(constant.TimeoutKey, 
refOpts.Consumer.RequestTimeout),
 
-               // TODO: Deprecated:use TripleConfig
-               // remove KeepAliveInterval and KeepAliveInterval in version 
4.0.0
+               // Compatibility: propagate legacy reference-level keepalive 
settings.
+               // TODO: remove KeepAliveInterval and KeepAliveTimeout in 
version 4.0.0.
                common.WithParamsValue(constant.KeepAliveInterval, 
ref.KeepAliveInterval),
                common.WithParamsValue(constant.KeepAliveTimeout, 
ref.KeepAliveTimeout),
 
@@ -149,6 +149,7 @@ func (refOpts *ReferenceOptions) refer(srv 
common.RPCService, info *ClientInfo)
 
                // for new triple non-IDL mode
                // TODO: remove ISIDL after old triple removed
+               // Compatibility: propagate the legacy IDL mode switch.
                common.WithParamsValue(constant.IDLMode, ref.IDLMode),
                common.WithAttribute(constant.ApplicationKey, 
refOpts.Application),
                common.WithAttribute(constant.ShutdownConfigPrefix, 
refOpts.Shutdown),
diff --git a/client/options.go b/client/options.go
index cae30d2e1..32526a74f 100644
--- a/client/options.go
+++ b/client/options.go
@@ -376,6 +376,9 @@ func WithSticky() ReferenceOption {
 }
 
 // TODO: remove this function after old triple removed
+//
+// Deprecated: this option will be removed in the next version. The IDL mode
+// switch is no longer supported by dubbo-go.
 func WithIDL(IDLMode string) ReferenceOption {
        return func(opts *ReferenceOptions) {
                opts.Reference.IDLMode = IDLMode
@@ -743,14 +746,14 @@ func WithClientClusterStrategy(strategy string) 
ClientOption {
        }
 }
 
-// Deprecated:use triple.WithKeepAliveInterval()
+// Deprecated: use triple.WithKeepAliveInterval()
 func WithKeepAliveInterval(keepAliveInterval time.Duration) ClientOption {
        return func(_ *ClientOptions) {
                panic("use triple.WithKeepAliveInterval()")
        }
 }
 
-// Deprecated:use triple.WithKeepAliveTimeout()
+// Deprecated: use triple.WithKeepAliveTimeout()
 func WithKeepAliveTimeout(keepAliveTimeout time.Duration) ClientOption {
        return func(_ *ClientOptions) {
                panic("use triple.WithKeepAliveTimeout()")
diff --git a/cluster/cluster/base/cluster_invoker_test.go 
b/cluster/cluster/base/cluster_invoker_test.go
index 813aabcaf..7767969c3 100644
--- a/cluster/cluster/base/cluster_invoker_test.go
+++ b/cluster/cluster/base/cluster_invoker_test.go
@@ -79,7 +79,7 @@ func TestStickyNormalWhenError(t *testing.T) {
 // with sticky enabled do not cause a data race on StickyInvoker.
 func TestStickyConcurrentDoSelect(t *testing.T) {
        var invokers []protocolbase.Invoker
-       for i := 0; i < 10; i++ {
+       for i := range 10 {
                url, _ := common.NewURL(fmt.Sprintf(baseClusterInvokerFormat, 
i))
                url.SetParam("sticky", "true")
                invokers = append(invokers, clusterpkg.NewMockInvoker(url, 1))
@@ -93,7 +93,7 @@ func TestStickyConcurrentDoSelect(t *testing.T) {
        const concurrency = 100
        var wg sync.WaitGroup
        wg.Add(concurrency)
-       for i := 0; i < concurrency; i++ {
+       for range concurrency {
                go func() {
                        defer wg.Done()
                        invoked := make([]protocolbase.Invoker, 0)
@@ -108,7 +108,7 @@ func TestStickyConcurrentDoSelect(t *testing.T) {
 // IsAvailable and DoSelect calls do not cause a data race on StickyInvoker.
 func TestStickyConcurrentIsAvailableAndDoSelect(t *testing.T) {
        var invokers []protocolbase.Invoker
-       for i := 0; i < 10; i++ {
+       for i := range 10 {
                url, _ := common.NewURL(fmt.Sprintf(baseClusterInvokerFormat, 
i))
                url.SetParam("sticky", "true")
                invokers = append(invokers, clusterpkg.NewMockInvoker(url, 1))
@@ -130,7 +130,7 @@ func TestStickyConcurrentIsAvailableAndDoSelect(t 
*testing.T) {
        const concurrency = 100
        var wg sync.WaitGroup
        wg.Add(concurrency * 2)
-       for i := 0; i < concurrency; i++ {
+       for range concurrency {
                go func() {
                        defer wg.Done()
                        base.IsAvailable()
diff --git a/cluster/loadbalance/loadbalance_benchmarks_test.go 
b/cluster/loadbalance/loadbalance_benchmarks_test.go
index 612d31ea0..cad714aa9 100644
--- a/cluster/loadbalance/loadbalance_benchmarks_test.go
+++ b/cluster/loadbalance/loadbalance_benchmarks_test.go
@@ -103,8 +103,8 @@ func BenchmarkGetWeight(b *testing.B) {
        invokers := Generate()
        inv := &invocation.RPCInvocation{}
        b.ReportAllocs()
-       b.ResetTimer()
-       for i := 0; i < b.N; i++ {
+
+       for i := 0; b.Loop(); i++ {
                loadbalance.GetWeight(invokers[i%len(invokers)], inv)
        }
 }
@@ -114,8 +114,8 @@ func BenchmarkGetWeightAt(b *testing.B) {
        inv := &invocation.RPCInvocation{}
        now := time.Now().Unix()
        b.ReportAllocs()
-       b.ResetTimer()
-       for i := 0; i < b.N; i++ {
+
+       for i := 0; b.Loop(); i++ {
                loadbalance.GetWeightAt(invokers[i%len(invokers)], inv, now)
        }
 }
diff --git a/common/config/environment.go b/common/config/environment.go
index b6655e5a8..c2a391b3b 100644
--- a/common/config/environment.go
+++ b/common/config/environment.go
@@ -138,8 +138,8 @@ func (conf *InmemoryConfiguration) GetSubProperty(subKey 
string) map[string]stru
        conf.store.Range(func(key, _ any) bool {
                if idx := strings.Index(key.(string), subKey); idx >= 0 {
                        after := key.(string)[idx+len(subKey):]
-                       if idx := strings.Index(after, "."); idx >= 0 {
-                               properties[after[0:idx]] = struct{}{}
+                       if before, _, ok := strings.Cut(after, "."); ok {
+                               properties[before] = struct{}{}
                        }
 
                }
diff --git a/common/constant/key.go b/common/constant/key.go
index 710457f71..bcd35c26a 100644
--- a/common/constant/key.go
+++ b/common/constant/key.go
@@ -66,12 +66,13 @@ const (
        MaxServerSendMsgSize        = "max-server-send-msg-size"
        MaxCallRecvMsgSize          = "max-call-recv-msg-size"
        MaxServerRecvMsgSize        = "max-server-recv-msg-size"
-
-       // TODO: remove KeepAliveInterval and KeepAliveInterval in version 4.0.0
-       KeepAliveInterval = "keep-alive-interval"
-       KeepAliveTimeout  = "keep-alive-timeout"
+       KeepAliveInterval           = "keep-alive-interval"
+       KeepAliveTimeout            = "keep-alive-timeout"
 
        // TODO: remove IDLMode after old triple removed
+       //
+       // Deprecated: this constant will be removed in the next version. The 
IDL
+       // mode switch is no longer supported by dubbo-go.
        IDLMode = "IDL-mode"
 
        TripleConfigKey     = "triple-config"
@@ -82,6 +83,9 @@ const (
 
 // TODO: remove this after old triple removed
 // IDLMode
+//
+// Deprecated: these constants will be removed in the next version. The IDL
+// mode switch is no longer supported by dubbo-go.
 const (
        IDL    = "IDL"
        NONIDL = "non-IDL"
diff --git a/common/constant/version.go b/common/constant/version.go
index 5276c635c..b9c4b207a 100644
--- a/common/constant/version.go
+++ b/common/constant/version.go
@@ -18,8 +18,8 @@
 package constant
 
 const (
-       Version      = "3.3.1"      // apache/dubbo-go version
+       Version      = "3.3.2"      // apache/dubbo-go version
        Name         = "dubbogo"    // module name
-       DATE         = "2025/12/14" // release date
+       DATE         = "2026/08/01" // release date
        RouteVersion = "v3.1"
 )
diff --git a/common/rpc_service_test.go b/common/rpc_service_test.go
index b8334e1b3..caa7b5acf 100644
--- a/common/rpc_service_test.go
+++ b/common/rpc_service_test.go
@@ -183,8 +183,7 @@ func TestMethodTypeSuiteContext(t *testing.T) {
 }
 
 func TestSuiteMethod(t *testing.T) {
-       s := &TestService{}
-       method, ok := reflect.TypeOf(s).MethodByName("MethodOne")
+       method, ok := reflect.TypeFor[*TestService]().MethodByName("MethodOne")
        assert.True(t, ok)
        methodType := suiteMethod(method)
        method = methodType.Method()
@@ -198,7 +197,7 @@ func TestSuiteMethod(t *testing.T) {
        rt := methodType.ReplyType()
        assert.Nil(t, rt)
 
-       method, ok = reflect.TypeOf(s).MethodByName("MethodTwo")
+       method, ok = reflect.TypeFor[*TestService]().MethodByName("MethodTwo")
        assert.True(t, ok)
        methodType = suiteMethod(method)
        method = methodType.Method()
@@ -211,7 +210,7 @@ func TestSuiteMethod(t *testing.T) {
        rt = methodType.ReplyType()
        assert.Equal(t, testSuiteMethodExpectedString, rt.String())
 
-       method, ok = reflect.TypeOf(s).MethodByName("MethodThree")
+       method, ok = reflect.TypeFor[*TestService]().MethodByName("MethodThree")
        assert.True(t, ok)
        methodType = suiteMethod(method)
        method = methodType.Method()
@@ -223,32 +222,31 @@ func TestSuiteMethod(t *testing.T) {
        assert.Nil(t, rt)
 
        // wrong number of in return
-       s1 := &testService{}
-       method, ok = reflect.TypeOf(s1).MethodByName("Reference")
+       method, ok = reflect.TypeFor[*testService]().MethodByName("Reference")
        assert.True(t, ok)
        methodType = suiteMethod(method)
        assert.Nil(t, methodType)
 
        // args not exported
-       method, ok = reflect.TypeOf(s1).MethodByName("Method1")
+       method, ok = reflect.TypeFor[*testService]().MethodByName("Method1")
        assert.True(t, ok)
        methodType = suiteMethod(method)
        assert.Nil(t, methodType)
 
        // Reply not exported
-       method, ok = reflect.TypeOf(s1).MethodByName("Method2")
+       method, ok = reflect.TypeFor[*testService]().MethodByName("Method2")
        assert.True(t, ok)
        methodType = suiteMethod(method)
        assert.Nil(t, methodType)
 
        // no return
-       method, ok = reflect.TypeOf(s1).MethodByName("Method3")
+       method, ok = reflect.TypeFor[*testService]().MethodByName("Method3")
        assert.True(t, ok)
        methodType = suiteMethod(method)
        assert.Nil(t, methodType)
 
        // return value is not error
-       method, ok = reflect.TypeOf(s1).MethodByName("Method4")
+       method, ok = reflect.TypeFor[*testService]().MethodByName("Method4")
        assert.True(t, ok)
        methodType = suiteMethod(method)
        assert.Nil(t, methodType)
@@ -423,8 +421,7 @@ func TestIsExportedOrBuiltinType(t *testing.T) {
        assert.True(t, isExportedOrBuiltinType(reflect.TypeFor[int]()))
 
        // Pointer to builtin
-       var i int
-       assert.True(t, isExportedOrBuiltinType(reflect.TypeOf(&i)))
+       assert.True(t, isExportedOrBuiltinType(reflect.TypeFor[*int]()))
 
        // Unexported type
        assert.False(t, isExportedOrBuiltinType(reflect.TypeFor[testService]()))
@@ -534,8 +531,7 @@ func TestUnRegisterInterfaceNotFound(t *testing.T) {
 }
 
 func TestSuitableMethodsWithMethodMapper(t *testing.T) {
-       s := &TestService{}
-       methods, methodMap := suitableMethods(reflect.TypeOf(s))
+       methods, methodMap := suitableMethods(reflect.TypeFor[*TestService]())
 
        // Check that MethodMapper renamed MethodTwo to methodTwo
        assert.Contains(t, methods, "methodTwo")
diff --git a/common/url.go b/common/url.go
index 0b21116e7..aace177d8 100644
--- a/common/url.go
+++ b/common/url.go
@@ -1326,14 +1326,14 @@ func parseLocation(location string) (host, port string) 
{
        if location == "" {
                return "", "0"
        }
-       idx := strings.IndexByte(location, ':')
-       if idx < 0 {
+       before, after, ok := strings.Cut(location, ":")
+       if !ok {
                return location, "0"
        }
-       host = location[:idx]
-       rest := location[idx+1:]
-       if j := strings.IndexByte(rest, ':'); j >= 0 {
-               return host, rest[:j]
+       host = before
+       rest := after
+       if before, _, ok := strings.Cut(rest, ":"); ok {
+               return host, before
        }
        return host, rest
 }
diff --git a/config_center/zookeeper/listener.go 
b/config_center/zookeeper/listener.go
index 9c7239532..d59692210 100644
--- a/config_center/zookeeper/listener.go
+++ b/config_center/zookeeper/listener.go
@@ -95,6 +95,6 @@ func (l *CacheListener) pathToKeyGroup(path string) (string, 
string) {
                return path, ""
        }
        groupKey := strings.ReplaceAll(strings.ReplaceAll(path, 
l.rootPath+constant.PathSeparator, ""), constant.PathSeparator, 
constant.DotSeparator)
-       index := strings.Index(groupKey, constant.DotSeparator)
-       return groupKey[index+1:], groupKey[0:index]
+       before, after, _ := strings.Cut(groupKey, constant.DotSeparator)
+       return after, before
 }
diff --git a/filter/generic/generalizer/gson_test.go 
b/filter/generic/generalizer/gson_test.go
index bcf4c86b6..b1ec9a8fd 100644
--- a/filter/generic/generalizer/gson_test.go
+++ b/filter/generic/generalizer/gson_test.go
@@ -67,7 +67,7 @@ func TestGsonGeneralizer(t *testing.T) {
        require.NoError(t, err)
        assert.JSONEq(t, 
"{\"Gender\":\"male\",\"Email\":\"[email protected]\",\"Name\":\"enableasync\",\"Age\":30,\"Child\":{\"Gender\":\"male\",\"Email\":\"[email protected]\",\"Name\":\"childName\",\"Age\":20}}",
 m.(string))
 
-       r, err := mockGsonGeneralizer.Realize(m, reflect.TypeOf(p))
+       r, err := mockGsonGeneralizer.Realize(m, 
reflect.TypeFor[mockGsonParent]())
        require.NoError(t, err)
        rMockParent, ok := r.(*mockGsonParent)
        assert.True(t, ok)
@@ -89,7 +89,7 @@ func TestGsonPointer(t *testing.T) {
 
        m, err := mockMapGeneralizer.Generalize(c)
        require.NoError(t, err)
-       newC, err := mockMapGeneralizer.Realize(m, reflect.TypeOf(c))
+       newC, err := mockMapGeneralizer.Realize(m, 
reflect.TypeFor[*mockGsonChild]())
        require.NoError(t, err)
        rMockChild, ok := newC.(*mockGsonChild)
        assert.True(t, ok)
diff --git a/filter/generic/generalizer/map_test.go 
b/filter/generic/generalizer/map_test.go
index 8a691d760..50e6d623b 100644
--- a/filter/generic/generalizer/map_test.go
+++ b/filter/generic/generalizer/map_test.go
@@ -192,7 +192,7 @@ func TestPOJOClassName(t *testing.T) {
        assert.Equal(t, "lmc", 
m.(map[string]any)["child"].(map[string]any)["name"].(string))
        assert.Equal(t, "org.apache.dubbo.mockChild", 
m.(map[string]any)["child"].(map[string]any)["class"].(string))
 
-       r, err := mockMapGeneralizer.Realize(m, reflect.TypeOf(p))
+       r, err := mockMapGeneralizer.Realize(m, reflect.TypeFor[mockParent]())
        require.NoError(t, err)
        rMockParent, ok := r.(mockParent)
        assert.True(t, ok)
@@ -227,7 +227,7 @@ func TestPOJOArray(t *testing.T) {
        assert.Equal(t, "lmc1", m.([]any)[1].(map[string]any)["name"].(string))
        assert.Equal(t, 21, m.([]any)[1].(map[string]any)["age"].(int))
 
-       r, err := mockMapGeneralizer.Realize(m, reflect.TypeOf(pojoArr))
+       r, err := mockMapGeneralizer.Realize(m, reflect.TypeFor[[]*mockChild]())
        require.NoError(t, err)
        rPojoArr, ok := r.([]*mockChild)
        assert.True(t, ok)
@@ -248,7 +248,7 @@ func TestNullField(t *testing.T) {
        m, _ := mockMapGeneralizer.Generalize(p)
        assert.Nil(t, m.(map[string]any)["child"])
 
-       r, err := mockMapGeneralizer.Realize(m, reflect.TypeOf(p))
+       r, err := mockMapGeneralizer.Realize(m, reflect.TypeFor[mockParent]())
        require.NoError(t, err)
        rMockParent, ok := r.(mockParent)
        assert.True(t, ok)
@@ -332,7 +332,7 @@ func TestGenericIncludeClass_ConfigTrue(t *testing.T) {
        _, ok = mMap["child"].(map[string]any)["class"]
        assert.True(t, ok)
 
-       r, err := mockMapGeneralizer.Realize(m, reflect.TypeOf(parent))
+       r, err := mockMapGeneralizer.Realize(m, reflect.TypeFor[mockParent]())
        require.NoError(t, err)
        rParent, ok := r.(mockParent)
        assert.True(t, ok)
@@ -372,7 +372,7 @@ func TestGenericIncludeClass_ConfigFalse(t *testing.T) {
        mMap["class"] = "org.apache.dubbo.mockParent"
        mMap["child"].(map[string]any)["class"] = "org.apache.dubbo.mockChild"
 
-       r, err := mockMapGeneralizer.Realize(m, reflect.TypeOf(parent))
+       r, err := mockMapGeneralizer.Realize(m, reflect.TypeFor[mockParent]())
        require.NoError(t, err)
        rParent, ok := r.(mockParent)
        assert.True(t, ok)
diff --git a/filter/generic/generalizer/protobuf_json_test.go 
b/filter/generic/generalizer/protobuf_json_test.go
index 46e013096..2cbf3455f 100644
--- a/filter/generic/generalizer/protobuf_json_test.go
+++ b/filter/generic/generalizer/protobuf_json_test.go
@@ -35,7 +35,7 @@ func TestProtobufJsonGeneralizer(t *testing.T) {
        }
        reqJson, err := g.Generalize(req)
        require.NoError(t, err)
-       rReq, err := g.Realize(reqJson, reflect.TypeOf(req))
+       rReq, err := g.Realize(reqJson, reflect.TypeFor[*RequestType]())
        require.NoError(t, err)
        reqObj, ok := rReq.(*RequestType)
        assert.True(t, ok)
@@ -49,7 +49,7 @@ func TestProtobufJsonGeneralizer(t *testing.T) {
        }
        respJson, err := g.Generalize(resp)
        require.NoError(t, err)
-       rResp, err := g.Realize(respJson, reflect.TypeOf(resp))
+       rResp, err := g.Realize(respJson, reflect.TypeFor[*ResponseType]())
        require.NoError(t, err)
        respObj, ok := rResp.(*ResponseType)
        assert.True(t, ok)
diff --git a/global/protocol_config.go b/global/protocol_config.go
index 3ff50647d..a0ce74f84 100644
--- a/global/protocol_config.go
+++ b/global/protocol_config.go
@@ -36,12 +36,14 @@ type ProtocolConfig struct {
        //
        // MaxServerSendMsgSize max size of server send message, 
1mb=1000kb=1000000b 1mib=1024kb=1048576b.
        // more detail to see 
https://pkg.go.dev/github.com/dustin/go-humanize#pkg-constants
-       // Deprecated:use TripleConfig
+       //
+       // Deprecated: use 
"ClientProtocolConfig.TripleConfig.MaxServerSendMsgSize" or in config tag 
"protocol_config/triple/max-server-send-msg-size" instead
        MaxServerSendMsgSize string `yaml:"max-server-send-msg-size" 
json:"max-server-send-msg-size,omitempty"`
        // TODO: remove MaxServerSendMsgSize and MaxServerRecvMsgSize when 
version 4.0.0
        //
        // MaxServerRecvMsgSize max size of server receive message
-       // Deprecated:use TripleConfig
+       //
+       // Deprecated: use 
"ClientProtocolConfig.TripleConfig.MaxServerRecvMsgSize" or in config tag 
"protocol_config/triple/max-server-recv-msg-size" instead
        MaxServerRecvMsgSize string `default:"4mib" 
yaml:"max-server-recv-msg-size" json:"max-server-recv-msg-size,omitempty"`
 }
 
diff --git a/global/provider_config.go b/global/provider_config.go
index fbb35e141..8430c51d1 100644
--- a/global/provider_config.go
+++ b/global/provider_config.go
@@ -25,7 +25,9 @@ import (
 type ProviderConfig struct {
        ServiceConfig
        Filter string `yaml:"filter" json:"filter,omitempty" property:"filter"`
-       // Deprecated Register whether registration is required
+       // Register reports whether registration is required.
+       //
+       // Deprecated: this field is retained only for compatibility with 
legacy configuration.
        Register bool `yaml:"register" json:"register" property:"register"`
        // RegistryIDs is registry ids list
        RegistryIDs []string `yaml:"registry-ids" json:"registry-ids" 
property:"registry-ids"`
diff --git a/global/reference_config.go b/global/reference_config.go
index 8d22cf2e3..f6daa0373 100644
--- a/global/reference_config.go
+++ b/global/reference_config.go
@@ -51,13 +51,20 @@ type ReferenceConfig struct {
        // TODO: rename protocol_config to protocol when publish 4.0.0.
        ProtocolClientConfig *ClientProtocolConfig `yaml:"protocol_config" 
json:"protocol_config,omitempty" property:"protocol_config"`
 
-       // TODO: Deprecated:use TripleConfig
-       // remove KeepAliveInterval and KeepAliveInterval in version 4.0.0
+       // TODO: remove KeepAliveInterval and KeepAliveTimeout in version 4.0.0.
+       //
+       // Deprecated: use ClientProtocolConfig.TripleConfig.KeepAliveInterval 
or the
+       // "protocol_config/triple/keep-alive-interval" configuration key 
instead.
        KeepAliveInterval string `yaml:"keep-alive-interval" 
json:"keep-alive-interval,omitempty" property:"keep-alive-interval"`
-       KeepAliveTimeout  string `yaml:"keep-alive-timeout" 
json:"keep-alive-timeout,omitempty" property:"keep-alive-timeout"`
+       // Deprecated: use ClientProtocolConfig.TripleConfig.KeepAliveTimeout 
or the
+       // "protocol_config/triple/keep-alive-timeout" configuration key 
instead.
+       KeepAliveTimeout string `yaml:"keep-alive-timeout" 
json:"keep-alive-timeout,omitempty" property:"keep-alive-timeout"`
 
        // just for new triple non-IDL mode
        // TODO: remove IDLMode when config package is removed
+       //
+       // Deprecated: this field will be removed in the next version. The IDL 
mode
+       // switch is no longer supported by dubbo-go.
        IDLMode string
 }
 
@@ -333,12 +340,18 @@ func WithReference_MeshProviderPort(port int) 
ReferenceOption {
        }
 }
 
+// WithReference_KeepAliveInterval configures the legacy keepalive interval.
+//
+// Deprecated: configure ClientProtocolConfig.TripleConfig.KeepAliveInterval 
instead.
 func WithReference_KeepAliveInterval(interval string) ReferenceOption {
        return func(cfg *ReferenceConfig) {
                cfg.KeepAliveInterval = interval
        }
 }
 
+// WithReference_KeepAliveTimeout configures the legacy keepalive timeout.
+//
+// Deprecated: configure ClientProtocolConfig.TripleConfig.KeepAliveTimeout 
instead.
 func WithReference_KeepAliveTimeout(timeout string) ReferenceOption {
        return func(cfg *ReferenceConfig) {
                cfg.KeepAliveTimeout = timeout
diff --git a/go.mod b/go.mod
index 258fe3d37..fc976ef18 100644
--- a/go.mod
+++ b/go.mod
@@ -61,9 +61,9 @@ require (
        go.opentelemetry.io/otel/trace v1.21.0
        go.uber.org/atomic v1.10.0
        go.uber.org/zap v1.21.0
-       golang.org/x/net v0.55.0
-       golang.org/x/sync v0.20.0
-       golang.org/x/tools v0.44.0
+       golang.org/x/net v0.56.0
+       golang.org/x/sync v0.21.0
+       golang.org/x/tools v0.47.0
        google.golang.org/grpc v1.64.1
        google.golang.org/protobuf v1.34.2
        gopkg.in/natefinch/lumberjack.v2 v2.2.1
@@ -79,7 +79,7 @@ require (
        github.com/aliyun/alibabacloud-dkms-transfer-go-sdk v0.1.7 // indirect
        github.com/beorn7/perks v1.0.1 // indirect
        github.com/bits-and-blooms/bitset v1.2.0 // indirect
-       github.com/buger/jsonparser v1.1.1 // indirect
+       github.com/buger/jsonparser v1.2.0 // indirect
        github.com/cespare/xxhash/v2 v2.3.0 // indirect
        github.com/coreos/go-semver v0.3.0 // indirect
        github.com/coreos/go-systemd/v22 v22.3.2 // indirect
@@ -137,10 +137,10 @@ require (
        go.opentelemetry.io/otel/metric v1.21.0 // indirect
        go.opentelemetry.io/proto/otlp v1.0.0 // indirect
        go.uber.org/multierr v1.8.0 // indirect
-       golang.org/x/crypto v0.51.0 // indirect
-       golang.org/x/mod v0.35.0 // indirect
-       golang.org/x/sys v0.45.0 // indirect
-       golang.org/x/text v0.37.0 // indirect
+       golang.org/x/crypto v0.53.0 // indirect
+       golang.org/x/mod v0.37.0 // indirect
+       golang.org/x/sys v0.46.0 // indirect
+       golang.org/x/text v0.39.0 // indirect
        golang.org/x/time v0.15.0 // indirect
        google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // 
indirect
        google.golang.org/genproto/googleapis/api 
v0.0.0-20240318140521-94a12d6c2237 // indirect
diff --git a/go.sum b/go.sum
index e7a3fa0d4..92f5b11f4 100644
--- a/go.sum
+++ b/go.sum
@@ -121,8 +121,9 @@ github.com/bits-and-blooms/bitset v1.2.0/go.mod 
h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edY
 github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod 
h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
 github.com/bketelsen/crypt v0.0.4/go.mod 
h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM=
 github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod 
h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
-github.com/buger/jsonparser v1.1.1 
h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
 github.com/buger/jsonparser v1.1.1/go.mod 
h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
+github.com/buger/jsonparser v1.2.0 
h1:4EFcvK1kD4jyj6YqNK6skK6w+y7FHHBR+XBCtxwu/6g=
+github.com/buger/jsonparser v1.2.0/go.mod 
h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
 github.com/casbin/casbin/v2 v2.1.2/go.mod 
h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
 github.com/cenkalti/backoff v2.2.1+incompatible/go.mod 
h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
 github.com/cenkalti/backoff/v4 v4.2.1 
h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
@@ -916,8 +917,8 @@ golang.org/x/crypto 
v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPh
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod 
h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod 
h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod 
h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI=
-golang.org/x/crypto v0.51.0/go.mod 
h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8=
+golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto=
+golang.org/x/crypto v0.53.0/go.mod 
h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio=
 golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod 
h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod 
h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod 
h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -960,8 +961,8 @@ golang.org/x/mod v0.4.0/go.mod 
h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod 
h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
-golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM=
-golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU=
+golang.org/x/mod v0.37.0 h1:vF1DjpVEshcIqoEaauuHebaLk1O1forxjxBaVn884JQ=
+golang.org/x/mod v0.37.0/go.mod h1:m8S8VeM9r4dzDwjrKO0a1sZP3YjeMamRRlD+fmR2Q/0=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod 
h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -1014,8 +1015,8 @@ golang.org/x/net 
v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qx
 golang.org/x/net v0.0.0-20211105192438-b53810dc28af/go.mod 
h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod 
h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod 
h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
-golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8=
-golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww=
+golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o=
+golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod 
h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod 
h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod 
h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -1042,8 +1043,8 @@ golang.org/x/sync 
v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
-golang.org/x/sync v0.20.0/go.mod 
h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
+golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM=
+golang.org/x/sync v0.21.0/go.mod 
h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
 golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1130,8 +1131,8 @@ golang.org/x/sys 
v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY=
-golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
+golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw=
+golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod 
h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod 
h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod 
h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1145,8 +1146,8 @@ golang.org/x/text v0.3.5/go.mod 
h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
-golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc=
-golang.org/x/text v0.37.0/go.mod 
h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38=
+golang.org/x/text v0.39.0 h1:UbZz4pLOvn600D6Oh6GGEI6VAmndrEBLv8/6BEXzyus=
+golang.org/x/text v0.39.0/go.mod 
h1:3UwRclnC2g0TU9x8PZiyfOajCd1zaUNHF9cvqcQZ+ZM=
 golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod 
h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod 
h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod 
h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1220,8 +1221,8 @@ golang.org/x/tools v0.1.1/go.mod 
h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.2/go.mod 
h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.5/go.mod 
h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.12/go.mod 
h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
-golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c=
-golang.org/x/tools v0.44.0/go.mod 
h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI=
+golang.org/x/tools v0.47.0 h1:7Kn5x/d1svx/PzryTsqeoZN4TZwqeH5pGWjefhLi/1Q=
+golang.org/x/tools v0.47.0/go.mod 
h1:dFHnyTvFWY212G+h7ZY4Vsp/K3U4/7W9TyVaAul8uCA=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
diff --git a/integrate_test.sh b/integrate_test.sh
index 9a973a80e..a4fdbc3fa 100755
--- a/integrate_test.sh
+++ b/integrate_test.sh
@@ -27,13 +27,8 @@ echo "integrate-test root work-space -> ${ROOT_DIR}"
 echo "use dubbo-go-samples $3 branch for integration testing"
 git clone -b $3 https://github.com/apache/dubbo-go-samples.git samples 
--depth=1 && cd samples
 
-# update dubbo-go to current commit id
-if [ "$1" == "apache/dubbo-go" ]; then
-    go mod edit 
-replace=dubbo.apache.org/dubbo-go/v3=dubbo.apache.org/dubbo-go/v3@"$2"
-else
-    export GONOSUMDB="${GONOSUMDB:+${GONOSUMDB},}github.com/$1/v3"
-    go mod edit -replace=dubbo.apache.org/dubbo-go/v3=github.com/"$1"/v3@"$2"
-fi
+# Use the checked-out dubbo-go source for integration testing.
+go mod edit -replace=dubbo.apache.org/dubbo-go/v3="${ROOT_DIR}"
 
 go mod tidy
 
diff --git a/loader.go b/loader.go
index 94b3da53e..48463db7d 100644
--- a/loader.go
+++ b/loader.go
@@ -224,6 +224,7 @@ func (fn loaderConfigFunc) apply(vc *loaderConf) {
 }
 
 // WithGenre set load config file suffix
+//
 // Deprecated: replaced by WithSuffix
 func WithGenre(suffix string) LoaderConfOption {
        return loaderConfigFunc(func(conf *loaderConf) {
diff --git a/metrics/util/aggregate/aggregator_test.go 
b/metrics/util/aggregate/aggregator_test.go
index aa74a1d02..ccd59379e 100644
--- a/metrics/util/aggregate/aggregator_test.go
+++ b/metrics/util/aggregate/aggregator_test.go
@@ -60,7 +60,7 @@ func TestTimeWindowAggregatorAddAndResult(t *testing.T) {
 func BenchmarkTimeWindowAggregatorAdd(b *testing.B) {
        wg := sync.WaitGroup{}
        tw := NewTimeWindowAggregator(10, 1)
-       for i := 0; i < b.N; i++ {
+       for b.Loop() {
                wg.Go(func() {
                        tw.Add(rand.Float64() * 100) //NOSONAR
                })
@@ -71,7 +71,7 @@ func BenchmarkTimeWindowAggregatorAdd(b *testing.B) {
 func BenchmarkTimeWindowAggregatorResult(b *testing.B) {
        wg := sync.WaitGroup{}
        tw := NewTimeWindowAggregator(10, 1)
-       for i := 0; i < b.N; i++ {
+       for b.Loop() {
                wg.Add(1)
                go func() {
                        tw.Add(rand.Float64() * 100) //NOSONAR
diff --git a/protocol/compat.go b/protocol/compat.go
index 6910d977d..6894086b1 100644
--- a/protocol/compat.go
+++ b/protocol/compat.go
@@ -22,23 +22,37 @@ import (
        "dubbo.apache.org/dubbo-go/v3/protocol/result"
 )
 
-// Protocol Deprecated: base.Protocol type alias, just for compatible with old 
generate pb.go file
+// Protocol is an alias retained for compatibility with old generated code.
+//
+// Deprecated: use base.Protocol instead.
 type Protocol = base.Protocol
 
-// Invoker Deprecated: base.Invoker type alias, just for compatible with old 
generate pb.go file
+// Invoker is an alias retained for compatibility with old generated code.
+//
+// Deprecated: use base.Invoker instead.
 type Invoker = base.Invoker
 
-// Exporter Deprecated: base.Exporter type alias, just for compatible with old 
generate pb.go file
+// Exporter is an alias retained for compatibility with old generated code.
+//
+// Deprecated: use base.Exporter instead.
 type Exporter = base.Exporter
 
-// Invocation Deprecated: base.Invocation type alias, just for compatible with 
old generate pb.go file
+// Invocation is an alias retained for compatibility with old generated code.
+//
+// Deprecated: use base.Invocation instead.
 type Invocation = base.Invocation
 
-// Result Deprecated: base.Result type alias, just for compatible with old 
generate pb.go file
+// Result is an alias retained for compatibility with old generated code.
+//
+// Deprecated: use result.Result instead.
 type Result = result.Result
 
-// RPCResult Deprecated: base.RPCResult type alias, just for compatible with 
old generate pb.go file
+// RPCResult is an alias retained for compatibility with old generated code.
+//
+// Deprecated: use result.RPCResult instead.
 type RPCResult = result.RPCResult
 
-// RPCStatue Deprecated: base.RPCStatue type alias, just for compatible with 
old generate pb.go file
+// RPCStatue is an alias retained for compatibility with old generated code.
+//
+// Deprecated: use base.RPCStatus instead.
 type RPCStatue = base.RPCStatus
diff --git a/protocol/dubbo/hessian2/hessian_response_test.go 
b/protocol/dubbo/hessian2/hessian_response_test.go
index 6f22b6d5d..bfa4559e3 100644
--- a/protocol/dubbo/hessian2/hessian_response_test.go
+++ b/protocol/dubbo/hessian2/hessian_response_test.go
@@ -103,8 +103,7 @@ func TestReflectResponse(t *testing.T) {
 
        // ------ interface test -------
        in1 := []any{rr{"dubbo", 666}, 123, "hello"}
-       var inr1 *any
-       doTestReflectResponse(t, in1, 
reflect.New(reflect.TypeOf(inr1).Elem()).Interface())
+       doTestReflectResponse(t, in1, 
reflect.New(reflect.TypeFor[any]()).Interface())
 
        in2 := make(map[string]rr)
        var inr2 map[string]rr
diff --git a/protocol/dubbo3/doc.go b/protocol/dubbo3/doc.go
index a0ff21779..dbef8b3d7 100644
--- a/protocol/dubbo3/doc.go
+++ b/protocol/dubbo3/doc.go
@@ -16,4 +16,7 @@
  */
 
 // Package dubbo3 implements dubbo3.0 rpc protocol.
+//
+// Deprecated: this implementation will be removed in the next version. Use
+// dubbo.apache.org/dubbo-go/v3/protocol/triple instead.
 package dubbo3
diff --git a/protocol/grpc/doc.go b/protocol/grpc/doc.go
index 226191a0d..e4919205c 100644
--- a/protocol/grpc/doc.go
+++ b/protocol/grpc/doc.go
@@ -16,4 +16,8 @@
  */
 
 // Package grpc  implements grpc rpc protocol.
+//
+// Deprecated: this implementation will be removed in the next version. Use
+// dubbo.apache.org/dubbo-go/v3/protocol/triple instead, which is compatible
+// with gRPC.
 package grpc
diff --git a/protocol/dubbo3/doc.go 
b/protocol/grpc/protoc-gen-dubbo/plugin/dubbo/doc.go
similarity index 83%
copy from protocol/dubbo3/doc.go
copy to protocol/grpc/protoc-gen-dubbo/plugin/dubbo/doc.go
index a0ff21779..c0e87f3cc 100644
--- a/protocol/dubbo3/doc.go
+++ b/protocol/grpc/protoc-gen-dubbo/plugin/dubbo/doc.go
@@ -15,5 +15,7 @@
  * limitations under the License.
  */
 
-// Package dubbo3 implements dubbo3.0 rpc protocol.
-package dubbo3
+// Package dubbo implements the legacy gRPC code generator plugin.
+//
+// Deprecated: use dubbo.apache.org/dubbo-go/v3/protocol/triple instead.
+package dubbo
diff --git a/protocol/options.go b/protocol/options.go
index 11bdc368f..f090eb6d7 100644
--- a/protocol/options.go
+++ b/protocol/options.go
@@ -279,7 +279,7 @@ func WithParams(params any) ServerOption {
        return &paramsOption{params}
 }
 
-// Deprecated:use triple.WithMaxServerSendMsgSize instead.
+// Deprecated: use triple.WithMaxServerSendMsgSize instead.
 func WithMaxServerSendMsgSize(size string) ServerOption {
        panic("use triple.WithMaxServerSendMsgSize()")
 }
diff --git a/protocol/result/result_test.go b/protocol/result/result_test.go
index 8939d080c..2445a6f1d 100644
--- a/protocol/result/result_test.go
+++ b/protocol/result/result_test.go
@@ -781,8 +781,7 @@ func BenchmarkRPCResult_SetError(b *testing.B) {
        r := &RPCResult{}
        err := errors.New("test error")
 
-       b.ResetTimer()
-       for i := 0; i < b.N; i++ {
+       for b.Loop() {
                r.SetError(err)
        }
 }
@@ -791,8 +790,7 @@ func BenchmarkRPCResult_SetResult(b *testing.B) {
        r := &RPCResult{}
        result := "test result"
 
-       b.ResetTimer()
-       for i := 0; i < b.N; i++ {
+       for b.Loop() {
                r.SetResult(result)
        }
 }
@@ -800,8 +798,7 @@ func BenchmarkRPCResult_SetResult(b *testing.B) {
 func BenchmarkRPCResult_AddAttachment(b *testing.B) {
        r := &RPCResult{}
 
-       b.ResetTimer()
-       for i := 0; i < b.N; i++ {
+       for i := 0; b.Loop(); i++ {
                r.AddAttachment(fmt.Sprintf("key-%d", i), "value")
        }
 }
@@ -810,8 +807,7 @@ func BenchmarkRPCResult_Attachment(b *testing.B) {
        r := &RPCResult{}
        r.Attrs = map[string]any{"key": "value"}
 
-       b.ResetTimer()
-       for i := 0; i < b.N; i++ {
+       for b.Loop() {
                _ = r.Attachment("key", "default")
        }
 }
@@ -823,8 +819,7 @@ func BenchmarkRPCResult_String(b *testing.B) {
                Err:   errors.New("test error"),
        }
 
-       b.ResetTimer()
-       for i := 0; i < b.N; i++ {
+       for b.Loop() {
                _ = r.String()
        }
 }
diff --git a/protocol/triple/client.go b/protocol/triple/client.go
index 6360972dd..a7dbd7d85 100644
--- a/protocol/triple/client.go
+++ b/protocol/triple/client.go
@@ -313,8 +313,8 @@ func genKeepAliveOptions(url *common.URL, tripleConf 
*global.TripleConfig) ([]tr
        cliKeepAliveOpts = append(cliKeepAliveOpts, 
tri.WithSendMaxBytes(maxCallSendMsgSize))
 
        // set keepalive interval and keepalive timeout
-       // Deprecated:use tripleconfig
-       // TODO: remove KeepAliveInterval and KeepAliveInterval in version 4.0.0
+       // Compatibility: read legacy URL keepalive parameters.
+       // TODO: remove KeepAliveInterval and KeepAliveTimeout in version 4.0.0.
        keepAliveInterval := url.GetParamDuration(constant.KeepAliveInterval, 
constant.DefaultKeepAliveInterval)
        keepAliveTimeout := url.GetParamDuration(constant.KeepAliveTimeout, 
constant.DefaultKeepAliveTimeout)
 
diff --git a/protocol/triple/common_low_version.go 
b/protocol/triple/common_low_version.go
index b2d8f5836..c6292a0e2 100644
--- a/protocol/triple/common_low_version.go
+++ b/protocol/triple/common_low_version.go
@@ -1,5 +1,4 @@
 //go:build !go1.19
-// +build !go1.19
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
diff --git a/protocol/triple/dubbo3_invoker.go 
b/protocol/triple/dubbo3_invoker.go
index 87da15895..65bd0634a 100644
--- a/protocol/triple/dubbo3_invoker.go
+++ b/protocol/triple/dubbo3_invoker.go
@@ -103,8 +103,8 @@ func NewDubbo3Invoker(url *common.URL) (*DubboInvoker, 
error) {
        opts = append(opts, 
triConfig.WithGRPCMaxCallSendMessageSize(maxCallSendMsgSize))
 
        // grpc keepalive config
-       // Deprecated:use tripleconfig
-       // TODO: remove KeepAliveInterval and KeepAliveInterval in version 4.0.0
+       // Compatibility: read legacy URL keepalive parameters.
+       // TODO: remove KeepAliveInterval and KeepAliveTimeout in version 4.0.0.
        keepAliveInterval := url.GetParamDuration(constant.KeepAliveInterval, 
constant.DefaultKeepAliveInterval)
        keepAliveTimeout := url.GetParamDuration(constant.KeepAliveTimeout, 
constant.DefaultKeepAliveTimeout)
 
diff --git a/protocol/triple/openapi/schema_resolver_test.go 
b/protocol/triple/openapi/schema_resolver_test.go
index fed353530..4c24ee336 100644
--- a/protocol/triple/openapi/schema_resolver_test.go
+++ b/protocol/triple/openapi/schema_resolver_test.go
@@ -92,7 +92,7 @@ func TestSchemaResolver_Resolve_BasicTypes(t *testing.T) {
                wantFmt  string
        }{
                {"string", reflect.TypeFor[string](), model.SchemaTypeString, 
""},
-               {"bool", reflect.TypeOf(true), model.SchemaTypeBoolean, ""},
+               {"bool", reflect.TypeFor[bool](), model.SchemaTypeBoolean, ""},
                {"int", reflect.TypeFor[int](), model.SchemaTypeInteger, ""},
                {"int8", reflect.TypeFor[int8](), model.SchemaTypeInteger, ""},
                {"int16", reflect.TypeFor[int16](), model.SchemaTypeInteger, 
""},
diff --git a/protocol/triple/server.go b/protocol/triple/server.go
index a9015e40d..fc7225b6b 100644
--- a/protocol/triple/server.go
+++ b/protocol/triple/server.go
@@ -390,16 +390,16 @@ func getHanOpts(url *common.URL, tripleConf 
*global.TripleConfig) (hanOpts []tri
        version := url.GetParam(constant.VersionKey, "")
        hanOpts = append(hanOpts, tri.WithGroup(group), 
tri.WithVersion(version))
 
-       // Deprecated:use TripleConfig
-       // TODO: remove MaxServerSendMsgSize and MaxServerRecvMsgSize when 
version 4.0.0
+       // Compatibility: read the legacy URL receive-size parameter.
+       // TODO: remove MaxServerRecvMsgSize in version 4.0.0.
        maxServerRecvMsgSize := constant.DefaultMaxServerRecvMsgSize
        if recvMsgSize, convertErr := 
humanize.ParseBytes(url.GetParam(constant.MaxServerRecvMsgSize, "")); 
convertErr == nil && recvMsgSize != 0 {
                maxServerRecvMsgSize = int(recvMsgSize)
        }
        hanOpts = append(hanOpts, tri.WithReadMaxBytes(maxServerRecvMsgSize))
 
-       // Deprecated:use TripleConfig
-       // TODO: remove MaxServerSendMsgSize and MaxServerRecvMsgSize when 
version 4.0.0
+       // Compatibility: read the legacy URL send-size parameter.
+       // TODO: remove MaxServerSendMsgSize in version 4.0.0.
        maxServerSendMsgSize := constant.DefaultMaxServerSendMsgSize
        if sendMsgSize, convertErr := 
humanize.ParseBytes(url.GetParam(constant.MaxServerSendMsgSize, "")); 
convertErr == nil && sendMsgSize != 0 {
                maxServerSendMsgSize = int(sendMsgSize)
diff --git a/protocol/triple/triple_protocol/maxbytes_low_version.go 
b/protocol/triple/triple_protocol/maxbytes_low_version.go
index 93ca7e9dd..5ab3fb8ef 100644
--- a/protocol/triple/triple_protocol/maxbytes_low_version.go
+++ b/protocol/triple/triple_protocol/maxbytes_low_version.go
@@ -1,5 +1,4 @@
 //go:build !go1.19
-// +build !go1.19
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one or more
diff --git a/proxy/proxy_test.go b/proxy/proxy_test.go
index b2a04136b..a80b7e569 100644
--- a/proxy/proxy_test.go
+++ b/proxy/proxy_test.go
@@ -75,9 +75,9 @@ func TestProxyImplement(t *testing.T) {
        require.NoError(t, err)
        assert.Nil(t, ret) // ret is nil, because it doesn't be injection yet
 
-       ret2, err := p.Get().(*TestService).MethodFour(0, false)
+       _, err = p.Get().(*TestService).MethodFour(0, false)
        require.NoError(t, err)
-       assert.Equal(t, "*interface {}", reflect.TypeOf(ret2).String())
+       assert.Equal(t, "*interface {}", reflect.TypeFor[*any]().String())
        err = p.Get().(*TestService).Echo(nil, nil)
        require.NoError(t, err)
 
diff --git a/registry/polaris/core.go b/registry/polaris/core.go
index 82d90df31..e0510eb9b 100644
--- a/registry/polaris/core.go
+++ b/registry/polaris/core.go
@@ -18,6 +18,7 @@
 package polaris
 
 import (
+       "maps"
        "sync"
        "time"
 )
@@ -444,9 +445,7 @@ func copyStringMap(source map[string]string) 
map[string]string {
                return nil
        }
        copied := make(map[string]string, len(source))
-       for key, value := range source {
-               copied[key] = value
-       }
+       maps.Copy(copied, source)
        return copied
 }
 
diff --git a/registry/registry.go b/registry/registry.go
index 663436d4b..6a500e863 100644
--- a/registry/registry.go
+++ b/registry/registry.go
@@ -46,7 +46,7 @@ type Registry interface {
        // Will remove in dubbogo version v1.1.0
        // mode1: return Listener with Next function which can return
        //        subscribe service event from registry
-       // Deprecated!
+       // Legacy mode (removed):
        // subscribe(event.URL) (Listener, error)
        // Will replace mode1 in dubbogo version v1.1.0
        // mode2: callback mode, subscribe with notify(notify listener).
@@ -81,7 +81,9 @@ type NotifyListener interface {
        NotifyAll([]*ServiceEvent, func())
 }
 
-// Listener Deprecated!
+// Listener receives registry service events.
+//
+// Deprecated: use the callback-based NotifyListener API instead.
 type Listener interface {
        // Next returns next service event once received
        Next() (*ServiceEvent, error)
diff --git a/server/options.go b/server/options.go
index 9a3f14450..869a2d11f 100644
--- a/server/options.go
+++ b/server/options.go
@@ -499,6 +499,9 @@ type ServiceOptions struct {
        // for triple non-IDL mode
        // consider put here or global.ServiceConfig
        // string for url
+       //
+       // Deprecated: this implementation will be removed in the next release.
+       // The IDLMode switch will no longer be supported by dubbo-go.
        IDLMode string
 
        // openapi group for documentation
@@ -905,6 +908,9 @@ func WithOpenAPIGroup(group string) ServiceOption {
 }
 
 // TODO: remove when config package is removed
+//
+// Deprecated: this option will be removed in the next version. The IDL mode
+// switch is no longer supported by dubbo-go.
 func WithIDLMode(IDLMode string) ServiceOption {
        return func(opts *ServiceOptions) {
                opts.IDLMode = IDLMode
diff --git a/server/server.go b/server/server.go
index b8971acf1..9969605f4 100644
--- a/server/server.go
+++ b/server/server.go
@@ -64,10 +64,14 @@ type Server struct {
        attachedHTTPHandler http.Handler
 }
 
-// ServiceInfo Deprecated: common.ServiceInfo type alias, just for compatible 
with old generate pb.go file
+// ServiceInfo is an alias retained for compatibility with old generated code.
+//
+// Deprecated: use common.ServiceInfo instead.
 type ServiceInfo = common.ServiceInfo
 
-// MethodInfo Deprecated: common.MethodInfo type alias, just for compatible 
with old generate pb.go file
+// MethodInfo is an alias retained for compatibility with old generated code.
+//
+// Deprecated: use common.MethodInfo instead.
 type MethodInfo = common.MethodInfo
 
 type ServiceDefinition struct {

Reply via email to