定义proto文件
syntax = "proto3";
package Models;
message ProdModel { //定义一个结构体,因为这里返回值是一个切片,作为返回值的元素,要和server中定义的返回值中的元素的字段是一样的
int32 ProdID = 1;
string ProdName = 2;
}
message ProdRequest { //定义一个请求结构体,接受请求的参数
int32 size = 1;
}
message ProdListResponse {
repeated ProdModel data = 1; //这里表示这个数据结构是一个切片,存放的是ProdModel结构体,data是因为api返回值得json中的key是data,所以这里也要一致
}
grpc框架规定好了我们调用api的方式,也就解决了上节课的问题
package main
import (
"context"
"fmt"
"github.com/micro/go-micro/client"
"github.com/micro/go-micro/client/selector"
"github.com/micro/go-micro/registry"
myhttp "github.com/micro/go-plugins/client/http"
"github.com/micro/go-plugins/registry/consul"
"go-micro/Models"
"log"
)
func callAPI(s selector.Selector) {
myCli := myhttp.NewClient(
client.Selector(s),
client.ContentType("application/json"),
)
req := myCli.NewRequest("prodservice", "/v1/prods", Models.ProdRequest{Size: 2}) //使用生成的pb文件中的结构体作为参数封装到请求体中
var resp Models.ProdListResponse //这里使用生成的response对象,客户端只需要传入这个就可以了,无需关心服务端返回什么格式,因为服务端已经用rpc框架定义好了这一切,我们使用即可
err := myCli.Call(context.Background(), req, &resp)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp)
}
func main() {
consulReg := consul.NewRegistry(
registry.Addrs("localhost:8500"),
)
mySelector := selector.NewSelector(
selector.Registry(consulReg),
selector.SetStrategy(selector.RoundRobin), //设置查询策略,这里是轮询
)
callAPI(mySelector)
}