Writing Rest service

服务端 1个工程或者go package,推荐结构如下

server/

├── conf

│ ├── chassis.yaml

│ └── microservice.yaml

└── main.go

1.编写接口

type RestFulHello struct {}

func (r *RestFulHello) Sayhello(b *restful.Context) {
    b.Write([]byte("get user id: " + b.ReadPathParameter("userid")))
}

2.注册路由

func (s *RestFulHello) URLPatterns() []restful.RouteSpec {
    return []restful.RouteSpec{
        {http.MethodGet, "/sayhello/{userid}", "Sayhello"},
    }
}

3.注册接口

第一个参数表示你要向哪个协议注册,第三个为schema ID,会在调用中使用

chassis.RegisterSchema(“rest”, &RestFulHello{}, server.WithSchemaId(“RestHelloService”)) 说明:

想注册的rest协议的接口,必须实现URLPatterns方法定义路由 路由中暴露为API的方法都要入参均为*restful.Context 3.修改配置文件chassis.yaml

cse:
  service:
    registry:
      address: http://127.0.0.1:30100
  protocols:
    rest:
      listenAddress: 127.0.0.1:5001

4.修改microservice.yaml

service_description:
  name: RESTServer

5.main.go中启动服务

func main() {
    //start all server you register in server/schemas.
    if err := chassis.Init(); err != nil {
        lager.Logger.Error("Init failed.", err)
        return
    }
    chassis.Run()
}

客户端 1个工程或者go package,推荐结构如下

client/

├── conf

│ ├── chassis.yaml

│ └── microservice.yaml

└── main.go

1.修改配置文件chassis.yaml

cse:
  service:
    registry:
      address: http://127.0.0.1:30100

2.修改microservice.yaml

service_description: name: RESTClient 3.main中调用服务端,请求包括服务名,schema,operation及参数

//if you use go run main.go instead of binary run, plz export CHASSIS_HOME=/path/to/conf/folder
func main() {
    //Init framework
    if err := chassis.Init(); err != nil {
        lager.Logger.Error("Init failed.", err)
        return
    }
    req, _ := rest.NewRequest("GET", "cse://RESTServer/sayhello/world")
    defer req.Close()
    resp, err := core.NewRestInvoker().ContextDo(context.TODO(), req)
    if err != nil {
        lager.Logger.Error("error", err)
        return
    }
    defer resp.Close()
    lager.Logger.Info(string(resp.ReadBody()))
}