学习gRPC模块
gRPC学习笔记
学习来源 开源中国
1、前言
gRPC
是一个高性能、开源和通用的RPC框架- 面向移动和
HTTP/2
设计- 提供跨平台、跨语言(支持多语言)支持
gRPC
基于HTTP/2
标准设计,带来双向流、流控、头部压缩、单TCP连接上的多复用请求(连接复用吧)等等,使其在移动设备上表现更好,更省电和节省空间占用。
2、概述
gRPC
是语言中立、平台中立、开源的远程过程调用(RPC
)系统(比如可以用Java
创建服务器,而用Python
创建客户端)。2.1、gRPC是什么
- 与许多
RPC
系统类似,gRPC
也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。在服务端实现这个接口,并运行一个gRPC
服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。- 使得我们可以更容易的创建分布式应用和服务
2.2、使用protocol buffers
- 是一个Google开源的成熟的结构数据序列化机制(如同
JSON
、XML
)。- protocol buffers手册
3、Hello gRPC!
- 创建一个官方支持,并是自己熟悉的语言的
RPC
服务(Hello World),在官方的Github上都存在相应的例子。- 准备工作:本机有
Git
,然后clone需要的版本的源码。
3.1、定义服务
- 创建一个例子的第一步是定义一个服务(感觉就是
protocol buffers
的配置文件):一个RPC服务通过参数和返回类型来指定可以远程调用的方法。gRPC
通过protocol buffers
来实现这个功能。- 下面将使用
protocol buffers
接口定义语言来定义服务,使用该协议来定义参数和返回类型。客户端和服务器均使用服务定义生成的接口代码。
syntax = "proto3";
option java_package = "io.grpc.examples";
package helloworld;
// The greeter 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;
}
3.2、生成gRPC代码
- 定义好服务之后,就可以使用
protocol buffers
编译器protoc
来创建应用所需的特定客户端和服务器的代码。生成代码的同时包括客户端的存根和服务端要实现的抽象接口,均包含Greeter
所定义的方法。可以使用如下命令生成客户端和服务器端:
./run_codegen.sh # shell只能在支持shell的平台
Python编译语法如下,需要安装
grpcio-tools
,使用pip install grpcio-tools
安装,这里边包含编译的工具。
python -m grpc_tools.protoc -I../protos --python_out=. --grpc_python_out=. ../protos/helloworld.proto
- 其中
-I
:为自定的proto文件目录,是一个目录,那么如果我们在这个文件的目录,就选择上级目录,然后定位到protos目录--python_out
&--grpc_python_out
:明显是根据proto
文件生成的python
文件,包含两个文件,暂时不知道具体用处,只知道是有一个是将proto
文件定义的rpc
绑定到相应的东西上,另外一个相当于做了一个抽象类,里边有proto
定义的两个调用的抽象方法,服务器需要实现的方法。- 最后的是指定需要编译的
proto
文件,和前面的-I
为组合,试了一下去掉-I
参数反之在proto文件上加上相对路径,结果无法编译。- 编译好之后,按照官方的服务器和客户端代码,在服务器上实现更新的方法,做相应处理,然后返回,在客户端调用即可。
- 备注:服务器和客户端必须携带生成的两个代码,这样有点类似分布式实现的Queue了。