前言
ProtoBuf
是什么?
ProtoBuf
是一套接口描述语言(IDL),艰深的讲是一种数据表达方式,也能够称为数据交换格局。
咱们罕用的数据格式有 JSON
和 XML
,为什么应用 ProtoBuf
?是因为它的传输快,为什么传输快?大家能够找下材料。应用 .proto
文件进行形容要序列化的数据结构,而后将写好 .proto
文件应用 protoc
就能够很容易编译成泛滥计算机语言的接口代码。
gRPC
是什么?
gRPC
是开源的 RPC
框架,已反对支流的计算机语言,能够通过 ProtoBuf
进行定义接口,能够基于 ProtoBuf
进行数据传输。
两者尽管是一家,然而别离解决不同的问题,能够配合应用,也能够离开。
看一下的 gRPC
helloworld 的 proto
文件是如何定义的?
helloworld.proto
syntax = "proto3";
package helloworld;
option go_package = "./;helloworld";
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}}
// The request message containing the user's name.
message HelloRequest {string name = 1;}
// The response message containing the greetings
message HelloReply {string message = 1;}
文件中定义了一个 service
Greeter 和 rpc
SayHello 办法。
入参:string
name
出参:string
message
这些过于简略,还能不能形容其余信息?
小思考
- 定义的
rpc
办法是否也同时反对HTTP
调用?例如:SayHello 办法,既反对 gRPC 调用,也反对 HTTP 调用,同时反对protoc
生成代码时,同时也生成Swagger
接口文档。 - 定义的入参是否反对参数验证?例如:name 长度不能大于 20 个字符。
- 定义的
service
Greeter 服务是否反对拦截器?例如:该服务下的所有办法须要进行登录令牌验证。 - 定义的
rpc
SayHello 办法可能反对拦截器?例如:以后办法反对开启和敞开是否记录日志。
小结
以上问题还未齐全解决,学习 gRPC 感觉有些吃力 …
大家有没有能够举荐的学习资源?目前在看 grpc-gateway。
举荐浏览
- Go – 应用 sync.WaitGroup 来实现并发操作
- Go – 应用 sync.Map 解决 map 并发平安问题
- Go – 基于逃逸剖析来晋升程序性能
- Go – 应用 sync.Pool 来缩小 GC 压力
- Go – 应用 options 设计模式