提纲
1、gRPC简介
2、gRPC原理
3、Java项目中使用gRPC
1、gRPC简介
本文介绍gRPC和protocol buffers,gRPC不仅将protocol buffers用作它的接口定义语言(IDL),而且将protocol buffers用作它底层的消息交换格式。如果你对gRPC和protocol buffers不陌生,那么请你阅读文本。如果你深入了解gRPC并且想要在项目实践中使用gRPC,那么请你选择一个语言,并试用它的Quick start。
概述
在gRPC中,一个客户应用程序可以直接访问另外一台机器上的服务应用程序中的一个方法,就好像这个方法是一个本地对象一样,这种功能使得创建分布式应用程序和服务更加简单。和很多其他的RPC系统一样,gRPC是基于这样的思想:定义一个服务,指定一些方法,这些方法可以通过它的形式参数和返回值类型远程调用。在服务器端,服务器实现了这个接口,并且运行了一个gRPC的服务端去处理这些客户端调用。在客户端,客户提供一个stub,这个stub提供一个和服务端相同的方法。
gRPC客户端和服务端在各种环境下都能相互通信,从google内部的服务器到你自己台式机上的服务器,而且可以使用gRPC支持的各种语言来实现gRPC客户端和服务器端。因此,你可以非常容易地创建一个用java语言写的gRPC服务器和一个用go语言或者Python语言或者Ruby语言写gRPC客户端。除此之外,最新的Google API也有gRPC版本的接口,这样用户可以非常方便的将Google的功能集成到自己的应用程序中。
使用Protocol Buffers
默认情况下,gRPC使用Protocol Buffers,这是Google的开源成熟序列化结构化数据的机制(不过,gRPC也可以和其他的数据格式一起使用,比如JSON)。这是一份关于如何使用Protocol Buffers的快速介绍。如果你已经对Protocol Buffers比较熟悉了,可以先跳到下一节。
使用Protocol Buffers的第一步是在一个proto文件中定义你想要序列化的数据结构,Proto文件是一个扩展名为.proto的普通文本文件。Protocol Buffers数据是结构化为message的,一个message是一个小的逻辑信息单元,这个逻辑信息单元包含一系列的键值对,这些键值对被称为字段。这里有一个例子:
message Person {
string name = 1;
int32 id = 2;
bool has_ponycopter = 3;
}
然后,一旦你定义好了数据结构,就可以使用Protocol Buffers编译器protoc从你的proto定义中生成你想要的语言的数据访问类。这些数据访问类为每一个字段提供了简单的访问器,比如name()和set_name(),以及从原始字节解析整个结构的方法,或者序列化整个结构到原始字节的方法。比如,你选择的语言是C++,如果在上面定义的结构上运行编译器就会生成一个类叫Person,然后,你就可以在自己的应用程序中使用这个类去序列化和提取Person的Protocol Buffer消息。
你可以使用在Protocol Buffers消息中指定的RPC方法参数和返回值类型在普通的proto文件中定义gRPC服务:
// 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客户端和服务端代码,以及常规的用来序列化和提取你的消息类型的protocol buffer代码,在下面你可以看到一个例子。
如果想要学习更多关于protocol buffers的内容,包括如何安装与你选定的语言相关的protoc,参见protocol buffers documentation。
Protocol Buffer Versions
2、gRPC原理
3、Java项目中使用gRPC
参考资料:
1、https://grpc.io/docs/what-is-grpc/introduction/
2、https://www.jianshu.com/p/e60783dbf3b2
4、https://mp.weixin.qq.com/s/ll4nUVB28KpyTMS93xAckQ