go-micro使用protobuf传递http api参数
proto文件
syntax = "proto3";
package Models;
option go_package = "./;Models";
message ProdModel{
int32 ProdID = 1;
string ProdName = 2;
}
message ProdsRequest {
int32 Size = 1;
}
message ProdListResponse{
repeated ProdModel data = 1;
}
生成go文件
protoc --micro_out=../ --go_out=../ Prods.proto
调用
package main
import (
"context"
"fmt"
myhttp "github.com/asim/go-micro/plugins/client/http/v4"
"github.com/asim/go-micro/plugins/registry/consul/v4"
"go-micro.dev/v4/client"
"go-micro.dev/v4/registry"
"go-micro.dev/v4/selector"
"go_micro1/Models"
"io/ioutil"
"log"
"net/http"
)
func callApi2(s selector.Selector) {
myClient := myhttp.NewClient(
client.Selector(s),
client.ContentType("application/json"),
)
req := myClient.NewRequest("prodService", "/v1/prods",
Models.ProdsRequest{Size: 7})
var resp Models.ProdListResponse
err := myClient.Call(context.Background(), req, &resp)
fmt.Println(resp)
if err != nil {
log.Fatal(err)
}
fmt.Println(resp.GetData())
}
func main() {
consulReg := consul.NewRegistry(
registry.Addrs("118.178.242.230:8500"),
)
mySelector := selector.NewSelector(
selector.Registry(consulReg),
selector.SetStrategy(selector.RoundRobin),
)
callApi2(mySelector)
}
使用protoc-go-inject-tag插件处理json格式
安装
go get github.com/favadi/protoc-go-inject-tag
添加注释
syntax = "proto3";
package Models;
option go_package = "./;Models";
message ProdModel{
// @gotags: json:"pid"
int32 ProdID = 1;
// @gotags: json:"pname"
string ProdName = 2;
}
message ProdsRequest {
int32 Size = 1;
}
message ProdListResponse{
repeated ProdModel data = 1;
}
编写bat脚本
cd Models/protos
protoc --micro_out=../ --go_out=../ Prods.proto
protoc-go-inject-tag -input=../Prods.pb.go
cd .. && cd ..