学习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开源的成熟的结构数据序列化机制(如同JSONXML)。
  • 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了。