🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
>[info] 原文地址:http://www.grpc.io/docs/guides/ 本文向你介绍gRPC和protocol buffers。gRPC可以使用protocol buffers作为它的IDL(Interface Description Language),同时也可以将它作为底层消息交换格式。如果你刚开始接触gRPC以及protocol buffers,正好可以阅读此文。 **Overview** 在gRPC中,一个客户端程序可以直接调用一个服务端程序中的方法,这个服务端程序可以是在另外一台机器上,调用起来就像它是一个本地对象,这就方便你创造分布式的应用和服务。正如需要RPC系统那样,gRPC的思想基础也是:定义一个服务,然后指定方法可以通过参数和返回类型,来远程调用它们。在服务端,程序实现这个接口,并且运行一个gRPC服务器来处理客户端调用。在客户端,有一个存根(stub,即为用任何语言写的客户端程序),它提供了和服务端相同的方法。 ![](https://box.kancloud.cn/ea5fd699e9b041e8d71463892e81b4d6_513x329.png) gRPC客户端和服务器可以相互通信,并能够在多变的环境里正常运行,从Google的服务器到你自己的桌面端,并且可以使用任何gRPC支持的语言编写。所以,比如,你可以很容易的用Java实现一个gRPC服务端,然后用Go,Python或Ruby实现一个客户端。此外,最新的Google APIs将会有他们接口的gRPC版本,让你在应用中,方便的使用Google的功能。 **使用Protocol Buffers** gRPC默认使用[protocol buffers](https://developers.google.com/protocol-buffers/docs/overview),它是Google的一个成熟开源框架,用来序列化结构化的数据(尽管它也可以使用其它的数据格式,比如JSON)。这里简要介绍它是如何工作的。如果你已经很熟悉protocol buffers,可以跳过该部分 使用protocol buffers的第一步是,在一个*proto*文件中定义你想序列化的数据的结构:它是一个普通的文本文件,以`.proto`扩展名结尾。protocol buffer的数据被结构化为消息,每一个`message`都是一个小的逻辑记录,包含了一系列的被称为`fields`的name-value对信息。下面是一个简单样例: ~~~ message Person { string name = 1; int32 id = 2; bool has_ponycopter = 3; } ~~~ 然后,当你指定完了你的数据结构,就可以使用protocol buffer编译器`protoc`,依照之前的定义来生成数据访问类,可以使用你喜好的任何语言。这些会为每一个field提供简单的访问器(例如`name()`和`set_name()`),也提供了将整个结构序列化为原生字节的方法,以及从原生字节转换为结构化数据的方法。--所以,比如,如果你选择使用C++语言,对以上例子执行编译,将会生成一个叫做`Person`的类。然后你就可以使用这个类来填充,序列化,和接收Person的 protocol buffer消息。 接下来你会看到更多的细节,在普通的proto文件中,使用RPC方法的参数和返回类型定义gRPC服务,其中返回类型就是protocol buffer中已定义的各种messages: ~~~ // 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; } ~~~ gRPC还使用`protoc`和一个特殊的gRPC插件,从proto文件中生成代码。并且,通过gRPC插件,你可以得到生成的gRPC客户端和服务端代码,就像上面那样用来填充,序列化,和接收消息类型的规则protocol buffer代码一样。我们将会在后面看到更多细节。 你可以在[Protocol Buffers documentation](https://developers.google.com/protocol-buffers/docs/overview)中找到更多细节,而且在你选择的语言的Quickstart中,查到如何获取,和安装带有gRPC插件的`protoc`。 **Protocol buffer 版本** 因为protocol buffers作为开源项目已有一段时间,我们的案例使用了一个新的版本,叫做proto3,它有着轻量简化的语法,一些有用的新特性,并支持很多语言,目前在Java, C++, Python, Objective-C, C#, a lite-runtime(Android Java), Ruby, 和JavaScript中都可用,这里是[下载地址](https://github.com/google/protobuf/releases), 而Go语言的生成器在[这里](https://github.com/golang/protobuf),同样包含了每个语言的手册文档,并且在发布说明中,能看到和目前默认版本的主要区别。更多proto3的文档即将发布。 一般来说,虽然你可以使用proto2(当前默认的protocol buffers版本),但我们推荐你使用proto3协同gRPC,它可以允许你使用gRPC支持的所有语言,并且避过了proto2客户端和proto3服务端或者相反带来的兼容性问题。