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/09/16 09:42:54 UTC

[dubbo-go-samples] branch config-enhance updated: feat(geninv): add samples for generic invocation using hessian and Triple (#249)

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

laurence 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 77f6ae0  feat(geninv): add samples for generic invocation using hessian and Triple (#249)
77f6ae0 is described below

commit 77f6ae054306a077a2591e1c28ec6fa50bcfec12
Author: XavierNiu <a...@nxw.name>
AuthorDate: Thu Sep 16 17:42:50 2021 +0800

    feat(geninv): add samples for generic invocation using hessian and Triple (#249)
    
    * feat(geninv): add samples for generic invocation using hessian on Triple
    
    * style(geninv): go fmt
    
    * test(geninv): fix integrated tests of generic invocation
    
    * style(*): 3 import blocks style
---
 api/samples_api.pb.go                              |   7 +-
 generic/default/go-client/cmd/client.go            |  51 ++----
 generic/default/go-server/cmd/server.go            |   2 +-
 .../generic/default/tests/integration/main_test.go |  20 +-
 .../default/tests/integration/userprovider_test.go | 201 ++++++++++++++++-----
 5 files changed, 187 insertions(+), 94 deletions(-)

diff --git a/api/samples_api.pb.go b/api/samples_api.pb.go
index 3752b2f..e320183 100644
--- a/api/samples_api.pb.go
+++ b/api/samples_api.pb.go
@@ -23,8 +23,6 @@ package api
 import (
 	context "context"
 	fmt "fmt"
-	proto "github.com/golang/protobuf/proto"
-	grpc "google.golang.org/grpc"
 	math "math"
 )
 
@@ -32,9 +30,14 @@ import (
 	"dubbo.apache.org/dubbo-go/v3/protocol"
 	dgrpc "dubbo.apache.org/dubbo-go/v3/protocol/dubbo3"
 	"dubbo.apache.org/dubbo-go/v3/protocol/invocation"
+
 	"github.com/dubbogo/triple/pkg/common"
 	tripleConstant "github.com/dubbogo/triple/pkg/common/constant"
 	dubbo3 "github.com/dubbogo/triple/pkg/triple"
+
+	proto "github.com/golang/protobuf/proto"
+
+	grpc "google.golang.org/grpc"
 )
 
 // Reference imports to suppress errors if they are not otherwise used.
diff --git a/generic/default/go-client/cmd/client.go b/generic/default/go-client/cmd/client.go
index 2f1a706..563d008 100644
--- a/generic/default/go-client/cmd/client.go
+++ b/generic/default/go-client/cmd/client.go
@@ -19,35 +19,26 @@ package main
 
 import (
 	"context"
-	"fmt"
-	"os"
-	"os/signal"
-	"syscall"
 	"time"
 )
 
 import (
-	_ "dubbo.apache.org/dubbo-go/v3/cluster/cluster_impl"
-	_ "dubbo.apache.org/dubbo-go/v3/cluster/loadbalance"
 	"dubbo.apache.org/dubbo-go/v3/common/logger"
-	_ "dubbo.apache.org/dubbo-go/v3/common/proxy/proxy_factory"
 	"dubbo.apache.org/dubbo-go/v3/config"
 	"dubbo.apache.org/dubbo-go/v3/config/generic"
-	_ "dubbo.apache.org/dubbo-go/v3/filter/filter_impl"
+	_ "dubbo.apache.org/dubbo-go/v3/imports"
 	"dubbo.apache.org/dubbo-go/v3/protocol/dubbo"
-	_ "dubbo.apache.org/dubbo-go/v3/registry/protocol"
-	_ "dubbo.apache.org/dubbo-go/v3/registry/zookeeper"
 
 	hessian "github.com/apache/dubbo-go-hessian2"
+
+	tpconst "github.com/dubbogo/triple/pkg/common/constant"
 )
 
 import (
 	"github.com/apache/dubbo-go-samples/generic/default/go-client/pkg"
 )
 
-var (
-	appName = "dubbo.io"
-)
+const appName = "dubbo.io"
 
 // export DUBBO_GO_CONFIG_PATH= PATH_TO_SAMPLES/generic/default/go-client/conf/dubbogo.yml
 func main() {
@@ -66,9 +57,15 @@ func main() {
 	//callQueryAll(dubboRefConf)
 
 	// generic invocation samples using hessian serialization on Triple protocol
-	//tripleRefConf := newRefConf("org.apache.dubbo.samples.UserProviderTriple", tpconst.TRIPLE)
+	tripleRefConf := newRefConf("org.apache.dubbo.samples.UserProviderTriple", tpconst.TRIPLE)
+	callGetUser(tripleRefConf)
+	//callGetOneUser(tripleRefConf)
+	callGetUsers(tripleRefConf)
+	callGetUsersMap(tripleRefConf)
+	callQueryUser(tripleRefConf)
+	callQueryUsers(tripleRefConf)
+	//callQueryAll(tripleRefConf)
 
-	initSignal()
 }
 
 func callGetUser(refConf config.ReferenceConfig) {
@@ -258,27 +255,3 @@ func newRefConf(iface, protocol string) config.ReferenceConfig {
 
 	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-server/cmd/server.go b/generic/default/go-server/cmd/server.go
index 470b851..5a7e05d 100644
--- a/generic/default/go-server/cmd/server.go
+++ b/generic/default/go-server/cmd/server.go
@@ -34,7 +34,7 @@ import (
 )
 
 import (
-	pkg "github.com/apache/dubbo-go-samples/generic/default/go-server/pkg"
+	"github.com/apache/dubbo-go-samples/generic/default/go-server/pkg"
 )
 
 // export DUBBO_GO_CONFIG_PATH= PATH_TO_SAMPLES/generic/default/go-server/conf/dubbogo.yml
diff --git a/integrate_test/generic/default/tests/integration/main_test.go b/integrate_test/generic/default/tests/integration/main_test.go
index 1eea008..783744d 100644
--- a/integrate_test/generic/default/tests/integration/main_test.go
+++ b/integrate_test/generic/default/tests/integration/main_test.go
@@ -23,33 +23,31 @@ import (
 )
 
 import (
-	_ "dubbo.apache.org/dubbo-go/v3/cluster/cluster_impl"
-	_ "dubbo.apache.org/dubbo-go/v3/cluster/loadbalance"
-	_ "dubbo.apache.org/dubbo-go/v3/common/proxy/proxy_factory"
 	"dubbo.apache.org/dubbo-go/v3/config"
-	_ "dubbo.apache.org/dubbo-go/v3/filter/filter_impl"
+	_ "dubbo.apache.org/dubbo-go/v3/imports"
 	"dubbo.apache.org/dubbo-go/v3/protocol/dubbo"
-	_ "dubbo.apache.org/dubbo-go/v3/protocol/dubbo"
-	_ "dubbo.apache.org/dubbo-go/v3/registry/protocol"
-	_ "dubbo.apache.org/dubbo-go/v3/registry/zookeeper"
 
 	hessian "github.com/apache/dubbo-go-hessian2"
+
+	tpconst "github.com/dubbogo/triple/pkg/common/constant"
 )
 
 import (
-	pkg "github.com/apache/dubbo-go-samples/generic/default/go-server/pkg"
+	"github.com/apache/dubbo-go-samples/generic/default/go-server/pkg"
 )
 
+const appName = "dubbo.io"
+
 var (
-	appName      = "dubbo.io"
-	dubboRefConf config.ReferenceConfig
-	//tripleRefConf config.ReferenceConfig
+	dubboRefConf  config.ReferenceConfig
+	tripleRefConf config.ReferenceConfig
 )
 
 func TestMain(m *testing.M) {
 	hessian.RegisterPOJO(&pkg.User{})
 
 	dubboRefConf = newRefConf("org.apache.dubbo.samples.UserProvider", dubbo.DUBBO)
+	tripleRefConf = newRefConf("org.apache.dubbo.samples.UserProviderTriple", tpconst.TRIPLE)
 
 	os.Exit(m.Run())
 }
diff --git a/integrate_test/generic/default/tests/integration/userprovider_test.go b/integrate_test/generic/default/tests/integration/userprovider_test.go
index a6c58cf..563f60e 100644
--- a/integrate_test/generic/default/tests/integration/userprovider_test.go
+++ b/integrate_test/generic/default/tests/integration/userprovider_test.go
@@ -44,6 +44,19 @@ func TestGetUser1(t *testing.T) {
 	assert.Equal(t, "Joe", resp["name"])
 	assert.Equal(t, int32(48), resp["age"])
 	assert.Equal(t, "A003", resp["iD"])
+
+	o, err = tripleRefConf.GetRPCService().(*generic.GenericService).Invoke(
+		context.TODO(),
+		"GetUser1",
+		[]string{"java.lang.String"},
+		[]hessian.Object{"A003"},
+	)
+	assert.Nil(t, err)
+	assert.IsType(t, make(map[interface{}]interface{}, 0), o)
+	resp = o.(map[interface{}]interface{})
+	assert.Equal(t, "Joe", resp["name"])
+	assert.Equal(t, int32(48), resp["age"])
+	assert.Equal(t, "A003", resp["iD"])
 }
 
 func TestGetUser2(t *testing.T) {
@@ -59,6 +72,19 @@ func TestGetUser2(t *testing.T) {
 	assert.Equal(t, "lily", resp["name"])
 	assert.Equal(t, int32(48), resp["age"])
 	assert.Equal(t, "A003", resp["iD"])
+
+	o, err = tripleRefConf.GetRPCService().(*generic.GenericService).Invoke(
+		context.TODO(),
+		"GetUser2",
+		[]string{"java.lang.String", "java.lang.String"},
+		[]hessian.Object{"A003", "lily"},
+	)
+	assert.Nil(t, err)
+	assert.IsType(t, make(map[interface{}]interface{}, 0), o)
+	resp = o.(map[interface{}]interface{})
+	assert.Equal(t, "lily", resp["name"])
+	assert.Equal(t, int32(48), resp["age"])
+	assert.Equal(t, "A003", resp["iD"])
 }
 
 func TestGetUser3(t *testing.T) {
@@ -74,6 +100,19 @@ func TestGetUser3(t *testing.T) {
 	assert.Equal(t, "Alex Stocks", resp["name"])
 	assert.Equal(t, int32(18), resp["age"])
 	assert.Equal(t, "1", resp["iD"])
+
+	o, err = tripleRefConf.GetRPCService().(*generic.GenericService).Invoke(
+		context.TODO(),
+		"GetUser3",
+		[]string{"int"},
+		[]hessian.Object{1},
+	)
+	assert.Nil(t, err)
+	assert.IsType(t, make(map[interface{}]interface{}, 0), o)
+	resp = o.(map[interface{}]interface{})
+	assert.Equal(t, "Alex Stocks", resp["name"])
+	assert.Equal(t, int32(18), resp["age"])
+	assert.Equal(t, "1", resp["iD"])
 }
 
 func TestGetUser4(t *testing.T) {
@@ -89,6 +128,19 @@ func TestGetUser4(t *testing.T) {
 	assert.Equal(t, "zhangsan", resp["name"])
 	assert.Equal(t, int32(18), resp["age"])
 	assert.Equal(t, "1", resp["iD"])
+
+	o, err = tripleRefConf.GetRPCService().(*generic.GenericService).Invoke(
+		context.TODO(),
+		"GetUser4",
+		[]string{"int", "java.lang.String"},
+		[]hessian.Object{1, "zhangsan"},
+	)
+	assert.Nil(t, err)
+	assert.IsType(t, make(map[interface{}]interface{}, 0), o)
+	resp = o.(map[interface{}]interface{})
+	assert.Equal(t, "zhangsan", resp["name"])
+	assert.Equal(t, int32(18), resp["age"])
+	assert.Equal(t, "1", resp["iD"])
 }
 
 // TODO: waiting for fixing the bug that pass empty array with basic types properly
@@ -105,6 +157,8 @@ func TestGetUser4(t *testing.T) {
 //	assert.Equal(t, "xavierniu", resp["name"])
 //	assert.Equal(t, int32(24), resp["age"])
 //	assert.Equal(t, "1000", resp["iD"])
+//
+// TODO: Triple protocol test is required.
 //}
 
 func TestGetUsers(t *testing.T) {
@@ -120,11 +174,29 @@ func TestGetUsers(t *testing.T) {
 	)
 	assert.Nil(t, err)
 	assert.IsType(t, make(map[interface{}]interface{}, 0), o)
-	//resp := o.(map[interface{}]interface{})
-	//assert.Equal(t, "other-zhangsan", resp[0].(*pkg.User).Name)
-	//assert.Equal(t, "other-lisi", resp[1].(*pkg.User).Name)
-	//assert.Equal(t, "other-lily", resp[2].(*pkg.User).Name)
-	//assert.Equal(t, "other-lisa", resp[3].(*pkg.User).Name)
+	resp := o.(map[interface{}]interface{})
+	assert.Equal(t, "other-zhangsan", resp["users"].([]interface{})[0].(map[interface{}]interface{})["name"])
+	assert.Equal(t, "other-lisi", resp["users"].([]interface{})[1].(map[interface{}]interface{})["name"])
+	assert.Equal(t, "other-lily", resp["users"].([]interface{})[2].(map[interface{}]interface{})["name"])
+	assert.Equal(t, "other-lisa", resp["users"].([]interface{})[3].(map[interface{}]interface{})["name"])
+
+	o, err = tripleRefConf.GetRPCService().(*generic.GenericService).Invoke(
+		context.TODO(),
+		"GetUsers",
+		[]string{"java.util.List"},
+		[]hessian.Object{
+			[]hessian.Object{
+				"001", "002", "003", "004",
+			},
+		},
+	)
+	assert.Nil(t, err)
+	assert.IsType(t, make(map[interface{}]interface{}, 0), o)
+	resp = o.(map[interface{}]interface{})
+	assert.Equal(t, "other-zhangsan", resp["users"].([]interface{})[0].(map[interface{}]interface{})["name"])
+	assert.Equal(t, "other-lisi", resp["users"].([]interface{})[1].(map[interface{}]interface{})["name"])
+	assert.Equal(t, "other-lily", resp["users"].([]interface{})[2].(map[interface{}]interface{})["name"])
+	assert.Equal(t, "other-lisa", resp["users"].([]interface{})[3].(map[interface{}]interface{})["name"])
 }
 
 func TestQueryUser(t *testing.T) {
@@ -146,49 +218,96 @@ func TestQueryUser(t *testing.T) {
 	assert.Equal(t, "panty", resp["name"])
 	assert.Equal(t, int32(25), resp["age"])
 	assert.Equal(t, "3213", resp["iD"])
+
+	o, err = tripleRefConf.GetRPCService().(*generic.GenericService).Invoke(
+		context.TODO(),
+		"queryUser",
+		[]string{"org.apache.dubbo.User"},
+		[]hessian.Object{map[string]hessian.Object{
+			"iD":   "3213",
+			"name": "panty",
+			"age":  25,
+			"time": time.Now(),
+		}},
+	)
+
+	assert.Nil(t, err)
+	assert.IsType(t, make(map[interface{}]interface{}, 0), o)
+	resp = o.(map[interface{}]interface{})
+	assert.Equal(t, "panty", resp["name"])
+	assert.Equal(t, int32(25), resp["age"])
+	assert.Equal(t, "3213", resp["iD"])
 }
 
-//
-//func TestQueryUsers(t *testing.T) {
-//	o, err := referenceConfig.GetRPCService().(*generic.GenericService).Invoke(
-//		context.TODO(),
-//		[]interface{}{
-//			"queryUsers",
-//			[]string{"org.apache.dubbo.User"},
-//			[]hessian.Object{
-//				map[string]hessian.Object{
-//					"id":    "3212",
-//					"name":  "XavierNiu",
-//					"age":   24,
-//					"time":  time.Now().Add(4),
-//					"class": "org.apache.dubbo.User",
-//				},
-//				map[string]hessian.Object{
-//					"iD":    "3213",
-//					"name":  "zhangsan",
-//					"age":   21,
-//					"time":  time.Now().Add(4),
-//					"class": "org.apache.dubbo.User",
-//				},
-//			},
-//		},
-//	)
-//
-//	assert.Nil(t, err)
-//	assert.IsType(t, make(map[interface{}]interface{}, 0), o)
-//	resp := o.(map[interface{}]interface{})
-//	assert.Equal(t, "XavierNiu", resp[0].(*pkg.User).Name)
-//	assert.Equal(t, "zhangsan", resp[1].(*pkg.User).Name)
-//}
-//
+func TestQueryUsers(t *testing.T) {
+	o, err := dubboRefConf.GetRPCService().(*generic.GenericService).Invoke(
+		context.TODO(),
+		"queryUsers",
+		[]string{"java.util.List"},
+		[]hessian.Object{
+			[]hessian.Object{
+				map[string]hessian.Object{
+					"id":    "3212",
+					"name":  "XavierNiu",
+					"age":   24,
+					"time":  time.Now(),
+					"class": "org.apache.dubbo.User",
+				},
+				map[string]hessian.Object{
+					"iD":    "3213",
+					"name":  "zhangsan",
+					"age":   21,
+					"time":  time.Now(),
+					"class": "org.apache.dubbo.User",
+				},
+			},
+		},
+	)
+
+	assert.Nil(t, err)
+	resp, ok := o.(map[interface{}]interface{})
+	assert.True(t, ok)
+	assert.Equal(t, "XavierNiu", resp["users"].([]interface{})[0].(map[interface{}]interface{})["name"])
+	assert.Equal(t, "zhangsan", resp["users"].([]interface{})[1].(map[interface{}]interface{})["name"])
+
+	o, err = tripleRefConf.GetRPCService().(*generic.GenericService).Invoke(
+		context.TODO(),
+		"queryUsers",
+		[]string{"org.apache.dubbo.User"},
+		[]hessian.Object{
+			[]hessian.Object{
+				map[string]hessian.Object{
+					"id":    "3212",
+					"name":  "XavierNiu",
+					"age":   24,
+					"time":  time.Now(),
+					"class": "org.apache.dubbo.User",
+				},
+				map[string]hessian.Object{
+					"iD":    "3213",
+					"name":  "zhangsan",
+					"age":   21,
+					"time":  time.Now(),
+					"class": "org.apache.dubbo.User",
+				},
+			},
+		},
+	)
+
+	assert.Nil(t, err)
+	resp, ok = o.(map[interface{}]interface{})
+	assert.True(t, ok)
+	assert.Equal(t, "XavierNiu", resp["users"].([]interface{})[0].(map[interface{}]interface{})["name"])
+	assert.Equal(t, "zhangsan", resp["users"].([]interface{})[1].(map[interface{}]interface{})["name"])
+}
+
+// TODO: Waiting for hessian-go bugfix
 //func TestQueryAll(t *testing.T) {
-//	o, err := referenceConfig.GetRPCService().(*generic.GenericService).Invoke(
+//	o, err := dubboRefConf.GetRPCService().(*generic.GenericService).Invoke(
 //		context.TODO(),
-//		[]interface{}{
 //			"queryAll",
 //			[]hessian.Object{},
 //			[]hessian.Object{},
-//		},
 //	)
 //
 //	assert.Nil(t, err)