gRPC的概述

基本概念

gRPC中文

gRPC 一开始由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。

gRPC 基于 HTTP/2 标准设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特。 这些特性使得其在移动设备上表现更好,更省电和节省空间占用。

gRPC 是一个高性能、开源和通用的 RPC 框架,面向移动和 HTTP/2 设计。

目前提供 C、Java 和 Go 语言版本,分别是:grpc, grpc-java, grpc-go.

其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持.

gRPC 里客户端应用可以像调用本地对象一样直接调用另一台不同的机器上服务端应用的方法,使得您能够更容易地创建分布式应用和服务

gRPC 也是基于以下理念:定义一个服务,指定其能够被远程调用的方法(包含参数和返回类型)。
在服务端实现这个接口,并运行一个 gRPC 服务器来处理客户端调用。在客户端拥有一个存根能够像服务端一样的方法。

gRPC–python

序列化机制

gRPC 默认使用 protocol buffers,这是 Google 开源的一套成熟的结构数据序列化机制(当然也可以使用其他数据格式如 JSON)。 用 proto files 创建 gRPC 服务,用 protocol buffers 消息类型来定义方法参数和返回类型。

gRPC uses protocol buffers as the Interface Definition Language (IDL)

protocol buffers 文档

服务定义

gRPC 允许定义四类服务方法:

1 单项 RPC, 即客户端发送一个请求给服务端,从服务端获取一个应答,就像一次普通的函数调用。

    rpc SayHello(HelloRequest) returns (HelloResponse){
    }

客户端发出单个请求,获得单个响应。

  • 一旦客户端通过桩调用一个方法,服务端会得到相关通知 ,通知包括客户端的元数据,方法名,允许的响应期限(如果可以的话)

  • 服务端既可以在任何响应之前直接发送回初始的元数据,也可以等待客户端的请求信息,到底哪个先发生,取决于具体的应用。

  • 一旦服务端获得客户端的请求信息,就会做所需的任何工作来创建或组装对应的响应。如果成功的话,这个响应会和包含状态码以及可选的状态信息等状态明细及可选的追踪信息返回给客户端 。

  • 假如状态是 OK 的话,客户端会得到应答,这将结束客户端的调用。

2 服务端流式 RPC,即客户端发送一个请求给服务端,可获取一个数据流用来读取一系列消息。客户端从返回的数据流里一直读取直到没有更多消息为止。

rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse){
}

服务端流式 RPC 除了在得到客户端请求信息后发送回一个应答流之外,与我们的简单例子一样。 在发送完所有应答后,服务端的状态详情(状态码和可选的状态信息)和可选的跟踪元数据被发送回客户端,以此来完成服务端的工作。 客户端在接收到所有服务端的应答后也完成了工作。

3 客户端流式 RPC,即客户端用提供的一个数据流写入并发送一系列消息给服务端。一旦客户端完成消息写入,就等待服务端读取这些消息并返回应答。

rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse) {
}

客户端流式 RPC 也基本与我们的简单例子一样,区别在于客户端通过发送一个请求流给服务端,取代了原先发送的单个请求。 服务端通常(但并不必须)会在接收到客户端所有的请求后发送回一个应答,其中附带有它的状态详情和可选的跟踪数据。

4 双向流式 RPC,即两边都可以分别通过一个读写数据流来发送一系列消息。这两个数据流操作是相互独立的,所以客户端和服务端能按其希望的任意顺序读写,例如:服务端可以在写应答前等待所有的客户端消息,或者它可以先读一个消息再写一个消息,或者是读写相结合的其他方式。每个数据流里消息的顺序会被保持。

rpc BidiHello(stream HelloRequest) returns (stream HelloResponse){
}

双向流式 RPC ,调用由客户端调用方法来初始化,而服务端则接收到客户端的元数据,方法名和截止时间。服务端可以选择发送回它的初始元数据或等待客户端发送请求。 下一步怎样发展取决于应用,因为客户端和服务端能在任意顺序上读写 - 这些流的操作是完全独立的。例如服务端可以一直等直到它接收到所有客户端的消息才写应答, 或者服务端和客户端可以像”乒乓球”一样:服务端后得到一个请求就回送一个应答,接着客户端根据应答来发送另一个请求,以此类推。

gRPC–python

准备

1 Python 2.7 + or Python 3.4 +

2 pip version 9.0.1+

$ python -m pip install --upgrade pip

3 安装 gRPC

$ python -m pip install grpcio

$ python -m pip install grpcio-tools

4 下载实例demo

 git clone -b v1.24.0 https://github.com/grpc/grpc

 cd grpc/examples/python/helloworld

5 运行实例

 python greeter_server.py
 python greeter_client.py

6 proto 协议文件

    // The greeting service definition.
    service Greeter {
      // Sends a greeting
      rpc SayHello (HelloRequest) returns (HelloReply) {}
      // Sends another greeting
      rpc SayHelloAgain (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;
    }

7 生成 gRPC code

python -m grpc_tools.protoc -I ../../protos --python_out=. --grpc_python_out=. ../../protos/helloworld.proto

protoc -I=$SRC_DIR --python_out=$DST_DIR $SRC_DIR/addressbook.proto


-m  指定 grpc_tools.protoc模块
-I  指定 proto协议文件  ../../protos ../../protos/helloworld.proto
--python_out=. 指定pb2文件输出路径
--grpc_python_out=. 指定pb2 grpc文件输出路径

8 _pb2.py contains our generated request and response classes

_pb2_grpc.py contains our generated client and server classes.

Buy me a 肥仔水!