diff --git a/go.mod b/go.mod
index 4d65602d9dc40fc200e140fd4a376534a8ea6a73..80987daecfd5d56796607b1eb1f67d0bd3cecdec 100644
--- a/go.mod
+++ b/go.mod
@@ -15,6 +15,7 @@ require (
github.com/dubbogo/getty v1.3.1
github.com/dubbogo/gost v1.5.1
github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 // indirect
+ github.com/gin-gonic/gin v1.5.0
github.com/go-errors/errors v1.0.1 // indirect
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6 // indirect
github.com/golang/mock v1.3.1
diff --git a/go.sum b/go.sum
index 90f64a1f71feb5f4b22be52df90fc4321db41b4a..6ff826ba5616349f803df20afc3d3488a8115fbe 100644
--- a/go.sum
+++ b/go.sum
@@ -124,6 +124,10 @@ github.com/fatih/structs v0.0.0-20180123065059-ebf56d35bba7/go.mod h1:9NiDSp5zOc
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
+github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
+github.com/gin-gonic/gin v1.5.0 h1:fi+bqFAx/oLK54somfCtEZs9HeH1LHVoEPUgARpTqyc=
+github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do=
github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w=
github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q=
github.com/go-ini/ini v1.25.4 h1:Mujh4R/dH6YL8bxuISne3xX2+qcQ9p0IxKAP6ExWoUo=
@@ -135,6 +139,10 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-ole/go-ole v1.2.1 h1:2lOsA72HgjxAuMlKpFiCbHTvu44PIVkZ5hqm3RSdI/E=
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
+github.com/go-playground/locales v0.12.1 h1:2FITxuFt/xuCNP1Acdhv62OzaCiviiE4kotfhkmOqEc=
+github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM=
+github.com/go-playground/universal-translator v0.16.0 h1:X++omBR/4cE2MNg91AoC3rmGrCjJ8eAeUP/K/EKx4DM=
+github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY=
github.com/go-sql-driver/mysql v0.0.0-20180618115901-749ddf1598b4 h1:1LlmVz15APoKz9dnm5j2ePptburJlwEH+/v/pUuoxck=
github.com/go-sql-driver/mysql v0.0.0-20180618115901-749ddf1598b4/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
@@ -310,6 +318,8 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/leodido/go-urn v1.1.0 h1:Sm1gr51B1kKyfD2BlRcLSiEkffoG96g6TPv6eRoEiB8=
+github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw=
github.com/lestrrat/go-envload v0.0.0-20180220120943-6ed08b54a570 h1:0iQektZGS248WXmGIYOwRXSQhD4qn3icjMpuxwO7qlo=
github.com/lestrrat/go-envload v0.0.0-20180220120943-6ed08b54a570/go.mod h1:BLt8L9ld7wVsvEWQbuLrUZnCMnUmLZ+CGDzKtclrTlE=
github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f h1:sgUSP4zdTUZYZgAGGtN5Lxk92rK+JUFOwf+FT99EEI4=
@@ -324,6 +334,8 @@ github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRU
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-isatty v0.0.3 h1:ns/ykhmWi7G9O+8a448SecJU3nSMBXJfqQkl0upE1jI=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-isatty v0.0.9 h1:d5US/mDsogSGW37IV293h//ZFaeajb69h+EHFsv2xGg=
+github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ=
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/miekg/dns v1.0.14 h1:9jZdLNd/P4+SfEJ0TNyxYpsK8N4GtfylBLqtbYN1sbA=
@@ -456,6 +468,10 @@ github.com/toolkits/concurrent v0.0.0-20150624120057-a4371d70e3e3 h1:kF/7m/ZU+0D
github.com/toolkits/concurrent v0.0.0-20150624120057-a4371d70e3e3/go.mod h1:QDlpd3qS71vYtakd2hmdpqhJ9nwv6mD6A30bQ1BPBFE=
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 h1:G3dpKMzFDjgEh2q1Z7zUUtKa8ViPtH+ocF0bE0g00O8=
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
+github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo=
+github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
+github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs=
+github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
github.com/vmware/govmomi v0.18.0 h1:f7QxSmP7meCtoAmiKZogvVbLInT+CZx6Px6K5rYsJZo=
github.com/vmware/govmomi v0.18.0/go.mod h1:URlwyTFZX72RmxtxuaFL2Uj3fD1JTvZdx59bHWk6aFU=
github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8=
@@ -511,6 +527,8 @@ golang.org/x/sys v0.0.0-20190508220229-2d0786266e9c/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190523142557-0e01d883c5c5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3 h1:4y9KwBHBgBNwDbtu44R5o1fdOCQUEXhbk/P4A9WmJq0=
golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ=
+golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
@@ -546,6 +564,10 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo=
+gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM=
+gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
+gopkg.in/go-playground/validator.v9 v9.29.1 h1:SvGtYmN60a5CVKTOzMSyfzWDeZRxRuGvRQyEAKbw1xc=
+gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ=
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/ini.v1 v1.42.0 h1:7N3gPTt50s8GuLortA00n8AqRTk75qOP98+mTPpgzRk=
diff --git a/protocol/rest/gin_server.go b/protocol/rest/gin_server.go
new file mode 100644
index 0000000000000000000000000000000000000000..b0579261747849ed12ac98915279fe682016453c
--- /dev/null
+++ b/protocol/rest/gin_server.go
@@ -0,0 +1,46 @@
+package rest
+
+import (
+ "context"
+ "github.com/apache/dubbo-go/common"
+ "github.com/apache/dubbo-go/common/logger"
+ "github.com/gin-gonic/gin"
+ "net/http"
+ "time"
+)
+
+type GinServer struct {
+ engine *gin.Engine
+ srv *http.Server
+}
+
+func (gs *GinServer) Start(url common.URL) {
+ srv := &http.Server{
+ Addr: ":8080",
+ Handler: gs.engine,
+ }
+ srv.ListenAndServe()
+}
+
+func (gs *GinServer) Deploy(service interface{}, config interface{}) {
+ //TODO gin http 部署接口
+ // handler中处理:
+ // http server收到http request,转交给server;
+ // server根据RestService metadata找到Service,并将请求反序列化,构造好Service调用的上下文;
+ // RequestMapper这时候将不会处理什么事情,而是直接转交给Service的实现。
+ //
+ // gs.engine.Handle(method, relativePath, handler)
+}
+
+func (gs *GinServer) Undeploy(url common.URL) {
+ //TODO gin http 删除接口
+}
+
+func (gs *GinServer) Destroy() {
+ ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
+ defer cancel()
+ if err := gs.srv.Shutdown(ctx); err != nil {
+ logger.Errorf("Server Shutdown:", err)
+ }
+ logger.Errorf("Server exiting")
+}
diff --git a/protocol/rest/rest_exporter.go b/protocol/rest/rest_exporter.go
new file mode 100644
index 0000000000000000000000000000000000000000..84a645d9b1246d2b6636ee373acf05f70a2734fa
--- /dev/null
+++ b/protocol/rest/rest_exporter.go
@@ -0,0 +1,16 @@
+package rest
+
+import "github.com/apache/dubbo-go/protocol"
+
+type RestExporter struct {
+ protocol.BaseExporter
+}
+
+func NewRestExporter() *RestExporter {
+ return &RestExporter{}
+}
+
+func (re *RestExporter) Unexport() {
+ // undeploy serviceßß
+ return
+}
diff --git a/protocol/rest/rest_invoker.go b/protocol/rest/rest_invoker.go
new file mode 100644
index 0000000000000000000000000000000000000000..0580b8389fabe17d01f5b43d77795fc3cb2b4d8b
--- /dev/null
+++ b/protocol/rest/rest_invoker.go
@@ -0,0 +1,31 @@
+package rest
+
+import (
+ "github.com/apache/dubbo-go/protocol"
+ "net/http"
+)
+
+type RestInvoker struct {
+ protocol.BaseInvoker
+ client *http.Client
+}
+
+func NewRestInvoker() *RestInvoker {
+ return &RestInvoker{}
+}
+
+func (ri *RestInvoker) Invoke(invocation protocol.Invocation) protocol.Result {
+ // TODO 首先,将本地调用和ReferRestConfig,结合在一起,到这一步完成了Service -> Rest的绑定;
+ // 第一步完成的产物是一份metadata和请求参数,本步骤将利用metadata和请求参数来构造http请求,包括参数序列化,header设定;其中参数序列化可以是Json,也可以是XML,后续可以扩展到多媒体等;
+ // http client发送请求。该步骤要允许用户自定义其连接参数,例如超时时间等;
+ //var (
+ // result protocol.RPCResult
+ //)
+ //req, err := http.NewRequest("method", "url", bytes.NewBuffer([]byte{}))
+ //resp, err := ri.client.Do(req)
+ //defer resp.Body.Close()
+ //body, err := ioutil.ReadAll(resp.Body)
+ //result.Rest = invocation.Reply()
+ //return &result
+ return nil
+}
diff --git a/protocol/rest/rest_protocol.go b/protocol/rest/rest_protocol.go
new file mode 100644
index 0000000000000000000000000000000000000000..2f4e945aaf250867d65848ae99756ea4e0bce706
--- /dev/null
+++ b/protocol/rest/rest_protocol.go
@@ -0,0 +1,44 @@
+package rest
+
+import (
+ "github.com/apache/dubbo-go/common"
+ "github.com/apache/dubbo-go/protocol"
+)
+
+var (
+ restProtocol *RestProtocol
+)
+
+type RestProtocol struct {
+ protocol.BaseProtocol
+}
+
+func NewRestProtocol() *RestProtocol {
+ return &RestProtocol{}
+}
+
+func (rp *RestProtocol) Export(invoker protocol.Invoker) protocol.Exporter {
+ // TODO 当用户注册一个服务的时候,根据ExporterConfig和服务实现,完成Service -> Rest的绑定。注意此处是Service -> Rest,因为此时我们是暴露服务。当收到请求的时候,恰好是暴露服务的反向,即Rest -> Service;
+ // Server在Export的时候并不做什么事情。但是在接受到请求的时候,它需要负责执行反序列化的过程;
+ // http server是一个抽象隔离层。它内部允许使用beego或者gin来作为web服务器,接收请求,用户可以扩展自己的实现;
+
+ // create gin_server
+ // save gin_server in map
+ return nil
+}
+
+func (rp *RestProtocol) Refer(url common.URL) protocol.Invoker {
+ // create rest_invoker
+ return nil
+}
+
+func (rp *RestProtocol) Destroy() {
+ // destroy rest_server
+}
+
+func GetRestProtocol() protocol.Protocol {
+ if restProtocol == nil {
+ restProtocol = NewRestProtocol()
+ }
+ return restProtocol
+}
diff --git a/protocol/rest/rest_server.go b/protocol/rest/rest_server.go
new file mode 100644
index 0000000000000000000000000000000000000000..6c16dd3562262776b4b24a3a4684c1cc7c3b6d96
--- /dev/null
+++ b/protocol/rest/rest_server.go
@@ -0,0 +1,8 @@
+package rest
+
+type RestServer interface {
+ Start()
+ Deploy()
+ Undeploy()
+ Destory()
+}