Google 近期发布了 开源 gRPC,这是一个高效的远程过程调用 (RPC) 框架,可以使用多种编程语言。
RPC,这是一种服务器之间常见的通信方法,并非新生事物。它们可以追溯到 20 世纪 80 年代,并且由于其服务器端性质,它们通常不会暴露给大多数计算机用户,甚至大多数软件开发人员。鉴于 RPC 的作用是支持计算机服务器之间的通信,它们主要对系统管理员和 DevOps 可见。话虽如此,它们的重要性是根本性的,因为它们是连接许多分布式系统的标准机制,这些分布式系统承载着很大一部分互联网流量。
维基百科服务器的图片
gRPC 基于最近最终确定的 HTTP/2 标准,该标准支持 新功能,例如
- 双向流
- 流量控制
- 头部压缩
- 在单个 TCP 连接上多路复用请求
gRPC 为多种语言提供了库,包括
- C
- C++
- Java
- Go
- Node.js
- Python
- Ruby
gRPC 的源代码可以在 GitHub 上找到,其中包括 大量文档 和一个 主页。gRPC 的发布与 Protocol Buffers: proto3 的新版本同步发布。协议缓冲区用于
- 指定服务器之间交换的消息的内容和结构
- 序列化和反序列化消息
- 为多种语言的对象生成源代码,以便读取和写入消息
- 提供一种消息定义版本控制机制,以便不同版本的客户端和服务器仍然可以互操作
展示 gRPC
快速入门指南 概述了 Python 中的 Hello World。它定义了一个服务,您可以(客户端)向其发送您的姓名,例如“John Doe”,服务会回复组合字符串:“Hello, John Doe”。
以下是将在网络上传输的消息
// 包含用户姓名的请求消息。
message HelloRequest { optional string name = 1; }
// 包含问候语的响应消息。
message HelloReply { optional string message = 1; }
以下是服务定义
syntax = "proto2";
// 问候服务定义。
service Greeter {
// 发送问候语
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
如果我们将此服务和消息定义放在文件 helloworld.proto 中,并使用 Proto3 编译器对其进行处理,它将为客户端和服务端生成 Python 代码。
客户端 将如下所示
import helloworld_pb2
_TIMEOUT_SECONDS = 10
def run()
with helloworld_pb2.early_adopter_create_Greeter_stub('localhost', 50051) as stub
response = stub.SayHello(helloworld_pb2.HelloRequest(name='you'), _TIMEOUT_SECONDS)
print "Greeter client received: " + response.message
if __name__ == '__main__'
run()
而 服务端 将如下所示
import time
import helloworld_pb2
_ONE_DAY_IN_SECONDS = 60 * 60 * 24
class Greeter(helloworld_pb2.EarlyAdopterGreeterServicer)
def SayHello(self, request, context)
return helloworld_pb2.HelloReply(message='Hello, %s!' % request.name)
def serve()
server = helloworld_pb2.early_adopter_create_Greeter_server(Greeter(), 50051, None, None)
server.start()
try
while True
time.sleep(_ONE_DAY_IN_SECONDS)
except KeyboardInterrupt
server.stop()
if __name__ == '__main__'
serve()
更多详细信息请参阅 入门指南。
免责声明: 上面 Python 代码中的缩进并不完全准确。为了获得正确和规范的 Python 语法,请点击提供的链接。
1 条评论