上一期和大家谈到了gRPC的快速开始,我么哪知道了gRPC是什么以及怎么快速启动,那么现在,我们来看看这个玩意具体内部是怎么运作的,这里我们同样以helloworld这个为例子来去谈。首先上期内容在这里:
机智的叉烧:ML&DEV | gRPC初体验zhuanlan.zhihu.com当然的,大家也可以直接去看官方的教程,这里会教你怎么去做,但是我会和大家谈更多的内部细节的东西,可别错过啦:https://github.com/grpc/grpc/tree/master/examples/cpp/helloworld
我发现这下面基本就是c++的东西了,这意味着c++的入门线路安排上了好吧。
基本结构
这里有必要和大家再啰嗦一下具体的架构模式。
左边是一个c++写的gRPC_server服务,服务大家可以理解为一个服务台,一个专门的服务台,你有特定的需求就找他的那种,他能给你提供相应的服务,他是并非万能,而是具备专项的能力。
右边是各种别的语言或者环境写的客户端,有Ruby的,也有Client的,当然也可以是c++的甚至是别的,客户端可以理解为一个客户,这个客户有特定需求需要访问服务端以满足特定的需求,此时就需要做出请求。
需要指出的是,客户端和服务端两者的关系是相对于这个任务而言的,你需要完成某个任务的时候,你要请求别人,那你就是客户端,但是你作为一个服务要被人请求的时候,你就是一个服务端,对于一个项目,他可能是服务端也可能是一个客户端(这么理解吧,你舔的女神可能是别人的舔狗)。
由于服务端的功能一般是单一的,它只能完成特定的功能,为了保证两者的沟通是有效的,服务端和客户端之间就要订一个协议,可以理解为沟通的暗号,这个协议在我的理解下要完成这几个功能:
- 客户端提供给服务端需要的数据,例如要验证账号密码正确,那肯定一个需要把账号密码传过去。要做计算,肯定你给要把相应的特征和参数传过去。
- 服务端计算完成的结果,即客户端需要的内容。
一般的,可能我们会用xml或者是json,在gRPC中,这个协议就是protobuf,下面会谈到。
还有两个需要指出的概念,客户端向服务端发出的信息被称为你请求,英文是request,服务端接收客户端的请求后,返回给客户端的信息成为返回,英文是response,有的地方也叫做reply。
protobuf
要谈到gRPC的运作,肯定就要谈到protobuf了,这是一个谷歌开源的语言无关、平台无关、可拓展的序列化数据结构方法,类似XML等,但是速度更快,体积更小。
他的结构是这样的:
message Example1 {
optional string stringVal = 1;
optional bytes bytesVal = 2;
message EmbeddedMessage {
int32 int32Val = 1;
string stringVal = 2;
}
optional EmbeddedMessage embeddedExample1 = 3;
repeated int32 repeatedInt32Val = 4;
repeated string repeatedStringVal = 5;
}
可以看到这个结构很像json,但是又不太一样,主要是他有了比较严谨的数据类型定义。
在这里,我们只要知道它的基本结构和编写方式即可。protobuf的具体格式和入门可以参照这个:https://developers.google.com/protocol-buffers/docs/cpptutorial,如果是打不开,可以看这个,中文版的:h