From ccb2d3025bb671b6fee9184a2aef9d65f43618fd Mon Sep 17 00:00:00 2001
From: AlexStocks <alexstocks@foxmail.com>
Date: Sun, 10 Mar 2019 00:58:02 +0800
Subject: [PATCH] Imp: Add environment/host/default.timeout for go server
 schema; Fix: change go server schema timeout/time unit from second to
 millisecond; Fix: add http protocol 1.1

---
 examples/go-server/app/config.go              | 20 +++-------
 examples/go-server/app/server.go              | 15 ++-----
 examples/go-server/app/user.go                | 40 +++++++------------
 examples/go-server/app/version.go             | 12 +-----
 examples/go-server/profiles/dev/server.yml    |  1 +
 .../go-server/profiles/release/server.yml     |  1 +
 examples/go-server/profiles/test/server.yml   |  1 +
 .../main/java/com/ikurento/user/Consumer.java | 11 ++---
 .../META-INF/spring/dubbo.consumer.xml        |  6 +--
 .../com/ikurento/user/UserProviderImpl.java   |  8 ++--
 jsonrpc/http.go                               |  2 +-
 jsonrpc/map.go                                |  4 +-
 registry/provider.go                          | 13 +++---
 registry/registry.go                          | 11 ++---
 14 files changed, 58 insertions(+), 87 deletions(-)

diff --git a/examples/go-server/app/config.go b/examples/go-server/app/config.go
index 11b0f0d62..bdf30391a 100644
--- a/examples/go-server/app/config.go
+++ b/examples/go-server/app/config.go
@@ -1,13 +1,3 @@
-/******************************************************
-# DESC    : env var & configure
-# AUTHOR  : Alex Stocks
-# VERSION : 1.0
-# LICENCE : Apache License 2.0
-# EMAIL   : alexstocks@foxmail.com
-# MOD     : 2016-07-21 16:41
-# FILE    : config.go
-******************************************************/
-
 package main
 
 import (
@@ -16,14 +6,13 @@ import (
 	"os"
 	"path"
 	"time"
+)
 
+import (
 	"github.com/AlexStocks/goext/log"
-
 	log "github.com/AlexStocks/log4go"
-
-	jerrors "github.com/juju/errors"
-
 	"github.com/dubbo/dubbo-go/registry"
+	jerrors "github.com/juju/errors"
 	yaml "gopkg.in/yaml.v2"
 )
 
@@ -87,7 +76,8 @@ func initServerConf() *ServerConfig {
 		return nil
 	}
 	if conf.Registry_Config.Timeout, err = time.ParseDuration(conf.Registry_Config.TimeoutStr); err != nil {
-		panic(fmt.Sprintf("time.ParseDuration(Registry_Config.Timeout:%#v) = error:%s", conf.Registry_Config.TimeoutStr, err))
+		panic(fmt.Sprintf("time.ParseDuration(Registry_Config.Timeout:%#v) = error:%s",
+			conf.Registry_Config.TimeoutStr, err))
 		return nil
 	}
 
diff --git a/examples/go-server/app/server.go b/examples/go-server/app/server.go
index cc788cef1..8cb3f03f7 100644
--- a/examples/go-server/app/server.go
+++ b/examples/go-server/app/server.go
@@ -1,13 +1,3 @@
-/******************************************************
-# DESC    : provider example
-# AUTHOR  : Alex Stocks
-# VERSION : 1.0
-# LICENCE : Apache License 2.0
-# EMAIL   : alexstocks@foxmail.com
-# MOD     : 2016-07-21 16:41
-# FILE    : server.go
-******************************************************/
-
 package main
 
 import (
@@ -18,9 +8,10 @@ import (
 	"os/signal"
 	"strconv"
 	"syscall"
+)
 
+import (
 	// "github.com/AlexStocks/gocolor"
-
 	"github.com/AlexStocks/goext/net"
 	"github.com/AlexStocks/goext/time"
 	log "github.com/AlexStocks/log4go"
@@ -30,7 +21,7 @@ import (
 )
 
 var (
-	survivalTimeout int = 3e9
+	survivalTimeout = int(3e9)
 	servo           *jsonrpc.Server
 )
 
diff --git a/examples/go-server/app/user.go b/examples/go-server/app/user.go
index 65aa04917..d8f307549 100644
--- a/examples/go-server/app/user.go
+++ b/examples/go-server/app/user.go
@@ -1,13 +1,3 @@
-/*****************************************************
-# DESC    : UserProvider Service
-# AUTHOR  : Alex Stocks
-# VERSION : 1.0
-# LICENCE : Apache License 2.0
-# EMAIL   : alexstocks@foxmail.com
-# MOD     : 2016-07-21 19:22
-# FILE    : user.go
-******************************************************/
-
 package main
 
 import (
@@ -83,16 +73,16 @@ func init() {
 
 /*
 // you can define your json unmarshal function here
-func (this *UserId) UnmarshalJSON(value []byte) error {
-	this.Id = string(value)
-	this.Id = strings.TrimPrefix(this.Id, "\"")
-	this.Id = strings.TrimSuffix(this.Id, `"`)
+func (u *UserId) UnmarshalJSON(value []byte) error {
+	u.Id = string(value)
+	u.Id = strings.TrimPrefix(u.Id, "\"")
+	u.Id = strings.TrimSuffix(u.Id, `"`)
 
 	return nil
 }
 */
 
-func (this *UserProvider) getUser(userId string) (*User, error) {
+func (u *UserProvider) getUser(userId string) (*User, error) {
 	if user, ok := userMap.user[userId]; ok {
 		return &user, nil
 	}
@@ -102,12 +92,12 @@ func (this *UserProvider) getUser(userId string) (*User, error) {
 
 /*
 // can not work
-func (this *UserProvider) GetUser(ctx context.Context, req *UserId, rsp *User) error {
+func (u *UserProvider) GetUser(ctx context.Context, req *UserId, rsp *User) error {
 	var (
 		err  error
 		user *User
 	)
-	user, err = this.getUser(req.Id)
+	user, err = u.getUser(req.Id)
 	if err == nil {
 		*rsp = *user
 		gxlog.CInfo("rsp:%#v", rsp)
@@ -123,14 +113,14 @@ func (this *UserProvider) GetUser(ctx context.Context, req *UserId, rsp *User) e
 
 /*
 // work
-func (this *UserProvider) GetUser(ctx context.Context, req *string, rsp *User) error {
+func (u *UserProvider) GetUser(ctx context.Context, req *string, rsp *User) error {
 	var (
 		err  error
 		user *User
 	)
 
 	gxlog.CInfo("req:%#v", *req)
-	user, err = this.getUser(*req)
+	user, err = u.getUser(*req)
 	if err == nil {
 		*rsp = *user
 		gxlog.CInfo("rsp:%#v", rsp)
@@ -144,30 +134,30 @@ func (this *UserProvider) GetUser(ctx context.Context, req *string, rsp *User) e
 }
 */
 
-func (this *UserProvider) GetUser(ctx context.Context, req []string, rsp *User) error {
+func (u *UserProvider) GetUser(ctx context.Context, req []string, rsp *User) error {
 	var (
 		err  error
 		user *User
 	)
 
 	gxlog.CInfo("req:%#v", req)
-	user, err = this.getUser(req[0])
+	user, err = u.getUser(req[0])
 	if err == nil {
 		*rsp = *user
 		gxlog.CInfo("rsp:%#v", rsp)
 		// s, _ := json.Marshal(rsp)
-		// fmt.Println(string(s))
+		// fmt.Println("hello0:", string(s))
 
 		// s, _ = json.Marshal(*rsp)
-		// fmt.Println(string(s))
+		// fmt.Println("hello1:", string(s))
 	}
 	return err
 }
 
-func (this *UserProvider) Service() string {
+func (u *UserProvider) Service() string {
 	return "com.ikurento.user.UserProvider"
 }
 
-func (this *UserProvider) Version() string {
+func (u *UserProvider) Version() string {
 	return ""
 }
diff --git a/examples/go-server/app/version.go b/examples/go-server/app/version.go
index 520c7dc6b..c7552b26e 100644
--- a/examples/go-server/app/version.go
+++ b/examples/go-server/app/version.go
@@ -1,15 +1,5 @@
-/******************************************************
-# DESC    : client version
-# AUTHOR  : Alex Stocks
-# VERSION : 1.0
-# LICENCE : Apache License 2.0
-# EMAIL   : alexstocks@foxmail.com
-# MOD     : 2016-07-21 16:41
-# FILE    : version.go
-******************************************************/
-
 package main
 
 var (
-	Version string = "0.2.0"
+	Version string = "0.3.1"
 )
diff --git a/examples/go-server/profiles/dev/server.yml b/examples/go-server/profiles/dev/server.yml
index 7b202f931..99a7d849f 100644
--- a/examples/go-server/profiles/dev/server.yml
+++ b/examples/go-server/profiles/dev/server.yml
@@ -15,6 +15,7 @@ application_config:
     module : "dubbogo user-info server"
     version : "0.0.1"
     owner : "ZX"
+    environment: "dev"
 
 registry_config:
     timeout	: "3s"
diff --git a/examples/go-server/profiles/release/server.yml b/examples/go-server/profiles/release/server.yml
index 7b202f931..d41930a80 100644
--- a/examples/go-server/profiles/release/server.yml
+++ b/examples/go-server/profiles/release/server.yml
@@ -15,6 +15,7 @@ application_config:
     module : "dubbogo user-info server"
     version : "0.0.1"
     owner : "ZX"
+    environment: "product"
 
 registry_config:
     timeout	: "3s"
diff --git a/examples/go-server/profiles/test/server.yml b/examples/go-server/profiles/test/server.yml
index 7b202f931..8fb8b5343 100644
--- a/examples/go-server/profiles/test/server.yml
+++ b/examples/go-server/profiles/test/server.yml
@@ -15,6 +15,7 @@ application_config:
     module : "dubbogo user-info server"
     version : "0.0.1"
     owner : "ZX"
+    environment: "test"
 
 registry_config:
     timeout	: "3s"
diff --git a/examples/java-client/src/main/java/com/ikurento/user/Consumer.java b/examples/java-client/src/main/java/com/ikurento/user/Consumer.java
index 8156c7370..5830ac716 100755
--- a/examples/java-client/src/main/java/com/ikurento/user/Consumer.java
+++ b/examples/java-client/src/main/java/com/ikurento/user/Consumer.java
@@ -39,7 +39,7 @@ public class Consumer {
 
     private void testGetUser() throws Exception {
         try {
-            User user1 = userProvider.GetUser("003");
+            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()
                     + ", age:" + user1.getAge() + ", time:" + user1.getTime().toString());
@@ -51,9 +51,9 @@ public class Consumer {
     private void testGetUsers() throws Exception {
         try {
             List<String> userIDList = new ArrayList<String>();
-            userIDList.add("001");
-            userIDList.add("002");
-            userIDList.add("003");
+            userIDList.add("A001");
+            userIDList.add("A002");
+            userIDList.add("A003");
 
             List<User> userList = userProvider.GetUsers(userIDList);
 
@@ -72,6 +72,7 @@ public class Consumer {
     public void start() throws Exception {
         testGetUser();
         // testGetUsers();
-        Thread.sleep(120000);
+//        Thread.sleep(120000);
+Thread.sleep(2000);
     }
 }
diff --git a/examples/java-client/src/main/resources/META-INF/spring/dubbo.consumer.xml b/examples/java-client/src/main/resources/META-INF/spring/dubbo.consumer.xml
index 82dd79656..c01f4ab06 100644
--- a/examples/java-client/src/main/resources/META-INF/spring/dubbo.consumer.xml
+++ b/examples/java-client/src/main/resources/META-INF/spring/dubbo.consumer.xml
@@ -33,9 +33,9 @@
 	<dubbo:protocol id="jsonrpc" name="jsonrpc" />
 
 	<!-- 声明需要使用的服务接口 -->
-	<!-- dubbo:reference id="userProvider" protocol="jsonrpc" interface="com.ikurento.user.UserProvider" / -->
-	<dubbo:reference id="userProvider" protocol="dubbo" interface="com.ikurento.user.UserProvider">
-            <dubbo:parameter key="heartbeat" value="10000"/>
+	<dubbo:reference id="userProvider" protocol="jsonrpc" interface="com.ikurento.user.UserProvider">
+	<!-- dubbo:reference id="userProvider" protocol="dubbo" interface="com.ikurento.user.UserProvider">
+            <dubbo:parameter key="heartbeat" value="10000"/ -->
     </dubbo:reference>
 
 </beans>
diff --git a/examples/java-server/src/main/java/com/ikurento/user/UserProviderImpl.java b/examples/java-server/src/main/java/com/ikurento/user/UserProviderImpl.java
index bbb1ef8d6..2464ca1c2 100755
--- a/examples/java-server/src/main/java/com/ikurento/user/UserProviderImpl.java
+++ b/examples/java-server/src/main/java/com/ikurento/user/UserProviderImpl.java
@@ -19,10 +19,10 @@ public class UserProviderImpl implements UserProvider {
     Map<String, User> userMap = new HashMap<String, User>();
 
     public UserProviderImpl() {
-        userMap.put("001", new User("001", "demo-zhangsan", 18));
-        userMap.put("002", new User("002", "demo-lisi", 20));
-        userMap.put("003", new User("003", "demo-lily", 23));
-        userMap.put("004", new User("004", "demo-lisa", 32));
+        userMap.put("A001", new User("A001", "demo-zhangsan", 18));
+        userMap.put("A002", new User("A002", "demo-lisi", 20));
+        userMap.put("A003", new User("A003", "demo-lily", 23));
+        userMap.put("A004", new User("A004", "demo-lisa", 32));
     }
 
     public boolean isLimit(Gender gender, String name) {
diff --git a/jsonrpc/http.go b/jsonrpc/http.go
index 3ba0d25ed..aa249e7a3 100644
--- a/jsonrpc/http.go
+++ b/jsonrpc/http.go
@@ -106,7 +106,7 @@ func (c *HTTPClient) Call(ctx context.Context, service registry.ServiceURL, req
 	reqTimeout := c.options.HTTPTimeout
 	if len(service.Query.Get("timeout")) != 0 {
 
-		if timeout, err := time.ParseDuration(service.Query.Get("timeout")+"s"); err == nil {
+		if timeout, err := time.ParseDuration(service.Query.Get("timeout") + "s"); err == nil {
 			if timeout < reqTimeout {
 				reqTimeout = timeout
 			}
diff --git a/jsonrpc/map.go b/jsonrpc/map.go
index d56aa75a4..e42393391 100644
--- a/jsonrpc/map.go
+++ b/jsonrpc/map.go
@@ -258,8 +258,10 @@ func (server *serviceMap) serveRequest(ctx context.Context,
 		return jerrors.Trace(err)
 	}
 	rsp := &http.Response{
-		Header:        make(http.Header),
 		StatusCode:    code,
+		ProtoMajor:    1,
+		ProtoMinor:    1,
+		Header:        make(http.Header),
 		ContentLength: int64(len(rspStream)),
 		Body:          ioutil.NopCloser(bytes.NewReader(rspStream)),
 	}
diff --git a/registry/provider.go b/registry/provider.go
index e80cdfd98..bf6ed222e 100644
--- a/registry/provider.go
+++ b/registry/provider.go
@@ -22,6 +22,7 @@ import (
 //////////////////////////////////////////////
 
 const (
+	defaultTimeout           = int64(10e9)
 	ProviderRegistryZkClient = "provider zk registry"
 )
 
@@ -84,7 +85,7 @@ type ZkProviderRegistry struct {
 
 func NewZkProviderRegistry(opts ...Option) (*ZkProviderRegistry, error) {
 	r := &ZkProviderRegistry{
-		birth:    time.Now().Unix(),
+		birth:    time.Now().UnixNano(),
 		done:     make(chan struct{}),
 		services: make(map[string]ServiceConfigIf),
 		zkPath:   make(map[string]int),
@@ -220,8 +221,11 @@ func (r *ZkProviderRegistry) register(conf *ProviderServiceConfig) error {
 	}
 
 	params = url.Values{}
-	params.Add("interface", conf.ServiceConfig.Service)
+	params.Add("anyhost", "true")
 	params.Add("application", r.ApplicationConfig.Name)
+	params.Add("default.timeout", fmt.Sprintf("%d", defaultTimeout/1e6))
+	params.Add("environment", r.ApplicationConfig.Environment)
+	params.Add("interface", conf.ServiceConfig.Service)
 	revision = r.ApplicationConfig.Version
 	if revision == "" {
 		revision = "0.1.0"
@@ -241,9 +245,8 @@ func (r *ZkProviderRegistry) register(conf *ProviderServiceConfig) error {
 	params.Add("side", (DubboType(PROVIDER)).Role())
 	params.Add("pid", processID)
 	params.Add("ip", localIP)
-	params.Add("timeout", fmt.Sprintf("%v", r.Timeout.Seconds()))
-	// params.Add("timestamp", time.Now().Format("20060102150405"))
-	params.Add("timestamp", fmt.Sprintf("%d", r.birth))
+	params.Add("timeout", fmt.Sprintf("%d", int64(r.Timeout)/1e6))
+	params.Add("timestamp", fmt.Sprintf("%d", r.birth/1e6))
 	if conf.ServiceConfig.Version != "" {
 		params.Add("version", conf.ServiceConfig.Version)
 	}
diff --git a/registry/registry.go b/registry/registry.go
index 7172425af..437756b1d 100644
--- a/registry/registry.go
+++ b/registry/registry.go
@@ -29,6 +29,7 @@ type ApplicationConfig struct {
 	Module       string `yaml:"module" json:"module,omitempty"`
 	Version      string `yaml:"version" json:"version,omitempty"`
 	Owner        string `yaml:"owner" json:"owner,omitempty"`
+	Environment  string `yaml:"environment" json:"environment,omitempty"`
 }
 
 func (c *ApplicationConfig) ToString() string {
@@ -37,11 +38,11 @@ func (c *ApplicationConfig) ToString() string {
 }
 
 type RegistryConfig struct {
-	Address  []string `required:"true" yaml:"address"  json:"address,omitempty"`
-	UserName string   `yaml:"user_name" json:"user_name,omitempty"`
-	Password string   `yaml:"password" json:"password,omitempty"`
-	TimeoutStr  string      `yaml:"timeout" default:"5s" json:"timeout,omitempty"` // unit: second
-	Timeout  time.Duration  `yaml:"-"  json:"-"`
+	Address    []string      `required:"true" yaml:"address"  json:"address,omitempty"`
+	UserName   string        `yaml:"user_name" json:"user_name,omitempty"`
+	Password   string        `yaml:"password" json:"password,omitempty"`
+	TimeoutStr string        `yaml:"timeout" default:"5s" json:"timeout,omitempty"` // unit: second
+	Timeout    time.Duration `yaml:"-"  json:"-"`
 }
 
 //////////////////////////////////////////////
-- 
GitLab