grpc 具备多种常用的功能,比如 Authentication、Flow Control 等等。
grpc-ecosystem 中有多个和 grpc 相关的生态项目,比如:
grpc-gateway 用于生成 restful 接口到 rpc 接口的转换代码。
用注解标记映射关系需要更改接口定义文件。如果不能修改接口定义文件,可以:
具体用法见:[gRPC API Configuration][13]。
如果使用注解标记,需要将下面的文件复制到本地项目 idl 目录的 google/api 中,就可以使用其中的 option google.api.http 进行标注。
google.api.http 支持参数都列在 google/api/http.proto 中的 HttpRule 结构体中,用途分别如下:
message HttpRule {
string selector = 1;
oneof pattern {
string get = 2;
string put = 3;
string post = 4;
string delete = 5;
string patch = 6;
CustomHttpPattern custom = 8;
}
string body = 7;
string response_body = 12;
repeated HttpRule additional_bindings = 11;
}
路径参数指定方式如下(example/library/v1/library.proto),定义了两个路径参数 schelves 和 books,其中 schelves 对应请求参数中的 name。Google 的 api 使用了这种风格的路径参数:google api。
rpc DeleteBook(DeleteBookRequest) returns (google.protobuf.Empty) {
option (google.api.http) = {
delete: "/v1/{name=shelves/*/books/*}"
};
option (google.api.method_signature) = "name";
}
代码生成需要在 protoc-gen-go 和 protoc-gen-go-grpc 之外,再安装两个 protoc 插件:
go install \
github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway@latest \
github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2@latest \
然后用 protoc 生成代码:
protoc -I ./idl --grpc-gateway_out ./ \
--grpc-gateway_opt module=NAME \
./idl/NAME/v1beta/*.proto \
./idl/NAME/v1beta/*/*.proto
之后就可以引用生成的代码提供 rest 接口。
[12]: https://grpc-ecosystem.github.io/grpc-gateway/docs/mapping/grpc_api_configuration/ “” [13]: https://grpc-ecosystem.github.io/grpc-gateway/docs/mapping/grpc_api_configuration/ “gRPC API Configuration”