From ddee9d80b6b248c7bc37fccfbf5cc682dba4c5cf Mon Sep 17 00:00:00 2001 From: fangyincheng <fangyincheng@sina.com> Date: Sat, 25 May 2019 19:37:52 +0800 Subject: [PATCH] Fix:support []interface{} --- examples/dubbo/go-client/app/client.go | 7 ++++ examples/dubbo/go-client/app/user.go | 1 + .../dubbo/go-client/profiles/dev/client.yml | 2 +- .../go-client/profiles/release/client.yml | 2 +- .../dubbo/go-client/profiles/test/client.yml | 2 +- examples/dubbo/go-server/app/user.go | 19 ++++++++++ .../main/java/com/ikurento/user/Consumer.java | 2 +- examples/jsonrpc/go-client/app/client.go | 9 ++++- examples/jsonrpc/go-client/app/user.go | 1 + examples/jsonrpc/go-server/app/user.go | 19 ++++++++++ .../main/java/com/ikurento/user/Consumer.java | 2 +- go.mod | 2 +- go.sum | 4 +- protocol/dubbo/client_test.go | 38 ++++++++++++++++++- protocol/jsonrpc/http_test.go | 37 +++++++++++++++++- protocol/jsonrpc/jsonrpc_invoker_test.go | 2 +- 16 files changed, 135 insertions(+), 14 deletions(-) diff --git a/examples/dubbo/go-client/app/client.go b/examples/dubbo/go-client/app/client.go index 5231457f7..c95654267 100644 --- a/examples/dubbo/go-client/app/client.go +++ b/examples/dubbo/go-client/app/client.go @@ -83,6 +83,13 @@ func main() { } println("response result: %v", ret) + println("\n\n\nstart to test dubbo - GetUsers") + ret1, err := conMap["com.ikurento.user.UserProvider"].GetRPCService().(*UserProvider).GetUsers([]interface{}{[]interface{}{"A002", "A003"}}) + if err != nil { + panic(err) + } + println("response result: %v", ret1) + println("\n\n\nstart to test dubbo - getUser") user = &User{} err = conMap["com.ikurento.user.UserProvider"].GetRPCService().(*UserProvider).GetUser2(context.TODO(), []interface{}{1}, user) diff --git a/examples/dubbo/go-client/app/user.go b/examples/dubbo/go-client/app/user.go index 9ac1974d3..7e9d3daed 100644 --- a/examples/dubbo/go-client/app/user.go +++ b/examples/dubbo/go-client/app/user.go @@ -93,6 +93,7 @@ func (User) JavaClassName() string { } type UserProvider struct { + GetUsers func(req []interface{}) ([]interface{}, error) GetUser func(ctx context.Context, req []interface{}, rsp *User) error GetUser0 func(id string, name string) (User, error) GetUser1 func(ctx context.Context, req []interface{}, rsp *User) error diff --git a/examples/dubbo/go-client/profiles/dev/client.yml b/examples/dubbo/go-client/profiles/dev/client.yml index 5e58f4cc6..93ce354c9 100644 --- a/examples/dubbo/go-client/profiles/dev/client.yml +++ b/examples/dubbo/go-client/profiles/dev/client.yml @@ -62,5 +62,5 @@ protocol_conf: tcp_read_timeout: "1s" tcp_write_timeout: "5s" wait_timeout: "1s" - max_msg_len: 1024 + max_msg_len: 10240 session_name: "client" diff --git a/examples/dubbo/go-client/profiles/release/client.yml b/examples/dubbo/go-client/profiles/release/client.yml index 269e9cbac..cb36b6946 100644 --- a/examples/dubbo/go-client/profiles/release/client.yml +++ b/examples/dubbo/go-client/profiles/release/client.yml @@ -62,5 +62,5 @@ protocol_conf: tcp_read_timeout: "1s" tcp_write_timeout: "5s" wait_timeout: "1s" - max_msg_len: 1024 + max_msg_len: 10240 session_name: "client" diff --git a/examples/dubbo/go-client/profiles/test/client.yml b/examples/dubbo/go-client/profiles/test/client.yml index 269e9cbac..cb36b6946 100644 --- a/examples/dubbo/go-client/profiles/test/client.yml +++ b/examples/dubbo/go-client/profiles/test/client.yml @@ -62,5 +62,5 @@ protocol_conf: tcp_read_timeout: "1s" tcp_write_timeout: "5s" wait_timeout: "1s" - max_msg_len: 1024 + max_msg_len: 10240 session_name: "client" diff --git a/examples/dubbo/go-server/app/user.go b/examples/dubbo/go-server/app/user.go index 12119b0b6..427125bd1 100644 --- a/examples/dubbo/go-server/app/user.go +++ b/examples/dubbo/go-server/app/user.go @@ -156,6 +156,25 @@ func (u *UserProvider) GetUser0(id string, name string) (User, error) { return *user, err } +func (u *UserProvider) GetUsers(req []interface{}) ([]interface{}, error) { + var err error + + println("req:%s", req) + t := req[0].([]interface{}) + user, err := u.getUser(t[0].(string)) + if err != nil { + return nil, err + } + println("user:%v", user) + user1, err := u.getUser(t[1].(string)) + if err != nil { + return nil, err + } + println("user1:%v", user1) + + return []interface{}{user, user1}, err +} + func (u *UserProvider) Service() string { return "com.ikurento.user.UserProvider" } diff --git a/examples/dubbo/java-client/src/main/java/com/ikurento/user/Consumer.java b/examples/dubbo/java-client/src/main/java/com/ikurento/user/Consumer.java index 69229943f..b410813c7 100644 --- a/examples/dubbo/java-client/src/main/java/com/ikurento/user/Consumer.java +++ b/examples/dubbo/java-client/src/main/java/com/ikurento/user/Consumer.java @@ -79,7 +79,7 @@ public class Consumer { //启动consumer的入口函数(在配置文件中指定) public void start() throws Exception { testGetUser(); - // testGetUsers(); + testGetUsers(); // Thread.sleep(120000); Thread.sleep(2000); } diff --git a/examples/jsonrpc/go-client/app/client.go b/examples/jsonrpc/go-client/app/client.go index b693d05ee..b71f0efa2 100644 --- a/examples/jsonrpc/go-client/app/client.go +++ b/examples/jsonrpc/go-client/app/client.go @@ -72,13 +72,20 @@ func main() { } println("response result: %v", user) - println("\n\n\nstart to test dubbo - GetUser0") + println("\n\n\nstart to test jsonrpc - GetUser0") ret, err := conMap["com.ikurento.user.UserProvider"].GetRPCService().(*UserProvider).GetUser0("A003", "Moorse") if err != nil { panic(err) } println("response result: %v", ret) + println("\n\n\nstart to test jsonrpc - GetUsers") + ret1, err := conMap["com.ikurento.user.UserProvider"].GetRPCService().(*UserProvider).GetUsers([]interface{}{[]interface{}{"A002", "A003"}}) + if err != nil { + panic(err) + } + println("response result: %v", ret1) + println("\n\n\nstart to test jsonrpc - getUser") user = &JsonRPCUser{} err = conMap["com.ikurento.user.UserProvider"].GetRPCService().(*UserProvider).GetUser2(context.TODO(), []interface{}{1}, user) diff --git a/examples/jsonrpc/go-client/app/user.go b/examples/jsonrpc/go-client/app/user.go index 17a24dbec..0d1598761 100644 --- a/examples/jsonrpc/go-client/app/user.go +++ b/examples/jsonrpc/go-client/app/user.go @@ -44,6 +44,7 @@ func (u JsonRPCUser) String() string { } type UserProvider struct { + GetUsers func(req []interface{}) ([]JsonRPCUser, error) GetUser func(ctx context.Context, req []interface{}, rsp *JsonRPCUser) error GetUser0 func(id string, name string) (JsonRPCUser, error) GetUser1 func(ctx context.Context, req []interface{}, rsp *JsonRPCUser) error diff --git a/examples/jsonrpc/go-server/app/user.go b/examples/jsonrpc/go-server/app/user.go index 5adcde0cc..9170de431 100644 --- a/examples/jsonrpc/go-server/app/user.go +++ b/examples/jsonrpc/go-server/app/user.go @@ -124,6 +124,25 @@ func (u *UserProvider) GetUser0(id string, name string) (User, error) { return *user, err } +func (u *UserProvider) GetUsers(req []interface{}) ([]User, error) { + var err error + + println("req:%s", req) + t := req[0].([]interface{}) + user, err := u.getUser(t[0].(string)) + if err != nil { + return nil, err + } + println("user:%v", user) + user1, err := u.getUser(t[1].(string)) + if err != nil { + return nil, err + } + println("user1:%v", user1) + + return []User{*user, *user1}, err +} + func (u *UserProvider) Service() string { return "com.ikurento.user.UserProvider" } diff --git a/examples/jsonrpc/java-client/src/main/java/com/ikurento/user/Consumer.java b/examples/jsonrpc/java-client/src/main/java/com/ikurento/user/Consumer.java index 832f78e85..b2b8e95f9 100644 --- a/examples/jsonrpc/java-client/src/main/java/com/ikurento/user/Consumer.java +++ b/examples/jsonrpc/java-client/src/main/java/com/ikurento/user/Consumer.java @@ -83,7 +83,7 @@ public class Consumer { //启动consumer的入口函数(在配置文件中指定) public void start() throws Exception { testGetUser(); - // testGetUsers(); + testGetUsers(); // Thread.sleep(120000); Thread.sleep(2000); } diff --git a/go.mod b/go.mod index e41f99068..b03fcd5e5 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module github.com/dubbo/go-for-apache-dubbo require ( github.com/dubbogo/getty v0.0.0-20190523180329-bdf5e640ea53 - github.com/dubbogo/hessian2 v0.0.0-20190521184416-2dbe10487e1d + github.com/dubbogo/hessian2 v0.0.0-20190525165532-d994415a90c3 github.com/pkg/errors v0.8.1 github.com/samuel/go-zookeeper v0.0.0-20180130194729-c4fab1ac1bec github.com/stretchr/testify v1.3.0 diff --git a/go.sum b/go.sum index d53a88c49..e7f6c3037 100644 --- a/go.sum +++ b/go.sum @@ -6,8 +6,8 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dubbogo/getty v0.0.0-20190523180329-bdf5e640ea53 h1:bniSNoC4xnAbrx4estwc9F0qkWnh6ZDsAS0y9d7mPos= github.com/dubbogo/getty v0.0.0-20190523180329-bdf5e640ea53/go.mod h1:cRMSuoCmwc5lULFFnYZTxyCfZhObmRTNbS7XRnPNHSo= -github.com/dubbogo/hessian2 v0.0.0-20190521184416-2dbe10487e1d h1:t4xwsC+7Vqh/a9IvNQehzI6coThd7+DLi5MKdleFA64= -github.com/dubbogo/hessian2 v0.0.0-20190521184416-2dbe10487e1d/go.mod h1:XFGDn4oSZX26zkcfhkM/fCJrOqwQJxk/xgWW1KMJBKM= +github.com/dubbogo/hessian2 v0.0.0-20190525165532-d994415a90c3 h1:qK0t4cWXFAng5VoPRdvnUyRyB9TdE+Q7G3ROOEY86tE= +github.com/dubbogo/hessian2 v0.0.0-20190525165532-d994415a90c3/go.mod h1:XFGDn4oSZX26zkcfhkM/fCJrOqwQJxk/xgWW1KMJBKM= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= diff --git a/protocol/dubbo/client_test.go b/protocol/dubbo/client_test.go index 2938f569d..216d2e10d 100644 --- a/protocol/dubbo/client_test.go +++ b/protocol/dubbo/client_test.go @@ -16,13 +16,13 @@ package dubbo import ( "context" + "github.com/dubbogo/hessian2" "sync" "testing" "time" ) import ( - "github.com/dubbogo/hessian2" perrors "github.com/pkg/errors" "github.com/stretchr/testify/assert" ) @@ -79,6 +79,26 @@ func TestClient_Call(t *testing.T) { assert.NoError(t, err) assert.Equal(t, User{Id: "1", Name: "username"}, *user) + user = &User{} + err = c.Call("127.0.0.1:20000", url, "GetUser1", []interface{}{"1", "username"}, user) + assert.EqualError(t, err, "java exception:error") + + user2 := []interface{}{} + err = c.Call("127.0.0.1:20000", url, "GetUser2", []interface{}{"1", "username"}, &user2) + assert.NoError(t, err) + assert.Equal(t, &User{Id: "1", Name: "username"}, user2[0]) + + user2 = []interface{}{} + err = c.Call("127.0.0.1:20000", url, "GetUser3", []interface{}{[]interface{}{"1", "username"}}, &user2) + assert.NoError(t, err) + assert.Equal(t, &User{Id: "1", Name: "username"}, user2[0]) + + user3 := map[interface{}]interface{}{} + err = c.Call("127.0.0.1:20000", url, "GetUser4", []interface{}{map[interface{}]interface{}{"id": "1", "name": "username"}}, &user3) + assert.NoError(t, err) + assert.NotNil(t, user3) + assert.Equal(t, &User{Id: "1", Name: "username"}, user3["key"]) + // destroy proto.Destroy() } @@ -114,7 +134,7 @@ func InitTest(t *testing.T) (protocol.Protocol, common.URL) { methods, err := common.ServiceMap.Register("dubbo", &UserProvider{}) assert.NoError(t, err) - assert.Equal(t, "GetUser,GetUser0,GetUser1", methods) + assert.Equal(t, "GetUser,GetUser0,GetUser1,GetUser2,GetUser3,GetUser4", methods) // config SetClientConf(ClientConfig{ @@ -191,6 +211,20 @@ func (u *UserProvider) GetUser1(ctx context.Context, req []interface{}, rsp *Use return perrors.New("error") } +func (u *UserProvider) GetUser2(ctx context.Context, req []interface{}, rsp *[]interface{}) error { + *rsp = append(*rsp, User{Id: req[0].(string), Name: req[1].(string)}) + return nil +} + +func (u *UserProvider) GetUser3(ctx context.Context, req []interface{}) ([]interface{}, error) { + + return []interface{}{User{Id: req[0].([]interface{})[0].(string), Name: req[0].([]interface{})[1].(string)}}, nil +} + +func (u *UserProvider) GetUser4(ctx context.Context, req []interface{}) (map[interface{}]interface{}, error) { + return map[interface{}]interface{}{"key": User{Id: req[0].(map[interface{}]interface{})["id"].(string), Name: req[0].(map[interface{}]interface{})["name"].(string)}}, nil +} + func (u *UserProvider) Service() string { return "com.ikurento.user.UserProvider" } diff --git a/protocol/jsonrpc/http_test.go b/protocol/jsonrpc/http_test.go index e70d5b83f..55f86f454 100644 --- a/protocol/jsonrpc/http_test.go +++ b/protocol/jsonrpc/http_test.go @@ -47,7 +47,7 @@ func TestHTTPClient_Call(t *testing.T) { methods, err := common.ServiceMap.Register("jsonrpc", &UserProvider{}) assert.NoError(t, err) - assert.Equal(t, "GetUser,GetUser0,GetUser1", methods) + assert.Equal(t, "GetUser,GetUser0,GetUser1,GetUser2,GetUser3", methods) // Export proto := GetProtocol() @@ -75,7 +75,7 @@ func TestHTTPClient_Call(t *testing.T) { assert.Equal(t, "1", reply.Id) assert.Equal(t, "username", reply.Name) - // call GetUser + // call GetUser0 ctx = context.WithValue(context.Background(), constant.DUBBOGO_CTX_KEY, map[string]string{ "X-Proxy-Id": "dubbogo", "X-Services": url.Path, @@ -100,6 +100,30 @@ func TestHTTPClient_Call(t *testing.T) { assert.True(t, strings.Contains(err.Error(), "500 Internal Server Error")) assert.True(t, strings.Contains(err.Error(), "\\\"result\\\":{},\\\"error\\\":{\\\"code\\\":-32000,\\\"message\\\":\\\"error\\\"}")) + // call GetUser2 + ctx = context.WithValue(context.Background(), constant.DUBBOGO_CTX_KEY, map[string]string{ + "X-Proxy-Id": "dubbogo", + "X-Services": url.Path, + "X-Method": "GetUser", + }) + req = client.NewRequest(url, "GetUser2", []interface{}{"1", "username"}) + reply1 := []User{} + err = client.Call(ctx, url, req, &reply1) + assert.NoError(t, err) + assert.Equal(t, User{Id: "1", Name: "username"}, reply1[0]) + + // call GetUser3 + ctx = context.WithValue(context.Background(), constant.DUBBOGO_CTX_KEY, map[string]string{ + "X-Proxy-Id": "dubbogo", + "X-Services": url.Path, + "X-Method": "GetUser", + }) + req = client.NewRequest(url, "GetUser3", []interface{}{"1", "username"}) + reply1 = []User{} + err = client.Call(ctx, url, req, &reply1) + assert.NoError(t, err) + assert.Equal(t, User{Id: "1", Name: "username"}, reply1[0]) + // destroy proto.Destroy() @@ -119,6 +143,15 @@ func (u *UserProvider) GetUser1(ctx context.Context, req []interface{}, rsp *Use return perrors.New("error") } +func (u *UserProvider) GetUser2(ctx context.Context, req []interface{}, rsp *[]User) error { + *rsp = append(*rsp, User{Id: req[0].(string), Name: req[1].(string)}) + return nil +} + +func (u *UserProvider) GetUser3(ctx context.Context, req []interface{}) ([]User, error) { + return []User{{Id: req[0].(string), Name: req[1].(string)}}, nil +} + func (u *UserProvider) Service() string { return "com.ikurento.user.UserProvider" } diff --git a/protocol/jsonrpc/jsonrpc_invoker_test.go b/protocol/jsonrpc/jsonrpc_invoker_test.go index 3bc4a29af..2d248469e 100644 --- a/protocol/jsonrpc/jsonrpc_invoker_test.go +++ b/protocol/jsonrpc/jsonrpc_invoker_test.go @@ -34,7 +34,7 @@ func TestJsonrpcInvoker_Invoke(t *testing.T) { methods, err := common.ServiceMap.Register("jsonrpc", &UserProvider{}) assert.NoError(t, err) - assert.Equal(t, "GetUser,GetUser0,GetUser1", methods) + assert.Equal(t, "GetUser,GetUser0,GetUser1,GetUser2,GetUser3", methods) // Export proto := GetProtocol() -- GitLab