Google 分享 gRPC 作为微服务 REST 的替代方案

尚无读者喜欢这篇文章。
open network

Opensource.com

Google 近期发布了 开源 gRPC,这是一个高效的远程过程调用 (RPC) 框架,可以使用多种编程语言。

RPC,这是一种服务器之间常见的通信方法,并非新生事物。它们可以追溯到 20 世纪 80 年代,并且由于其服务器端性质,它们通常不会暴露给大多数计算机用户,甚至大多数软件开发人员。鉴于 RPC 的作用是支持计算机服务器之间的通信,它们主要对系统管理员和 DevOps 可见。话虽如此,它们的重要性是根本性的,因为它们是连接许多分布式系统的标准机制,这些分布式系统承载着很大一部分互联网流量。

Image of Wikipedia servers

维基百科服务器的图片

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 语法,请点击提供的链接。

标签
User profile image.
Luis Ibáñez 在 Google Inc 芝加哥分公司担任高级软件工程师。

1 条评论

很高兴看到 Google 赶上微软已经存在近十年的功能。

知识共享许可协议本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.