You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2021/09/10 14:44:59 UTC

[dubbo-go-samples] branch config-enhance updated: Feat: Update generic/default structure to support multiple protocols (#238)

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

alexstocks pushed a commit to branch config-enhance
in repository https://gitbox.apache.org/repos/asf/dubbo-go-samples.git


The following commit(s) were added to refs/heads/config-enhance by this push:
     new d62fe3f  Feat: Update generic/default structure to support multiple protocols  (#238)
d62fe3f is described below

commit d62fe3fa323e960802f6b8558296ec247c2676db
Author: XavierNiu <a...@nxw.name>
AuthorDate: Fri Sep 10 22:43:38 2021 +0800

    Feat: Update generic/default structure to support multiple protocols  (#238)
    
    * rft: generic invocation samples
    
    * go fmt
    
    * fix(generic): integrated tests support multiple protocols
    
    * fix(codestyle): go fmt
    
    * fix(license): add apache license
    
    * fix(bash): update start_integrate_test.sh structure
    
    * fix(codestyle): 3-block styles
    
    Co-authored-by: niuxuewei.xavier <ni...@bytedance.com>
---
 context/dubbo/go-client/cmd/client.go              |   2 +
 context/dubbo/go-server/cmd/server.go              |   1 +
 generic/default/go-client/cmd/client.go            | 188 ++++++++++-----------
 generic/default/go-client/conf/dubbogo.yml         |  12 --
 generic/default/go-server/conf/dubbogo.yml         |   9 +-
 generic/default/go-server/pkg/init.go              |  32 ++++
 generic/default/go-server/pkg/user.go              | 140 +--------------
 .../go-server/pkg/{user.go => user_provider.go}    |  40 +----
 .../pkg/{user.go => user_provider_triple.go}       |  65 ++-----
 generic/default/go-server/pkg/user_response.go     |  26 +++
 .../generic/default/tests/integration/main_test.go |  33 ++--
 .../default/tests/integration/userprovider_test.go |  18 +-
 rpc/grpc/protobuf/helloworld.pb.go                 |  10 +-
 .../pb/dubbogo-grpc/protobuf/grpc/helloworld.pb.go |   8 +-
 .../protobuf/grpc/helloworld_grpc.pb.go            |   3 +
 start_integrate_test.sh                            |  16 +-
 16 files changed, 224 insertions(+), 379 deletions(-)

diff --git a/context/dubbo/go-client/cmd/client.go b/context/dubbo/go-client/cmd/client.go
index 3b2bacb..ede8b29 100644
--- a/context/dubbo/go-client/cmd/client.go
+++ b/context/dubbo/go-client/cmd/client.go
@@ -26,7 +26,9 @@ import (
 	"dubbo.apache.org/dubbo-go/v3/common/constant"
 	"dubbo.apache.org/dubbo-go/v3/config"
 	_ "dubbo.apache.org/dubbo-go/v3/imports"
+
 	hessian "github.com/apache/dubbo-go-hessian2"
+
 	"github.com/dubbogo/gost/log"
 )
 
diff --git a/context/dubbo/go-server/cmd/server.go b/context/dubbo/go-server/cmd/server.go
index b251a95..9f1feaf 100644
--- a/context/dubbo/go-server/cmd/server.go
+++ b/context/dubbo/go-server/cmd/server.go
@@ -31,6 +31,7 @@ import (
 	"dubbo.apache.org/dubbo-go/v3/common/logger"
 	"dubbo.apache.org/dubbo-go/v3/config"
 	_ "dubbo.apache.org/dubbo-go/v3/imports"
+
 	hessian "github.com/apache/dubbo-go-hessian2"
 
 	gxlog "github.com/dubbogo/gost/log"
diff --git a/generic/default/go-client/cmd/client.go b/generic/default/go-client/cmd/client.go
index 1af7b8c..5c62f2b 100644
--- a/generic/default/go-client/cmd/client.go
+++ b/generic/default/go-client/cmd/client.go
@@ -46,73 +46,33 @@ import (
 )
 
 var (
-	appName         = "dubbo.io"
-	referenceConfig config.ReferenceConfig
+	appName = "dubbo.io"
 )
 
-func init() {
-	registryConfig := &config.RegistryConfig{
-		Protocol: "zookeeper",
-		Address:  "127.0.0.1:2181",
-	}
-
-	referenceConfig = config.ReferenceConfig{
-		InterfaceName: "org.apache.dubbo.UserProvider",
-		Cluster:       "failover",
-		Registry:      []string{"zk"},
-		Protocol:      dubbo.DUBBO,
-		Generic:       "true",
-	}
-
-	rootConfig := config.NewRootConfig(config.WithRootRegistryConfig("zk", registryConfig))
-	_ = rootConfig.Init()
-	_ = referenceConfig.Init(rootConfig)
-	referenceConfig.GenericLoad(appName)
-}
-
 // export DUBBO_GO_CONFIG_PATH= PATH_TO_SAMPLES/generic/default/go-client/conf/dubbogo.yml
 func main() {
+	// register POJOs
 	hessian.RegisterPOJO(&pkg.User{})
 
-	callGetUser()
-	//callGetOneUser()
-	callGetUsers()
-	callGetUsersMap()
-	callQueryUser()
-	callQueryUsers()
-	//callQueryAll()
+	// generic invocation samples using hessian serialization on Dubbo protocol
+	dubboRefConf := newRefConf("org.apache.dubbo.samples.UserProvider", dubbo.DUBBO)
 
-	initSignal()
-}
+	callGetUser(dubboRefConf)
+	//callGetOneUser(dubboRefConf)
+	callGetUsers(dubboRefConf)
+	callGetUsersMap(dubboRefConf)
+	callQueryUser(dubboRefConf)
+	callQueryUsers(dubboRefConf)
+	//callQueryAll(dubboRefConf)
 
-func initSignal() {
-	signals := make(chan os.Signal, 1)
-	// It is not possible to block SIGKILL or syscall.SIGSTOP
-	signal.Notify(signals, os.Interrupt, os.Kill, syscall.SIGHUP,
-		syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
-	for {
-		sig := <-signals
-		logger.Infof("get signal %s", sig.String())
-		switch sig {
-		case syscall.SIGHUP:
-			// reload()
-		default:
-			time.AfterFunc(10*time.Second, func() {
-				logger.Warnf("app exit now by force...")
-				os.Exit(1)
-			})
+	// generic invocation samples using hessian serialization on Triple protocol
+	//tripleRefConf := newRefConf("org.apache.dubbo.samples.UserProviderTriple", tpconst.TRIPLE)
 
-			// The program exits normally or timeout forcibly exits.
-			fmt.Println("app exit now...")
-			return
-		}
-	}
+	initSignal()
 }
 
-func callGetUser() {
-	logger.Infof("Call GetUser")
-	logger.Infof("Start to generic invoke")
-	resp, err := referenceConfig.GetRPCService().(*generic.GenericService).Invoke(
+func callGetUser(refConf config.ReferenceConfig) {
+	resp, err := refConf.GetRPCService().(*generic.GenericService).Invoke(
 		context.TODO(),
 		[]interface{}{
 			"GetUser1",
@@ -123,9 +83,9 @@ func callGetUser() {
 	if err != nil {
 		panic(err)
 	}
-	logger.Infof("\n\nGetUser1(userId string) res: %+v\n", resp)
+	logger.Infof("GetUser1(userId string) res: %+v", resp)
 
-	resp, err = referenceConfig.GetRPCService().(*generic.GenericService).Invoke(
+	resp, err = refConf.GetRPCService().(*generic.GenericService).Invoke(
 		context.TODO(),
 		[]interface{}{
 			"GetUser2",
@@ -136,9 +96,9 @@ func callGetUser() {
 	if err != nil {
 		panic(err)
 	}
-	logger.Infof("\n\nGetUser2(userId string, name string) res: %+v\n", resp)
+	logger.Infof("GetUser2(userId string, name string) res: %+v", resp)
 
-	resp, err = referenceConfig.GetRPCService().(*generic.GenericService).Invoke(
+	resp, err = refConf.GetRPCService().(*generic.GenericService).Invoke(
 		context.TODO(),
 		[]interface{}{
 			"GetUser3",
@@ -149,9 +109,9 @@ func callGetUser() {
 	if err != nil {
 		panic(err)
 	}
-	logger.Infof("\n\nGetUser3(userCode int) res: %+v\n", resp)
+	logger.Infof("GetUser3(userCode int) res: %+v", resp)
 
-	resp, err = referenceConfig.GetRPCService().(*generic.GenericService).Invoke(
+	resp, err = refConf.GetRPCService().(*generic.GenericService).Invoke(
 		context.TODO(),
 		[]interface{}{
 			"GetUser4",
@@ -162,15 +122,11 @@ func callGetUser() {
 	if err != nil {
 		panic(err)
 	}
-	logger.Infof("\n\nGetUser4(userCode int, name string) res: %+v\n", resp)
-
-	logger.Infof("success!")
+	logger.Infof("GetUser4(userCode int, name string) res: %+v", resp)
 }
 
-func callGetOneUser() {
-	logger.Infof("Call GetOneUser")
-	logger.Infof("Start to generic invoke")
-	resp, err := referenceConfig.GetRPCService().(*generic.GenericService).Invoke(
+func callGetOneUser(refConf config.ReferenceConfig) {
+	resp, err := refConf.GetRPCService().(*generic.GenericService).Invoke(
 		context.TODO(),
 		[]interface{}{
 			"GetOneUser",
@@ -183,14 +139,11 @@ func callGetOneUser() {
 	if err != nil {
 		panic(err)
 	}
-	logger.Infof("\n\nGetOneUser() res: %+v\n", resp)
-	logger.Infof("success!")
+	logger.Infof("GetOneUser() res: %+v", resp)
 }
 
-func callGetUsers() {
-	logger.Infof("Call GetUsers")
-	logger.Infof("Start to generic invoke")
-	resp, err := referenceConfig.GetRPCService().(*generic.GenericService).Invoke(
+func callGetUsers(refConf config.ReferenceConfig) {
+	resp, err := refConf.GetRPCService().(*generic.GenericService).Invoke(
 		context.TODO(),
 		[]interface{}{
 			"GetUsers",
@@ -205,14 +158,11 @@ func callGetUsers() {
 	if err != nil {
 		panic(err)
 	}
-	logger.Infof("\n\nGetUsers1(userIdList []*string) res: %+v\n", resp)
-	logger.Infof("success!")
+	logger.Infof("GetUsers1(userIdList []*string) res: %+v", resp)
 }
 
-func callGetUsersMap() {
-	logger.Infof("Call GetUsersMap")
-	logger.Infof("Start to generic invoke")
-	resp, err := referenceConfig.GetRPCService().(*generic.GenericService).Invoke(
+func callGetUsersMap(refConf config.ReferenceConfig) {
+	resp, err := refConf.GetRPCService().(*generic.GenericService).Invoke(
 		context.TODO(),
 		[]interface{}{
 			"GetUsersMap",
@@ -227,14 +177,11 @@ func callGetUsersMap() {
 	if err != nil {
 		panic(err)
 	}
-	logger.Infof("\n\nGetUserMap(userIdList []*string) res: %+v\n", resp)
-	logger.Infof("success!")
+	logger.Infof("GetUserMap(userIdList []*string) res: %+v", resp)
 }
 
-func callQueryUser() {
-	logger.Infof("Call QueryUser")
-	logger.Infof("Start to generic invoke")
-	resp, err := referenceConfig.GetRPCService().(*generic.GenericService).Invoke(
+func callQueryUser(refConf config.ReferenceConfig) {
+	resp, err := refConf.GetRPCService().(*generic.GenericService).Invoke(
 		context.TODO(),
 		[]interface{}{
 			"queryUser",
@@ -258,14 +205,11 @@ func callQueryUser() {
 	if err != nil {
 		panic(err)
 	}
-	logger.Infof("\n\nqueryUser(user *User) res: %+v\n", resp)
-	logger.Infof("success!")
+	logger.Infof("queryUser(user *User) res: %+v", resp)
 }
 
-func callQueryUsers() {
-	logger.Infof("Call QueryUsers")
-	logger.Infof("Start to generic invoke")
-	var resp, err = referenceConfig.GetRPCService().(*generic.GenericService).Invoke(
+func callQueryUsers(refConf config.ReferenceConfig) {
+	var resp, err = refConf.GetRPCService().(*generic.GenericService).Invoke(
 		context.TODO(),
 		[]interface{}{
 			"queryUsers",
@@ -293,14 +237,11 @@ func callQueryUsers() {
 	if err != nil {
 		panic(err)
 	}
-	logger.Infof("\n\nqueryUsers(users []*User) res: %+v\n", resp)
-	logger.Infof("success!")
+	logger.Infof("queryUsers(users []*User) res: %+v", resp)
 }
 
-func callQueryAll() {
-	logger.Infof("Call queryAll")
-	logger.Infof("Start to generic invoke")
-	resp, err := referenceConfig.GetRPCService().(*generic.GenericService).Invoke(
+func callQueryAll(refConf config.ReferenceConfig) {
+	resp, err := refConf.GetRPCService().(*generic.GenericService).Invoke(
 		context.TODO(),
 		[]interface{}{
 			"queryAll",
@@ -313,6 +254,51 @@ func callQueryAll() {
 	if err != nil {
 		panic(err)
 	}
-	logger.Infof("\n\nqueryAll() res: %+v\n", resp)
-	logger.Infof("success!")
+	logger.Infof("queryAll() res: %+v", resp)
+}
+
+func newRefConf(iface, protocol string) config.ReferenceConfig {
+	registryConfig := &config.RegistryConfig{
+		Protocol: "zookeeper",
+		Address:  "127.0.0.1:2181",
+	}
+
+	refConf := config.ReferenceConfig{
+		InterfaceName: iface,
+		Cluster:       "failover",
+		Registry:      []string{"zk"},
+		Protocol:      protocol,
+		Generic:       "true",
+	}
+
+	rootConfig := config.NewRootConfig(config.WithRootRegistryConfig("zk", registryConfig))
+	_ = rootConfig.Init()
+	_ = refConf.Init(rootConfig)
+	refConf.GenericLoad(appName)
+
+	return refConf
+}
+
+func initSignal() {
+	signals := make(chan os.Signal, 1)
+	// It is not possible to block SIGKILL or syscall.SIGSTOP
+	signal.Notify(signals, os.Interrupt, os.Kill, syscall.SIGHUP,
+		syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
+	for {
+		sig := <-signals
+		logger.Infof("get signal %s", sig.String())
+		switch sig {
+		case syscall.SIGHUP:
+			// reload()
+		default:
+			time.AfterFunc(10*time.Second, func() {
+				logger.Warnf("app exit now by force...")
+				os.Exit(1)
+			})
+
+			// The program exits normally or timeout forcibly exits.
+			fmt.Println("app exit now...")
+			return
+		}
+	}
 }
diff --git a/generic/default/go-client/conf/dubbogo.yml b/generic/default/go-client/conf/dubbogo.yml
deleted file mode 100644
index 771c75b..0000000
--- a/generic/default/go-client/conf/dubbogo.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-dubbo:
-  registries:
-    zk:
-      protocol: zookeeper
-      timeout: 3s
-      address: 127.0.0.1:2181
-  consumer:
-    registry: zk
-    references:
-      UserProvider:
-        protocol: dubbo
-        interface: org.apache.dubbo.UserProvider # must be compatible with grpc or dubbo-java
\ No newline at end of file
diff --git a/generic/default/go-server/conf/dubbogo.yml b/generic/default/go-server/conf/dubbogo.yml
index aa70d6a..9fb8757 100644
--- a/generic/default/go-server/conf/dubbogo.yml
+++ b/generic/default/go-server/conf/dubbogo.yml
@@ -8,9 +8,16 @@ dubbo:
     dubbo:
       name: dubbo
       port: 20000
+    triple:
+      name: tri
+      port: 20001
   provider:
     registry: zk
     services:
       UserProvider:
         protocol: dubbo
-        interface: org.apache.dubbo.UserProvider
\ No newline at end of file
+        interface: org.apache.dubbo.samples.UserProvider
+      UserProviderTriple:
+        protocol: triple
+        serialization: hessian2
+        interface: org.apache.dubbo.samples.UserProviderTriple
\ No newline at end of file
diff --git a/generic/default/go-server/pkg/init.go b/generic/default/go-server/pkg/init.go
new file mode 100644
index 0000000..4287334
--- /dev/null
+++ b/generic/default/go-server/pkg/init.go
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package pkg
+
+import (
+	"dubbo.apache.org/dubbo-go/v3/config"
+
+	hessian "github.com/apache/dubbo-go-hessian2"
+)
+
+func init() {
+	config.SetProviderService(new(UserProvider))
+	config.SetProviderService(new(UserProviderTriple))
+	// ------for hessian2------
+	hessian.RegisterPOJO(&User{})
+	hessian.RegisterPOJO(&UserResponse{})
+}
diff --git a/generic/default/go-server/pkg/user.go b/generic/default/go-server/pkg/user.go
index 89684af..184f548 100644
--- a/generic/default/go-server/pkg/user.go
+++ b/generic/default/go-server/pkg/user.go
@@ -18,25 +18,14 @@
 package pkg
 
 import (
-	"context"
-	"strconv"
 	"time"
 )
 
-import (
-	"dubbo.apache.org/dubbo-go/v3/common/logger"
-	"dubbo.apache.org/dubbo-go/v3/config"
-
-	hessian "github.com/apache/dubbo-go-hessian2"
-)
-
-func init() {
-	config.SetProviderService(new(UserProvider))
-	// ------for hessian2------
-	hessian.RegisterPOJO(&User{})
-	hessian.RegisterPOJO(&UserResponse{})
-
-	initUserMap()
+var userMap = map[string]*User{
+	"001": {"001", "other-zhangsan", 23, time.Date(1998, 1, 2, 3, 4, 5, 0, time.Local)},
+	"002": {"002", "other-lisi", 25, time.Date(1996, 1, 2, 3, 4, 5, 0, time.Local)},
+	"003": {"003", "other-lily", 28, time.Date(1993, 1, 2, 3, 4, 5, 0, time.Local)},
+	"004": {"004", "other-lisa", 36, time.Date(1985, 1, 2, 3, 4, 5, 0, time.Local)},
 }
 
 type User struct {
@@ -46,125 +35,6 @@ type User struct {
 	Time time.Time
 }
 
-type UserResponse struct {
-	Users []*User
-}
-
-type UserProvider struct {
-}
-
-var userMap = make(map[string]*User)
-
-func initUserMap() {
-	userMap["001"] = &User{"001", "other-zhangsan", 23, time.Date(1998, 1, 2, 3, 4, 5, 0, time.Local)}
-	userMap["002"] = &User{"002", "other-lisi", 25, time.Date(1996, 1, 2, 3, 4, 5, 0, time.Local)}
-	userMap["003"] = &User{"003", "other-lily", 28, time.Date(1993, 1, 2, 3, 4, 5, 0, time.Local)}
-	userMap["004"] = &User{"004", "other-lisa", 36, time.Date(1985, 1, 2, 3, 4, 5, 0, time.Local)}
-}
-
-func (u *UserProvider) GetUser1(_ context.Context, userID string) (*User, error) {
-	logger.Infof("req:%#v", userID)
-	rsp := User{userID, "Joe", 48, time.Now()}
-	logger.Infof("rsp:%#v", rsp)
-	return &rsp, nil
-}
-
-func (u *UserProvider) GetUser2(_ context.Context, userID string, name string) (*User, error) {
-	logger.Infof("req:%#v, %#v", userID, name)
-	rsp := User{userID, name, 48, time.Now()}
-	logger.Infof("rsp:%#v", rsp)
-	return &rsp, nil
-}
-
-func (u *UserProvider) GetUser3(_ context.Context, userCode int) (*User, error) {
-	logger.Infof("req:%#v", userCode)
-	rsp := User{strconv.Itoa(userCode), "Alex Stocks", 18, time.Now()}
-	logger.Infof("rsp:%#v", rsp)
-	return &rsp, nil
-}
-
-func (u *UserProvider) GetUser4(_ context.Context, userCode int, name string) (*User, error) {
-	logger.Infof("req:%#v, %#v", userCode, name)
-	rsp := User{strconv.Itoa(userCode), name, 18, time.Now()}
-	logger.Infof("rsp:%#v", rsp)
-	return &rsp, nil
-}
-
-func (u *UserProvider) GetOneUser(_ context.Context) (*User, error) {
-	return &User{
-		ID:   "1000",
-		Name: "xavierniu",
-		Age:  24,
-		Time: time.Now(),
-	}, nil
-}
-
-func (u *UserProvider) GetUsers(_ context.Context, userIdList []string) (*UserResponse, error) {
-	logger.Infof("req:%#v", userIdList)
-	var users []*User
-	for _, i := range userIdList {
-		users = append(users, userMap[i])
-	}
-	return &UserResponse{
-		Users: users,
-	}, nil
-}
-
-func (u *UserProvider) GetUsersMap(_ context.Context, userIdList []string) (map[string]*User, error) {
-	logger.Infof("req:%#v", userIdList)
-	var users = make(map[string]*User)
-	for _, i := range userIdList {
-		users[i] = userMap[i]
-	}
-	return users, nil
-}
-
-func (u *UserProvider) QueryUser(_ context.Context, user *User) (*User, error) {
-	logger.Infof("req1:%#v", user)
-	rsp := User{user.ID, user.Name, user.Age, time.Now()}
-	logger.Infof("rsp1:%#v", rsp)
-	return &rsp, nil
-}
-
-func (u *UserProvider) QueryUsers(_ context.Context, users []*User) (*UserResponse, error) {
-	return &UserResponse{
-		Users: users,
-	}, nil
-}
-
-func (u *UserProvider) QueryAll(_ context.Context) (*UserResponse, error) {
-	users := []*User{
-		{
-			ID:   "001",
-			Name: "Joe",
-			Age:  18,
-			Time: time.Now(),
-		},
-		{
-			ID:   "002",
-			Name: "Wen",
-			Age:  20,
-			Time: time.Now(),
-		},
-	}
-
-	return &UserResponse{
-		Users: users,
-	}, nil
-}
-
-func (u *UserProvider) MethodMapper() map[string]string {
-	return map[string]string{
-		"QueryUser":  "queryUser",
-		"QueryUsers": "queryUsers",
-		"QueryAll":   "queryAll",
-	}
-}
-
 func (u *User) JavaClassName() string {
 	return "org.apache.dubbo.User"
 }
-
-func (u *UserResponse) JavaClassName() string {
-	return "org.apache.dubbo.UserResponse"
-}
diff --git a/generic/default/go-server/pkg/user.go b/generic/default/go-server/pkg/user_provider.go
similarity index 77%
copy from generic/default/go-server/pkg/user.go
copy to generic/default/go-server/pkg/user_provider.go
index 89684af..97c28f4 100644
--- a/generic/default/go-server/pkg/user.go
+++ b/generic/default/go-server/pkg/user_provider.go
@@ -25,43 +25,11 @@ import (
 
 import (
 	"dubbo.apache.org/dubbo-go/v3/common/logger"
-	"dubbo.apache.org/dubbo-go/v3/config"
-
-	hessian "github.com/apache/dubbo-go-hessian2"
 )
 
-func init() {
-	config.SetProviderService(new(UserProvider))
-	// ------for hessian2------
-	hessian.RegisterPOJO(&User{})
-	hessian.RegisterPOJO(&UserResponse{})
-
-	initUserMap()
-}
-
-type User struct {
-	ID   string
-	Name string
-	Age  int32
-	Time time.Time
-}
-
-type UserResponse struct {
-	Users []*User
-}
-
 type UserProvider struct {
 }
 
-var userMap = make(map[string]*User)
-
-func initUserMap() {
-	userMap["001"] = &User{"001", "other-zhangsan", 23, time.Date(1998, 1, 2, 3, 4, 5, 0, time.Local)}
-	userMap["002"] = &User{"002", "other-lisi", 25, time.Date(1996, 1, 2, 3, 4, 5, 0, time.Local)}
-	userMap["003"] = &User{"003", "other-lily", 28, time.Date(1993, 1, 2, 3, 4, 5, 0, time.Local)}
-	userMap["004"] = &User{"004", "other-lisa", 36, time.Date(1985, 1, 2, 3, 4, 5, 0, time.Local)}
-}
-
 func (u *UserProvider) GetUser1(_ context.Context, userID string) (*User, error) {
 	logger.Infof("req:%#v", userID)
 	rsp := User{userID, "Joe", 48, time.Now()}
@@ -161,10 +129,6 @@ func (u *UserProvider) MethodMapper() map[string]string {
 	}
 }
 
-func (u *User) JavaClassName() string {
-	return "org.apache.dubbo.User"
-}
-
-func (u *UserResponse) JavaClassName() string {
-	return "org.apache.dubbo.UserResponse"
+func (u *UserProvider) Reference() string {
+	return "UserProvider"
 }
diff --git a/generic/default/go-server/pkg/user.go b/generic/default/go-server/pkg/user_provider_triple.go
similarity index 55%
copy from generic/default/go-server/pkg/user.go
copy to generic/default/go-server/pkg/user_provider_triple.go
index 89684af..57356f2 100644
--- a/generic/default/go-server/pkg/user.go
+++ b/generic/default/go-server/pkg/user_provider_triple.go
@@ -25,72 +25,39 @@ import (
 
 import (
 	"dubbo.apache.org/dubbo-go/v3/common/logger"
-	"dubbo.apache.org/dubbo-go/v3/config"
-
-	hessian "github.com/apache/dubbo-go-hessian2"
 )
 
-func init() {
-	config.SetProviderService(new(UserProvider))
-	// ------for hessian2------
-	hessian.RegisterPOJO(&User{})
-	hessian.RegisterPOJO(&UserResponse{})
-
-	initUserMap()
-}
-
-type User struct {
-	ID   string
-	Name string
-	Age  int32
-	Time time.Time
-}
-
-type UserResponse struct {
-	Users []*User
-}
-
-type UserProvider struct {
-}
-
-var userMap = make(map[string]*User)
+type UserProviderTriple struct{}
 
-func initUserMap() {
-	userMap["001"] = &User{"001", "other-zhangsan", 23, time.Date(1998, 1, 2, 3, 4, 5, 0, time.Local)}
-	userMap["002"] = &User{"002", "other-lisi", 25, time.Date(1996, 1, 2, 3, 4, 5, 0, time.Local)}
-	userMap["003"] = &User{"003", "other-lily", 28, time.Date(1993, 1, 2, 3, 4, 5, 0, time.Local)}
-	userMap["004"] = &User{"004", "other-lisa", 36, time.Date(1985, 1, 2, 3, 4, 5, 0, time.Local)}
-}
-
-func (u *UserProvider) GetUser1(_ context.Context, userID string) (*User, error) {
+func (u *UserProviderTriple) GetUser1(_ context.Context, userID string) (*User, error) {
 	logger.Infof("req:%#v", userID)
 	rsp := User{userID, "Joe", 48, time.Now()}
 	logger.Infof("rsp:%#v", rsp)
 	return &rsp, nil
 }
 
-func (u *UserProvider) GetUser2(_ context.Context, userID string, name string) (*User, error) {
+func (u *UserProviderTriple) GetUser2(_ context.Context, userID string, name string) (*User, error) {
 	logger.Infof("req:%#v, %#v", userID, name)
 	rsp := User{userID, name, 48, time.Now()}
 	logger.Infof("rsp:%#v", rsp)
 	return &rsp, nil
 }
 
-func (u *UserProvider) GetUser3(_ context.Context, userCode int) (*User, error) {
+func (u *UserProviderTriple) GetUser3(_ context.Context, userCode int) (*User, error) {
 	logger.Infof("req:%#v", userCode)
 	rsp := User{strconv.Itoa(userCode), "Alex Stocks", 18, time.Now()}
 	logger.Infof("rsp:%#v", rsp)
 	return &rsp, nil
 }
 
-func (u *UserProvider) GetUser4(_ context.Context, userCode int, name string) (*User, error) {
+func (u *UserProviderTriple) GetUser4(_ context.Context, userCode int, name string) (*User, error) {
 	logger.Infof("req:%#v, %#v", userCode, name)
 	rsp := User{strconv.Itoa(userCode), name, 18, time.Now()}
 	logger.Infof("rsp:%#v", rsp)
 	return &rsp, nil
 }
 
-func (u *UserProvider) GetOneUser(_ context.Context) (*User, error) {
+func (u *UserProviderTriple) GetOneUser(_ context.Context) (*User, error) {
 	return &User{
 		ID:   "1000",
 		Name: "xavierniu",
@@ -99,7 +66,7 @@ func (u *UserProvider) GetOneUser(_ context.Context) (*User, error) {
 	}, nil
 }
 
-func (u *UserProvider) GetUsers(_ context.Context, userIdList []string) (*UserResponse, error) {
+func (u *UserProviderTriple) GetUsers(_ context.Context, userIdList []string) (*UserResponse, error) {
 	logger.Infof("req:%#v", userIdList)
 	var users []*User
 	for _, i := range userIdList {
@@ -110,7 +77,7 @@ func (u *UserProvider) GetUsers(_ context.Context, userIdList []string) (*UserRe
 	}, nil
 }
 
-func (u *UserProvider) GetUsersMap(_ context.Context, userIdList []string) (map[string]*User, error) {
+func (u *UserProviderTriple) GetUsersMap(_ context.Context, userIdList []string) (map[string]*User, error) {
 	logger.Infof("req:%#v", userIdList)
 	var users = make(map[string]*User)
 	for _, i := range userIdList {
@@ -119,20 +86,20 @@ func (u *UserProvider) GetUsersMap(_ context.Context, userIdList []string) (map[
 	return users, nil
 }
 
-func (u *UserProvider) QueryUser(_ context.Context, user *User) (*User, error) {
+func (u *UserProviderTriple) QueryUser(_ context.Context, user *User) (*User, error) {
 	logger.Infof("req1:%#v", user)
 	rsp := User{user.ID, user.Name, user.Age, time.Now()}
 	logger.Infof("rsp1:%#v", rsp)
 	return &rsp, nil
 }
 
-func (u *UserProvider) QueryUsers(_ context.Context, users []*User) (*UserResponse, error) {
+func (u *UserProviderTriple) QueryUsers(_ context.Context, users []*User) (*UserResponse, error) {
 	return &UserResponse{
 		Users: users,
 	}, nil
 }
 
-func (u *UserProvider) QueryAll(_ context.Context) (*UserResponse, error) {
+func (u *UserProviderTriple) QueryAll(_ context.Context) (*UserResponse, error) {
 	users := []*User{
 		{
 			ID:   "001",
@@ -153,7 +120,7 @@ func (u *UserProvider) QueryAll(_ context.Context) (*UserResponse, error) {
 	}, nil
 }
 
-func (u *UserProvider) MethodMapper() map[string]string {
+func (u *UserProviderTriple) MethodMapper() map[string]string {
 	return map[string]string{
 		"QueryUser":  "queryUser",
 		"QueryUsers": "queryUsers",
@@ -161,10 +128,6 @@ func (u *UserProvider) MethodMapper() map[string]string {
 	}
 }
 
-func (u *User) JavaClassName() string {
-	return "org.apache.dubbo.User"
-}
-
-func (u *UserResponse) JavaClassName() string {
-	return "org.apache.dubbo.UserResponse"
+func (u *UserProviderTriple) Reference() string {
+	return "UserProviderTriple"
 }
diff --git a/generic/default/go-server/pkg/user_response.go b/generic/default/go-server/pkg/user_response.go
new file mode 100644
index 0000000..1288e8f
--- /dev/null
+++ b/generic/default/go-server/pkg/user_response.go
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package pkg
+
+type UserResponse struct {
+	Users []*User
+}
+
+func (u *UserResponse) JavaClassName() string {
+	return "org.apache.dubbo.UserResponse"
+}
diff --git a/integrate_test/generic/default/tests/integration/main_test.go b/integrate_test/generic/default/tests/integration/main_test.go
index fcf47c7..1eea008 100644
--- a/integrate_test/generic/default/tests/integration/main_test.go
+++ b/integrate_test/generic/default/tests/integration/main_test.go
@@ -41,34 +41,37 @@ import (
 )
 
 var (
-	appName         = "dubbo.io"
-	referenceConfig config.ReferenceConfig
+	appName      = "dubbo.io"
+	dubboRefConf config.ReferenceConfig
+	//tripleRefConf config.ReferenceConfig
 )
 
-func init() {
+func TestMain(m *testing.M) {
+	hessian.RegisterPOJO(&pkg.User{})
+
+	dubboRefConf = newRefConf("org.apache.dubbo.samples.UserProvider", dubbo.DUBBO)
+
+	os.Exit(m.Run())
+}
+
+func newRefConf(iface, protocol string) config.ReferenceConfig {
 	registryConfig := &config.RegistryConfig{
 		Protocol: "zookeeper",
 		Address:  "127.0.0.1:2181",
 	}
 
-	referenceConfig = config.ReferenceConfig{
-		InterfaceName: "org.apache.dubbo.UserProvider",
+	refConf := config.ReferenceConfig{
+		InterfaceName: iface,
 		Cluster:       "failover",
 		Registry:      []string{"zk"},
-		Protocol:      dubbo.DUBBO,
+		Protocol:      protocol,
 		Generic:       "true",
 	}
 
 	rootConfig := config.NewRootConfig(config.WithRootRegistryConfig("zk", registryConfig))
 	_ = rootConfig.Init()
-	_ = referenceConfig.Init(rootConfig)
-	referenceConfig.GenericLoad(appName)
-}
-
-func TestMain(m *testing.M) {
-	hessian.RegisterPOJO(&pkg.User{})
-	config.SetProviderService(&pkg.User{})
-	config.Load()
+	_ = refConf.Init(rootConfig)
+	refConf.GenericLoad(appName)
 
-	os.Exit(m.Run())
+	return refConf
 }
diff --git a/integrate_test/generic/default/tests/integration/userprovider_test.go b/integrate_test/generic/default/tests/integration/userprovider_test.go
index ad7104d..e64a10d 100644
--- a/integrate_test/generic/default/tests/integration/userprovider_test.go
+++ b/integrate_test/generic/default/tests/integration/userprovider_test.go
@@ -31,12 +31,8 @@ import (
 	"github.com/stretchr/testify/assert"
 )
 
-//import (
-//	pkg "github.com/apache/dubbo-go-samples/generic/default/go-server/pkg"
-//)
-
 func TestGetUser1(t *testing.T) {
-	o, err := referenceConfig.GetRPCService().(*generic.GenericService).Invoke(
+	o, err := dubboRefConf.GetRPCService().(*generic.GenericService).Invoke(
 		context.TODO(),
 		[]interface{}{
 			"GetUser1",
@@ -53,7 +49,7 @@ func TestGetUser1(t *testing.T) {
 }
 
 func TestGetUser2(t *testing.T) {
-	o, err := referenceConfig.GetRPCService().(*generic.GenericService).Invoke(
+	o, err := dubboRefConf.GetRPCService().(*generic.GenericService).Invoke(
 		context.TODO(),
 		[]interface{}{
 			"GetUser2",
@@ -70,7 +66,7 @@ func TestGetUser2(t *testing.T) {
 }
 
 func TestGetUser3(t *testing.T) {
-	o, err := referenceConfig.GetRPCService().(*generic.GenericService).Invoke(
+	o, err := dubboRefConf.GetRPCService().(*generic.GenericService).Invoke(
 		context.TODO(),
 		[]interface{}{
 			"GetUser3",
@@ -87,7 +83,7 @@ func TestGetUser3(t *testing.T) {
 }
 
 func TestGetUser4(t *testing.T) {
-	o, err := referenceConfig.GetRPCService().(*generic.GenericService).Invoke(
+	o, err := dubboRefConf.GetRPCService().(*generic.GenericService).Invoke(
 		context.TODO(),
 		[]interface{}{
 			"GetUser4",
@@ -104,7 +100,7 @@ func TestGetUser4(t *testing.T) {
 }
 
 func TestGetOneUser(t *testing.T) {
-	o, err := referenceConfig.GetRPCService().(*generic.GenericService).Invoke(
+	o, err := dubboRefConf.GetRPCService().(*generic.GenericService).Invoke(
 		context.TODO(),
 		[]interface{}{
 			"GetOneUser",
@@ -121,7 +117,7 @@ func TestGetOneUser(t *testing.T) {
 }
 
 func TestGetUsers(t *testing.T) {
-	o, err := referenceConfig.GetRPCService().(*generic.GenericService).Invoke(
+	o, err := dubboRefConf.GetRPCService().(*generic.GenericService).Invoke(
 		context.TODO(),
 		[]interface{}{
 			"GetUsers",
@@ -143,7 +139,7 @@ func TestGetUsers(t *testing.T) {
 }
 
 func TestQueryUser(t *testing.T) {
-	o, err := referenceConfig.GetRPCService().(*generic.GenericService).Invoke(
+	o, err := dubboRefConf.GetRPCService().(*generic.GenericService).Invoke(
 		context.TODO(),
 		[]interface{}{
 			"queryUser",
diff --git a/rpc/grpc/protobuf/helloworld.pb.go b/rpc/grpc/protobuf/helloworld.pb.go
index dbda83d..70566cf 100644
--- a/rpc/grpc/protobuf/helloworld.pb.go
+++ b/rpc/grpc/protobuf/helloworld.pb.go
@@ -23,16 +23,18 @@ package protobuf
 import (
 	context "context"
 	fmt "fmt"
-	proto "github.com/golang/protobuf/proto"
-	grpc "google.golang.org/grpc"
-	codes "google.golang.org/grpc/codes"
-	status "google.golang.org/grpc/status"
 	math "math"
 )
 
 import (
 	"dubbo.apache.org/dubbo-go/v3/protocol"
 	"dubbo.apache.org/dubbo-go/v3/protocol/invocation"
+
+	proto "github.com/golang/protobuf/proto"
+
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
 )
 
 // Reference imports to suppress errors if they are not otherwise used.
diff --git a/rpc/triple/pb/dubbogo-grpc/protobuf/grpc/helloworld.pb.go b/rpc/triple/pb/dubbogo-grpc/protobuf/grpc/helloworld.pb.go
index 5ad7aef..bfe203f 100644
--- a/rpc/triple/pb/dubbogo-grpc/protobuf/grpc/helloworld.pb.go
+++ b/rpc/triple/pb/dubbogo-grpc/protobuf/grpc/helloworld.pb.go
@@ -40,12 +40,16 @@
 package grpc
 
 import (
-	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	reflect "reflect"
 	sync "sync"
 )
 
+import (
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+)
+
 const (
 	// Verify that this generated code is sufficiently up-to-date.
 	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
diff --git a/rpc/triple/pb/dubbogo-grpc/protobuf/grpc/helloworld_grpc.pb.go b/rpc/triple/pb/dubbogo-grpc/protobuf/grpc/helloworld_grpc.pb.go
index 3e53189..0901b0d 100644
--- a/rpc/triple/pb/dubbogo-grpc/protobuf/grpc/helloworld_grpc.pb.go
+++ b/rpc/triple/pb/dubbogo-grpc/protobuf/grpc/helloworld_grpc.pb.go
@@ -21,6 +21,9 @@ package grpc
 
 import (
 	context "context"
+)
+
+import (
 	grpc "google.golang.org/grpc"
 	codes "google.golang.org/grpc/codes"
 	status "google.golang.org/grpc/status"
diff --git a/start_integrate_test.sh b/start_integrate_test.sh
index 530772c..f418828 100755
--- a/start_integrate_test.sh
+++ b/start_integrate_test.sh
@@ -86,18 +86,13 @@
 #array+=("router/uniform-router/file/go-server")
 #array+=("router/uniform-router/file/go-server2")
 
+# ungrouped
+array=("helloworld")
+array+=("direct")
+
 # context
 array+=("context/dubbo")
 
-# generic
-array+=("generic/default")
-
-# helloworld
-array+=("helloworld")
-
-# direct
-array+=("direct")
-
 # config-api
 array+=("config-api/rpc/triple")
 array+=("config-api/configcenter/nacos")
@@ -107,6 +102,9 @@ array+=("config-api/configcenter/zookeeper")
 array+=("registry/zookeeper")
 array+=("registry/nacos")
 
+# generic
+array+=("generic/default")
+
 # rpc
 array+=("rpc/dubbo")
 array+=("rpc/triple/codec-extension")