From 5b5dc5fba3e570e12de1b6a878cda4e3c2ad2e46 Mon Sep 17 00:00:00 2001 From: devfeel Date: Wed, 22 Nov 2017 22:13:44 +0800 Subject: [PATCH 1/5] Update README.md 1.add performance data 2.remove session introduce --- README.md | 50 ++++++++++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 8441bc7..b3792ea 100644 --- a/README.md +++ b/README.md @@ -55,8 +55,30 @@ func StartServer() error { #### Config Example * [dotweb.conf](https://github.com/devfeel/dotweb/blob/master/example/config/dotweb.conf) * [dotweb.json](https://github.com/devfeel/dotweb/blob/master/example/config/dotweb.json.conf) - -## 4. Router +  +## 4. Performance + +DotWeb | 1.9.2 | 16core16G |   |   |   |   |   |   |   |   |   |   |   +-- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- +cpu | 内存 | Samples | Average | Median | 90%Line | 95%Line | 99%Line | Min | Max | Error% | Throughput | Received KB/Sec | Send KB/Sec +40% | 39M | 15228356 | 19 | 4 | 43 | 72 | 204 | 0 | 2070 | 0.00% | 48703.47 | 7514.79 | 8656.28 +40% | 42M | 15485189 | 18 | 4 | 41 | 63 | 230 | 0 | 3250 | 0.00% | 49512.99 | 7639.7 | 8800.16 +40% | 44M | 15700385 | 18 | 3 | 41 | 64 | 233 | 0 | 2083 | 0.00% | 50203.32 | 7746.22 | 8922.86 +  |   |   |   |   |   |   |   |   |   |   |   |   |   +ECHO | 1.9.2 | 16core16G |   |   |   |   |   |   |   |   |   |   |   +cpu | 内存 | Samples | Average | Median | 90%Line | 95%Line | 99%Line | Min | Max | Error% | Throughput | Received KB/Sec | Send KB/Sec +38% | 35M | 15307586 | 19 | 4 | 44 | 76 | 181 | 0 | 1808 | 0.00% | 48951.22 | 6166.71 | 9034.94 +36% | 35M | 15239058 | 19 | 4 | 45 | 76 | 178 | 0 | 2003 | 0.00% | 48734.26 | 6139.37 | 8994.9 +37% | 37M | 15800585 | 18 | 3 | 41 | 66 | 229 | 0 | 2355 | 0.00% | 50356.09 | 6343.68 | 9294.24 +  |   |   |   |   |   |   |   |   |   |   |   |   |   +Gin  |  1.9.2 |  16core16G  |   |   |   |   |   |   |   |   |   |   |   +cpu | 内存 | Samples | Average | Median | 90%Line | 95%Line | 99%Line | Min | Max | Error% | Throughput | Received KB/Sec | Send KB/Sec +36% | 36M | 15109143 | 19 | 6 | 44 | 71 | 175 | 0 | 3250 | 0.00% | 48151.87 | 5877.91 | 8746.33 +36% | 40M | 15255749 | 19 | 5 | 43 | 70 | 189 | 0 | 3079 | 0.00% | 48762.53 | 5952.45 | 8857.25 +36% | 40M | 15385401 | 18 | 4 | 42 | 66 | 227 | 0 | 2312 | 0.00% | 49181.03 | 6003.54 | 8933.27 + + +## 5. Router #### 1) 常规路由 * 支持GET\POST\HEAD\OPTIONS\PUT\PATCH\DELETE 这几类请求方法 * 支持HiJack\WebSocket\ServerFile三类特殊应用 @@ -138,7 +160,7 @@ test:
curl http://127.0.0.1/user/profile -## 5. Binder +## 6. Binder * HttpContext.Bind(interface{}) * Support data from json、xml、Form ```go @@ -158,7 +180,7 @@ func(ctx *dotweb.HttpContext) TestBind{ ``` -## 6. Middleware +## 7. Middleware #### Middleware * 支持粒度:App、Group、RouterNode * DotWeb.Use(m ...Middleware) @@ -204,7 +226,7 @@ func NewAccessFmtLog(index string) *AccessFmtLog { } ``` -## 7. Server Config +## 8. Server Config #### HttpServer: * HttpServer.EnabledSession @@ -235,7 +257,7 @@ func NewAccessFmtLog(index string) *AccessFmtLog { * 未来会拓展更多运行模式的配置 -## 8. Exception +## 9. Exception #### 500 error * Default: 当发生未处理异常时,会根据RunMode向页面输出默认错误信息或者具体异常信息,并返回 500 错误头 * User-defined: 通过DotServer.SetExceptionHandle(handler *ExceptionHandle)实现自定义异常处理逻辑 @@ -249,22 +271,6 @@ type ExceptionHandle func(Context, error) type NotFoundHandle func(http.ResponseWriter, *http.Request) ``` -## 9. Session -#### Support store in runtime、redis -* default is disabled, you must use app.HttpServer.SetEnabledSession(true) to enabled it -* runtime:store in runtime memory -* redis:store in redis,redis-key named with dotweb:session:xxxxxxxxxxxx -```go -//enabled session -dotapp.HttpServer.SetEnabledSession(true) -//use runtime mode -dotapp.HttpServer.SetSessionConfig(session.NewDefaultRuntimeConfig()) -//use redis mode -dotapp.HttpServer.SetSessionConfig(session.NewDefaultRedisConfig("127.0.0.1:6379")) -//use session with DotWeb.Context -ctx.Session().Set(key, value) -``` - ## Dependency websocket - golang.org/x/net/websocket
From d3ea57687f2301ced514bcf1b65fd2c9332b6665 Mon Sep 17 00:00:00 2001 From: chacha923 Date: Thu, 23 Nov 2017 11:04:18 +0800 Subject: [PATCH 2/5] add package etcdutil MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增etcd工具包 --- framework/etcd/etcdutil.go | 29 +++++++++++++++++++++++++++++ framework/etcd/etcdutil_test.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 framework/etcd/etcdutil.go create mode 100644 framework/etcd/etcdutil_test.go diff --git a/framework/etcd/etcdutil.go b/framework/etcd/etcdutil.go new file mode 100644 index 0000000..6872aa9 --- /dev/null +++ b/framework/etcd/etcdutil.go @@ -0,0 +1,29 @@ +package etcdutil + +import ( + "github.com/coreos/etcd/clientv3" + "time" + "github.com/gpmgo/gopm/modules/cli" +) + +func NewEtcdClientV3(endPoints []string, dialTimeout time.Duration) (*clientv3.Client, error){ + if endPoints == nil { + endPoints = make([]string,0) + endPoints = append(endPoints, "127.0.0.1:2379") + } + + cli, err := clientv3.New(clientv3.Config{ + Endpoints: endPoints, + DialTimeout: dialTimeout, + }) + if err != nil { + return nil, err + } + + return cli, nil +} + +func BasicEtcdOperate(){ + cli, _ := NewEtcdClientV3(nil, 10) + +} diff --git a/framework/etcd/etcdutil_test.go b/framework/etcd/etcdutil_test.go new file mode 100644 index 0000000..9362547 --- /dev/null +++ b/framework/etcd/etcdutil_test.go @@ -0,0 +1,32 @@ +package etcdutil + +import ( + "github.com/coreos/etcd/clientv3" + "fmt" + "testing" + "context" + "time" +) + +var cli *clientv3.Client +var err error + +func init() { + cli, err = NewEtcdClientV3(nil, 10) + if err != nil { + fmt.Println(err.Error()) + } +} + +func TestBasicEtcdOperate(t *testing.T) { + resp, _:= cli.Grant(context.TODO(), 10) + ctx, _:= context.WithTimeout(context.Background(), 5*time.Second) + rsp, err:=cli.Put(ctx,"root/game/node-2",`{"addr":"192.168.1.1:9999"}`,clientv3.WithLease(resp.ID)) + + if err != nil { + fmt.Println(err.Error()) + return + } + + fmt.Println(rsp.OpResponse().Put().Header.String()) +} \ No newline at end of file From addfd5e6b51ce13b476de99797c8325e44aeb038 Mon Sep 17 00:00:00 2001 From: chacha923 Date: Thu, 23 Nov 2017 11:43:11 +0800 Subject: [PATCH 3/5] =?UTF-8?q?etcdutil=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit etcdutil修复 --- framework/etcd/etcdutil.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/framework/etcd/etcdutil.go b/framework/etcd/etcdutil.go index 6872aa9..5610ca7 100644 --- a/framework/etcd/etcdutil.go +++ b/framework/etcd/etcdutil.go @@ -3,7 +3,6 @@ package etcdutil import ( "github.com/coreos/etcd/clientv3" "time" - "github.com/gpmgo/gopm/modules/cli" ) func NewEtcdClientV3(endPoints []string, dialTimeout time.Duration) (*clientv3.Client, error){ @@ -24,6 +23,5 @@ func NewEtcdClientV3(endPoints []string, dialTimeout time.Duration) (*clientv3.C } func BasicEtcdOperate(){ - cli, _ := NewEtcdClientV3(nil, 10) - + } From b241c190e951c906021619de7857d2acd55fd414 Mon Sep 17 00:00:00 2001 From: chacha923 Date: Tue, 5 Dec 2017 09:58:29 +0800 Subject: [PATCH 4/5] Change etcd client depend on etcd offical client v3, implement simple put, get, delete and watcher for key or prefix of key --- framework/etcd/etcdutil.go | 50 +++++++++++++++++++++++++++++---- framework/etcd/etcdutil_test.go | 32 ++++++++++++--------- 2 files changed, 63 insertions(+), 19 deletions(-) diff --git a/framework/etcd/etcdutil.go b/framework/etcd/etcdutil.go index 5610ca7..70c9957 100644 --- a/framework/etcd/etcdutil.go +++ b/framework/etcd/etcdutil.go @@ -3,11 +3,18 @@ package etcdutil import ( "github.com/coreos/etcd/clientv3" "time" + "context" ) -func NewEtcdClientV3(endPoints []string, dialTimeout time.Duration) (*clientv3.Client, error){ +type EtcdClient struct { + client *clientv3.Client +} + +func NewEtcdClient(dialTimeout time.Duration, endPoints ...string) (*EtcdClient, error) { + etcdClient := new(EtcdClient) + if endPoints == nil { - endPoints = make([]string,0) + endPoints = make([]string, 0) endPoints = append(endPoints, "127.0.0.1:2379") } @@ -15,13 +22,46 @@ func NewEtcdClientV3(endPoints []string, dialTimeout time.Duration) (*clientv3.C Endpoints: endPoints, DialTimeout: dialTimeout, }) + if err != nil { return nil, err } + etcdClient.client = cli + return etcdClient, nil +} + +func (e *EtcdClient) SimpleGet(key string) (string, error) { + getResp, err := e.client.Get(context.TODO(), key) + if err != nil { + return "", err + } + return string(getResp.Kvs[0].Value), nil +} - return cli, nil +func (e *EtcdClient) SimplePut(key, value string) error { + _, err := e.client.Put(context.TODO(), key, value) + return err } -func BasicEtcdOperate(){ - +func (e *EtcdClient) SimpleDelete(key string) (int64, error) { + delResp, err := e.client.Delete(context.TODO(), key) + return delResp.Deleted, err +} + +func (e *EtcdClient) SimpleWatch(key string) clientv3.WatchChan { + return e.client.Watch(context.Background(), key) +} + +// etcd v3 not has directory construct, +// by watch a prefix of key to implement watch a directorys in v2 +func (e *EtcdClient) PrefixWatch(prefix string) clientv3.WatchChan { + return e.client.Watch(context.Background(), prefix) +} + +func (e *EtcdClient) Close() error { + err := e.client.Close() + if err != nil { + return err + } + return nil } diff --git a/framework/etcd/etcdutil_test.go b/framework/etcd/etcdutil_test.go index 9362547..07aa827 100644 --- a/framework/etcd/etcdutil_test.go +++ b/framework/etcd/etcdutil_test.go @@ -1,32 +1,36 @@ package etcdutil import ( - "github.com/coreos/etcd/clientv3" - "fmt" "testing" + "fmt" "context" - "time" ) -var cli *clientv3.Client +var cli *EtcdClient + var err error func init() { - cli, err = NewEtcdClientV3(nil, 10) + cli, err = NewEtcdClient(0) if err != nil { fmt.Println(err.Error()) } } -func TestBasicEtcdOperate(t *testing.T) { - resp, _:= cli.Grant(context.TODO(), 10) - ctx, _:= context.WithTimeout(context.Background(), 5*time.Second) - rsp, err:=cli.Put(ctx,"root/game/node-2",`{"addr":"192.168.1.1:9999"}`,clientv3.WithLease(resp.ID)) - - if err != nil { - fmt.Println(err.Error()) +func TestEtcdPut(t *testing.T) { + defer cli.Close() + putErr := cli.SimplePut("foo", "bar") + if putErr != nil { + fmt.Println(putErr) return } + fmt.Println("success") +} - fmt.Println(rsp.OpResponse().Put().Header.String()) -} \ No newline at end of file +func TestEtcdGet(t *testing.T) { + val, getErr := cli.SimpleGet("foo") + if getErr != nil { + fmt.Println(getErr) + } + fmt.Println(val) +} From 9338e263a253d0c01e045066e41a974a533bf99d Mon Sep 17 00:00:00 2001 From: chacha923 Date: Wed, 6 Dec 2017 10:43:53 +0800 Subject: [PATCH 5/5] modified etcdutil_test.go, etcdutil only support go1.9+ --- framework/etcd/etcdutil.go | 2 +- framework/etcd/etcdutil_test.go | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/framework/etcd/etcdutil.go b/framework/etcd/etcdutil.go index 70c9957..e2e07b5 100644 --- a/framework/etcd/etcdutil.go +++ b/framework/etcd/etcdutil.go @@ -5,7 +5,7 @@ import ( "time" "context" ) - +//etcd util only support go1.9+ !!! type EtcdClient struct { client *clientv3.Client } diff --git a/framework/etcd/etcdutil_test.go b/framework/etcd/etcdutil_test.go index 07aa827..1cdac7e 100644 --- a/framework/etcd/etcdutil_test.go +++ b/framework/etcd/etcdutil_test.go @@ -3,7 +3,8 @@ package etcdutil import ( "testing" "fmt" - "context" + "os" + "time" ) var cli *EtcdClient @@ -11,9 +12,10 @@ var cli *EtcdClient var err error func init() { - cli, err = NewEtcdClient(0) + cli, err = NewEtcdClient(10*time.Second) if err != nil { fmt.Println(err.Error()) + os.Exit(2) } }