diff --git a/common/rpc_service.go b/common/rpc_service.go index d8578a143eccb05696e633cc3fd61dd6f00c3bc7..2aaa772765e3c76b2062326fd9c6ce35dcee11a2 100644 --- a/common/rpc_service.go +++ b/common/rpc_service.go @@ -40,6 +40,12 @@ type RPCService interface { Version() string } +// for lowercase func +// func MethodMapper() map[string][string] { +// return map[string][string]{} +// } +const METHOD_MAPPER = "MethodMapper" + var ( // Precompute the reflect type for error. Can't use error directly // because Typeof takes an empty interface value. This is annoying. @@ -210,20 +216,26 @@ func isExportedOrBuiltinType(t reflect.Type) bool { // suitableMethods returns suitable Rpc methods of typ func suitableMethods(typ reflect.Type) (string, map[string]*MethodType) { methods := make(map[string]*MethodType) - mts := "" + var mts []string logger.Debugf("[%s] NumMethod is %d", typ.String(), typ.NumMethod()) + method, ok := typ.MethodByName(METHOD_MAPPER) + var methodMapper map[string]string + if ok && method.Type.NumIn() == 1 && method.Type.NumOut() == 1 && method.Type.Out(0).String() == "map[string]string" { + methodMapper = method.Func.Call([]reflect.Value{reflect.New(typ.Elem())})[0].Interface().(map[string]string) + } + for m := 0; m < typ.NumMethod(); m++ { - method := typ.Method(m) + method = typ.Method(m) if mt := suiteMethod(method); mt != nil { - methods[method.Name] = mt - if m == 0 { - mts += method.Name - } else { - mts += "," + method.Name + methodName, ok := methodMapper[method.Name] + if !ok { + methodName = method.Name } + methods[methodName] = mt + mts = append(mts, methodName) } } - return mts, methods + return strings.Join(mts, ","), methods } // suiteMethod returns a suitable Rpc methodType diff --git a/common/rpc_service_test.go b/common/rpc_service_test.go index e5bab2c7153daeb34068c2005def6811b8478532..9a1e08f718d64cc740f8c6ecd7467bf494bbab9c 100644 --- a/common/rpc_service_test.go +++ b/common/rpc_service_test.go @@ -42,6 +42,11 @@ func (s *TestService) Service() string { func (s *TestService) Version() string { return "" } +func (s *TestService) MethodMapper() map[string]string { + return map[string]string{ + "MethodTwo": "methodTwo", + } +} type testService struct { } @@ -87,7 +92,7 @@ func TestServiceMap_Register(t *testing.T) { s := &TestService{} methods, err = ServiceMap.Register("testporotocol", s) assert.NoError(t, err) - assert.Equal(t, "MethodOne,MethodTwo", methods) + assert.Equal(t, "MethodOne,methodTwo", methods) // repeat methods, err = ServiceMap.Register("testporotocol", s) diff --git a/examples/dubbo/go-client/app/client.go b/examples/dubbo/go-client/app/client.go index fb2d20d3aa03b5899ad02a8aeefad82b3907d5d7..954717d1687055ca601fd64f63031a9841f217b8 100644 --- a/examples/dubbo/go-client/app/client.go +++ b/examples/dubbo/go-client/app/client.go @@ -93,14 +93,14 @@ func main() { } println("response result: %v", ret1) - println("\n\n\nstart to test dubbo - getUser2") + println("\n\n\nstart to test dubbo - getUser") user = &User{} - err = userProvider.GetUser2(context.TODO(), []interface{}{1}, user) + var i int32 = 1 + err = userProvider.GetUser2(context.TODO(), []interface{}{i}, user) if err != nil { - println("getUser - error: %v", err) - } else { - println("response result: %v", user) + panic(err) } + println("response result: %v", user) println("\n\n\nstart to test dubbo - getErr") user = &User{} diff --git a/examples/dubbo/go-server/app/user.go b/examples/dubbo/go-server/app/user.go index e4400cc270ad46c84085b52e8879bbd49969bcb0..953c38bca2b44abe9c0c43aae4e6ce291f23ea7c 100644 --- a/examples/dubbo/go-server/app/user.go +++ b/examples/dubbo/go-server/app/user.go @@ -130,6 +130,14 @@ func (u *UserProvider) getUser(userId string) (*User, error) { return nil, fmt.Errorf("invalid user id:%s", userId) } +func (u *UserProvider) GetUser2(ctx context.Context, req []interface{}, rsp *User) error { + var err error + + println("req:%#v", req) + rsp.Id = strconv.Itoa(int(req[0].(int32))) + return err +} + func (u *UserProvider) GetUser(ctx context.Context, req []interface{}, rsp *User) error { var ( err error @@ -182,6 +190,12 @@ func (u *UserProvider) GetUsers(req []interface{}) ([]interface{}, error) { return []interface{}{user, user1}, err } +func (s *UserProvider) MethodMapper() map[string]string { + return map[string]string{ + "GetUser2": "getUser", + } +} + 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 f1100e79ac2ee31ea13b98af345d5472eb08488e..98fa6bdc216ca3cc36a9a3ba63d301b3bab951a4 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 @@ -51,6 +51,10 @@ public class Consumer { System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " + " UserInfo, Id:" + user2.getId() + ", name:" + user2.getName() + ", sex:" + user2.getSex().toString() + ", age:" + user2.getAge() + ", time:" + user2.getTime().toString()); + User user3 = userProvider.getUser(1); + System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " + + " UserInfo, Id:" + user3.getId() + ", name:" + user3.getName() + ", sex:" + user3.getSex().toString() + + ", age:" + user3.getAge() + ", time:" + user3.getTime().toString()); User user9 = userProvider.GetUser1("A003"); } catch (Exception e) { diff --git a/examples/dubbo/java-client/src/main/java/com/ikurento/user/UserProvider.java b/examples/dubbo/java-client/src/main/java/com/ikurento/user/UserProvider.java index 036f46332105710ffcc53465b487ada860c25172..c7cca9229906111e269de9cd4cd972dc059d7e85 100644 --- a/examples/dubbo/java-client/src/main/java/com/ikurento/user/UserProvider.java +++ b/examples/dubbo/java-client/src/main/java/com/ikurento/user/UserProvider.java @@ -22,6 +22,7 @@ public interface UserProvider { User GetUser(String userId); User GetErr(String userId) throws Exception; User GetUser1(String userId); + User getUser(int usercode); List<User> GetUsers(List<String> userIdList); User GetUser0(String userId, String name); diff --git a/examples/jsonrpc/go-client/app/client.go b/examples/jsonrpc/go-client/app/client.go index 47d0b6064740d1ad996218991af2e3c0ec85ec9d..ec8bc6dd62ed77d9daf1ecb0b1a18e79ce4916c1 100644 --- a/examples/jsonrpc/go-client/app/client.go +++ b/examples/jsonrpc/go-client/app/client.go @@ -90,10 +90,9 @@ func main() { user = &JsonRPCUser{} err = userProvider.GetUser2(context.TODO(), []interface{}{1}, user) if err != nil { - println("getUser - error: %v", err) - } else { - println("response result: %v", user) + panic(err) } + println("response result: %v", user) println("\n\n\nstart to test jsonrpc illegal method") err = userProvider.GetUser1(context.TODO(), []interface{}{"A003"}, user) diff --git a/examples/jsonrpc/go-server/app/user.go b/examples/jsonrpc/go-server/app/user.go index fbe6f3339c212d2bd42d52b6bbf7c7fcec6fb9c3..c0beb31d17f12185b687b073b2db8d831ad93edc 100644 --- a/examples/jsonrpc/go-server/app/user.go +++ b/examples/jsonrpc/go-server/app/user.go @@ -20,6 +20,7 @@ package main import ( "context" "fmt" + "strconv" "time" ) @@ -127,6 +128,15 @@ func (u *UserProvider) GetUser0(id string, name string) (User, error) { return *user, err } +func (u *UserProvider) GetUser2(ctx context.Context, req []interface{}, rsp *User) error { + var err error + + println("req:%#v", req) + rsp.Id = strconv.FormatFloat(req[0].(float64), 'f', 0, 64) + rsp.Sex = Gender(MAN).String() + return err +} + func (u *UserProvider) GetUsers(req []interface{}) ([]User, error) { var err error @@ -146,6 +156,12 @@ func (u *UserProvider) GetUsers(req []interface{}) ([]User, error) { return []User{*user, *user1}, err } +func (s *UserProvider) MethodMapper() map[string]string { + return map[string]string{ + "GetUser2": "getUser", + } +} + 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 b2b8e95f94b5112721e12bf738b05bdd3bd9c419..f8847fe0287e0ce24a7d70b83c646c6df92fdd2f 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 @@ -55,6 +55,10 @@ public class Consumer { System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " + " UserInfo, Id:" + user2.getId() + ", name:" + user2.getName() + ", sex:" + user2.getSex().toString() + ", age:" + user2.getAge() + ", time:" + user2.getTime().toString()); + User user3 = userProvider.getUser(1); + System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " + + " UserInfo, Id:" + user3.getId() + ", name:" + user3.getName() + ", sex:" + user3.getSex().toString() + + ", age:" + user3.getAge() + ", time:" + user3.getTime().toString()); } catch (Exception e) { e.printStackTrace(); } diff --git a/examples/jsonrpc/java-client/src/main/java/com/ikurento/user/UserProvider.java b/examples/jsonrpc/java-client/src/main/java/com/ikurento/user/UserProvider.java index d5bce8105673a24d78ddd3a636788d1ccf8e57a6..255283cadb99717b8571fdd3776c1414ed5232df 100644 --- a/examples/jsonrpc/java-client/src/main/java/com/ikurento/user/UserProvider.java +++ b/examples/jsonrpc/java-client/src/main/java/com/ikurento/user/UserProvider.java @@ -20,6 +20,7 @@ import java.util.List; public interface UserProvider { User GetUser(String userId); + User getUser(int usercode); List<User> GetUsers(List<String> userIdList); User GetUser0(String userId, String name); diff --git a/protocol/dubbo/listener.go b/protocol/dubbo/listener.go index ea8c38db9817ae2df078ef9b21caaf7b13751b3e..b2ac981c19365d0b300b219d1377b83286da241b 100644 --- a/protocol/dubbo/listener.go +++ b/protocol/dubbo/listener.go @@ -268,13 +268,13 @@ func (h *RpcServerHandler) callService(req *DubboPackage, ctx context.Context) { if e := recover(); e != nil { req.Header.ResponseStatus = hessian.Response_SERVER_ERROR if err, ok := e.(error); ok { - logger.Errorf("callService panic: %#v", err) + logger.Errorf("callService panic: %+v", err) req.Body = perrors.WithStack(err) } else if err, ok := e.(string); ok { - logger.Errorf("callService panic: %#v", perrors.New(err)) + logger.Errorf("callService panic: %+v", perrors.New(err)) req.Body = perrors.New(err) } else { - logger.Errorf("callService panic: %#v, this is impossible.", e) + logger.Errorf("callService panic: %+v, this is impossible.", e) req.Body = e } }