From 16a1f915b234968aaa2b54b9235297b4ed63fc01 Mon Sep 17 00:00:00 2001
From: fangyincheng <fangyincheng@sina.com>
Date: Mon, 20 May 2019 21:36:11 +0800
Subject: [PATCH] Add:add lowercase function & update examples

---
 common/proxy/proxy.go                                 |  8 ++++++--
 common/proxy/proxy_test.go                            |  9 ++++++---
 examples/dubbo/go-client/app/client.go                |  8 ++++++++
 examples/dubbo/go-client/app/user.go                  |  1 +
 .../src/main/java/com/ikurento/user/Consumer.java     |  4 ++++
 .../main/resources/META-INF/spring/dubbo.provider.xml |  3 ++-
 examples/jsonrpc/go-client/app/client.go              | 10 +++++++++-
 examples/jsonrpc/go-client/app/user.go                |  3 ++-
 .../src/main/java/com/ikurento/user/Consumer.java     | 11 +++++++++++
 .../main/resources/META-INF/spring/dubbo.provider.xml |  3 ++-
 10 files changed, 51 insertions(+), 9 deletions(-)

diff --git a/common/proxy/proxy.go b/common/proxy/proxy.go
index 8a2b65c6b..6c42dab8f 100644
--- a/common/proxy/proxy.go
+++ b/common/proxy/proxy.go
@@ -82,6 +82,10 @@ func (p *Proxy) Implement(v common.RPCService) {
 	numField := valueOfElem.NumField()
 	for i := 0; i < numField; i++ {
 		t := typeOf.Field(i)
+		methodName := t.Tag.Get("dubbo")
+		if methodName == "" {
+			methodName = t.Name
+		}
 		f := valueOfElem.Field(i)
 		if f.Kind() == reflect.Func && f.IsValid() && f.CanSet() {
 			if t.Type.NumIn() != 2 && t.Type.NumIn() != 3 {
@@ -115,8 +119,8 @@ func (p *Proxy) Implement(v common.RPCService) {
 			funcOuts[0] = t.Type.Out(0)
 
 			// do method proxy here:
-			f.Set(reflect.MakeFunc(f.Type(), makeDubboCallProxy(t.Name, funcOuts)))
-			log.Debug("set method [%s]", t.Name)
+			f.Set(reflect.MakeFunc(f.Type(), makeDubboCallProxy(methodName, funcOuts)))
+			log.Debug("set method [%s]", methodName)
 		}
 	}
 
diff --git a/common/proxy/proxy_test.go b/common/proxy/proxy_test.go
index 8a7c8c880..8720298aa 100644
--- a/common/proxy/proxy_test.go
+++ b/common/proxy/proxy_test.go
@@ -17,9 +17,10 @@ import (
 )
 
 type TestService struct {
-	MethodOne func(context.Context, []interface{}, *struct{}) error
-	MethodTwo func([]interface{}, *struct{}) error
-	Echo      func([]interface{}, *struct{}) error
+	MethodOne   func(context.Context, []interface{}, *struct{}) error
+	MethodTwo   func([]interface{}, *struct{}) error
+	MethodThree func([]interface{}, *struct{}) error `dubbo:"methodThree"`
+	Echo        func([]interface{}, *struct{}) error
 }
 
 func (s *TestService) Service() string {
@@ -48,6 +49,8 @@ func TestProxy_Implement(t *testing.T) {
 	assert.NoError(t, err)
 	err = p.Get().(*TestService).MethodTwo(nil, nil)
 	assert.NoError(t, err)
+	err = p.Get().(*TestService).MethodThree(nil, nil)
+	assert.NoError(t, err)
 	err = p.Get().(*TestService).Echo(nil, nil)
 	assert.NoError(t, err)
 
diff --git a/examples/dubbo/go-client/app/client.go b/examples/dubbo/go-client/app/client.go
index ddec042d7..3632a0e72 100644
--- a/examples/dubbo/go-client/app/client.go
+++ b/examples/dubbo/go-client/app/client.go
@@ -69,6 +69,14 @@ func main() {
 	}
 	gxlog.CInfo("response result: %v", user)
 
+	gxlog.CInfo("\n\n\nstart to test dubbo - getUser")
+	user = &User{}
+	err = conMap["com.ikurento.user.UserProvider"].GetRPCService().(*UserProvider).GetUser2(context.TODO(), []interface{}{1}, user)
+	if err != nil {
+		fmt.Println("getUser - error: ", err)
+	}
+	gxlog.CInfo("response result: %v", user)
+
 	gxlog.CInfo("\n\n\nstart to test dubbo illegal method")
 	err = conMap["com.ikurento.user.UserProvider"].GetRPCService().(*UserProvider).GetUser1(context.TODO(), []interface{}{"A003"}, user)
 	if err != nil {
diff --git a/examples/dubbo/go-client/app/user.go b/examples/dubbo/go-client/app/user.go
index 119511596..1dd100ce4 100644
--- a/examples/dubbo/go-client/app/user.go
+++ b/examples/dubbo/go-client/app/user.go
@@ -78,6 +78,7 @@ func (User) JavaClassName() string {
 type UserProvider struct {
 	GetUser  func(ctx context.Context, req []interface{}, rsp *User) error
 	GetUser1 func(ctx context.Context, req []interface{}, rsp *User) error
+	GetUser2 func(ctx context.Context, req []interface{}, rsp *User) error   `dubbo:"getUser"`
 	Echo     func(ctx context.Context, req []interface{}, rsp *string) error // Echo represent EchoFilter will be used
 }
 
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 5830ac716..c04acefbe 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
@@ -13,6 +13,7 @@ package com.ikurento.user;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
+import com.alibaba.dubbo.rpc.service.EchoService;
 import java.util.List;
 
 public class Consumer {
@@ -39,6 +40,9 @@ public class Consumer {
 
     private void testGetUser() throws Exception {
         try {
+            EchoService echoService = (EchoService)userProvider;
+            Object status = echoService.$echo("OK");
+            System.out.println("echo: "+status);
             User user1 = userProvider.GetUser("A003");
             System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
                     " UserInfo, Id:" + user1.getId() + ", name:" + user1.getName() + ", sex:" + user1.getSex().toString()
diff --git a/examples/dubbo/java-server/src/main/resources/META-INF/spring/dubbo.provider.xml b/examples/dubbo/java-server/src/main/resources/META-INF/spring/dubbo.provider.xml
index bdbd84417..b3a1b19d6 100644
--- a/examples/dubbo/java-server/src/main/resources/META-INF/spring/dubbo.provider.xml
+++ b/examples/dubbo/java-server/src/main/resources/META-INF/spring/dubbo.provider.xml
@@ -24,12 +24,13 @@
 	<dubbo:application name="user-info-server"/>
 	<!-- 杩炴帴鍒板摢涓湰鍦版敞鍐屼腑蹇� -->
 	<dubbo:registry id="ikurento"  address="zookeeper://127.0.0.1:2181" />
+	<dubbo:registry id="ikurento2"  address="zookeeper://127.0.0.1:2182" />
 	<!-- 鐢╠ubbo鍗忚鍦�20880绔彛鏆撮湶鏈嶅姟 -->
     <!-- dubbo:protocol host="127.0.0.1" / -->
 	<dubbo:protocol id="dubbo" name="dubbo" host="127.0.0.1" port="20010" />
 	<dubbo:protocol id="jsonrpc" name="jsonrpc" host="127.0.0.1" port="10010" />
 	<!-- 澹版槑闇€瑕佹毚闇茬殑鏈嶅姟鎺ュ彛 -->
-	<dubbo:service registry="ikurento" timeout="3000" interface="com.ikurento.user.UserProvider" ref="demoService"/>
+	<dubbo:service registry="ikurento,ikurento2" timeout="3000" interface="com.ikurento.user.UserProvider" ref="demoService"/>
 	<dubbo:service registry="ikurento" timeout="3000" interface="com.ikurento.user.UserProvider" ref="otherService" version="2.0"/>
 	<dubbo:service registry="ikurento" timeout="3000" interface="com.ikurento.user.UserProvider" ref="otherService" group="as" version="2.0"/>
 
diff --git a/examples/jsonrpc/go-client/app/client.go b/examples/jsonrpc/go-client/app/client.go
index cb8ca1923..5eb6babb2 100644
--- a/examples/jsonrpc/go-client/app/client.go
+++ b/examples/jsonrpc/go-client/app/client.go
@@ -50,7 +50,7 @@ func main() {
 	res := ""
 	err := conMap["com.ikurento.user.UserProvider"].GetRPCService().(*UserProvider).Echo(context.TODO(), []interface{}{"OK"}, &res)
 	if err != nil {
-		panic(err)
+		fmt.Println("echo - error: ", err)
 	}
 	gxlog.CInfo("res: %s", res)
 
@@ -64,6 +64,14 @@ func main() {
 	}
 	gxlog.CInfo("response result: %v", user)
 
+	gxlog.CInfo("\n\n\nstart to test jsonrpc - getUser")
+	user = &JsonRPCUser{}
+	err = conMap["com.ikurento.user.UserProvider"].GetRPCService().(*UserProvider).GetUser2(context.TODO(), []interface{}{1}, user)
+	if err != nil {
+		fmt.Println("getUser - error: ", err)
+	}
+	gxlog.CInfo("response result: %v", user)
+
 	gxlog.CInfo("\n\n\nstart to test jsonrpc illegal method")
 	err = conMap["com.ikurento.user.UserProvider"].GetRPCService().(*UserProvider).GetUser1(context.TODO(), []interface{}{"A003"}, user)
 	if err != nil {
diff --git a/examples/jsonrpc/go-client/app/user.go b/examples/jsonrpc/go-client/app/user.go
index 5030f8103..20a62a010 100644
--- a/examples/jsonrpc/go-client/app/user.go
+++ b/examples/jsonrpc/go-client/app/user.go
@@ -32,7 +32,8 @@ func (u JsonRPCUser) String() string {
 type UserProvider struct {
 	GetUser  func(ctx context.Context, req []interface{}, rsp *JsonRPCUser) error
 	GetUser1 func(ctx context.Context, req []interface{}, rsp *JsonRPCUser) error
-	Echo     func(ctx context.Context, req []interface{}, rsp *string) error // Echo represent EchoFilter will be used
+	GetUser2 func(ctx context.Context, req []interface{}, rsp *JsonRPCUser) error `dubbo:"getUser"`
+	Echo     func(ctx context.Context, req []interface{}, rsp *string) error      // Echo represent EchoFilter will be used
 }
 
 func (u *UserProvider) Service() string {
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 5830ac716..a9e5aaa51 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
@@ -13,6 +13,7 @@ package com.ikurento.user;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
+import com.alibaba.dubbo.rpc.service.EchoService;
 import java.util.List;
 
 public class Consumer {
@@ -39,6 +40,16 @@ public class Consumer {
 
     private void testGetUser() throws Exception {
         try {
+            EchoService echoService = (EchoService)userProvider;
+            Object status = echoService.$echo("OK");
+            System.out.println("echo: "+status);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        try {
+            EchoService echoService = (EchoService)userProvider;
+            Object status = echoService.$echo("OK");
+            System.out.println("echo: "+status);
             User user1 = userProvider.GetUser("A003");
             System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
                     " UserInfo, Id:" + user1.getId() + ", name:" + user1.getName() + ", sex:" + user1.getSex().toString()
diff --git a/examples/jsonrpc/java-server/src/main/resources/META-INF/spring/dubbo.provider.xml b/examples/jsonrpc/java-server/src/main/resources/META-INF/spring/dubbo.provider.xml
index bdbd84417..b3a1b19d6 100644
--- a/examples/jsonrpc/java-server/src/main/resources/META-INF/spring/dubbo.provider.xml
+++ b/examples/jsonrpc/java-server/src/main/resources/META-INF/spring/dubbo.provider.xml
@@ -24,12 +24,13 @@
 	<dubbo:application name="user-info-server"/>
 	<!-- 杩炴帴鍒板摢涓湰鍦版敞鍐屼腑蹇� -->
 	<dubbo:registry id="ikurento"  address="zookeeper://127.0.0.1:2181" />
+	<dubbo:registry id="ikurento2"  address="zookeeper://127.0.0.1:2182" />
 	<!-- 鐢╠ubbo鍗忚鍦�20880绔彛鏆撮湶鏈嶅姟 -->
     <!-- dubbo:protocol host="127.0.0.1" / -->
 	<dubbo:protocol id="dubbo" name="dubbo" host="127.0.0.1" port="20010" />
 	<dubbo:protocol id="jsonrpc" name="jsonrpc" host="127.0.0.1" port="10010" />
 	<!-- 澹版槑闇€瑕佹毚闇茬殑鏈嶅姟鎺ュ彛 -->
-	<dubbo:service registry="ikurento" timeout="3000" interface="com.ikurento.user.UserProvider" ref="demoService"/>
+	<dubbo:service registry="ikurento,ikurento2" timeout="3000" interface="com.ikurento.user.UserProvider" ref="demoService"/>
 	<dubbo:service registry="ikurento" timeout="3000" interface="com.ikurento.user.UserProvider" ref="otherService" version="2.0"/>
 	<dubbo:service registry="ikurento" timeout="3000" interface="com.ikurento.user.UserProvider" ref="otherService" group="as" version="2.0"/>
 
-- 
GitLab