1、介绍
gRPC Transcoding 是一种定义了grpc与http rest api转化规则,这种规则适用于 Google APIs, Cloud Endpoints, gRPC Gateway等,目前已被广泛使用。
英文文档见:
https://cloud.google.com/endpoints/docs/grpc-service-config/reference/rpc/google.api#google.api.HttpRule
代码可见:
https://github.com/googleapis/googleapis/blob/master/google/api/http.proto
本篇算是对以上文档的翻译与主要观点提炼,再加上个人测试结果。
2、环境准备
2.1 protoc版本
由于我写的是proto3,所以protoc选用了3.11,这个只要选用最新的,差异不大
2.2 protoc-gen-go与protoc-gen-grpc-gateway版本
这两个我踩坑了。。.主要之前安装过protoc-gen-go,它是生成pb.go的工具,后来再安装的protoc-gen-grpc-gateway时不清楚之前protoc-gen-go的版本,所以直接安装最新了,代码跑起来就会报各种方法未实现。研究了一下protoc-gen-grpc-gateway是生成pb.gw.go的工具,由于protoc-gen-go有版本v1和版本v2,且两个差异较大,相应的protoc-gen-grpc-gateway也应该使用对应的版本。
怎么区分protoc-gen-go新旧版本呢?
了解到v1版的protoc-gen-go,在执行protoc-gen-go --version命令后会一直挂起,而v2版本执行完此命令后会立刻返回版本号。因为我的protoc-gen-go是v1版本,在下载github.com/grpc-ecosystem/grpc-gateway后,把tag切到v1后,重新go build 生成protoc-gen-grpc-gateway ,移到本机GOPATH下
最后还遇到个问题仅供参考:undefined: runtime.ServerTransportStream,github.com/grpc-ecosystem/grpc-gateway错误,查询官网把
grpc-gateway版本改成 v1.14.8就可以解决了。
最后推荐https://github.com/jergoo/go-grpc-tutorial这个git项目,适合初学grpc的,我是直接在它项目上改改验证此次结论的。
3、http 映射规则
3.1 测试代码
//request
message msgtype{
string msgname = 1;
}
message HelloURLPathRequest{
string name = 1;
repeated string msg = 2;
msgtype msgfield = 3;
}
//response
message HelloHTTPResponse {
string message = 1;
}
//grpc func
func (h helloHTTPService) SayHelloURLPath(ctx context.Context, in *pb.HelloURLPathRequest) (*pb.HelloHTTPResponse