gRPC是Google开源的一个RPC框架,基于HTTP2.0传输数据,数据序列化框架为Google开源的Protocol Buffers
一、先简单介绍下Protocol Buffers
同样作为数据序列化框架,Protocol Buffers比XML更小、更快、更易于编程,它将消息和服务定义在.proto文件中,语言无关,在Java中用它自己的编译器将.proto文件直接编译成Java类
1.定义消息
syntax = "proto3";
message SearchRequest {
required string query = 1;
optional int32 page_number = 2;
optional int32 result_per_page = 3;
}
指定元素类型:可以指定元素类型为基本类型,也可以指定为enum或者其他message
指定元素代号:在二进制格式的消息中标识元素,是从1开始的数字
指定元素约束:默认情况下元素可以出现0次或1次;repeated:元素可以出现任意次
添加注释:与Java注释相同,//或者/* ……*/
添加reserved元素:弃用某些元素名或元素代号
message Foo {
reserved 2, 15, 9 to 11;
reserved "foo", "bar";
}
元素基本类型和Java类型的对应关系:double->double, float->float, int32->int, int64->long, bool->boolean, string->String, bytes->BytesString
枚举类型:
message SearchRequest {
required string query = 1;
optional int32 page_number = 2;
optional int32 result_per_page = 3 [default = 10];
enum Corpus {
//option allow_alias = true;
//OTHER = 6; allow_alias为true可以指定不同枚举元素为相同的值
UNIVERSAL = 0;
WEB = 1;
IMAGES = 2;
LOCAL = 3;
NEWS = 4;
PRODUCTS = 5;
VIDEO = 6;
}
Corpus corpus = 4;
}
注意枚举类型的元素代码从0开始,枚举元素也可以弃用某些元素名或元素代码
enum Foo {
reserved 2, 15, 9 to 11, 40 to max;
reserved "FOO", "BAR";
}
默认值:string->empty string, bytes->empty bytes, numeric->0, bool->false, enum->第一个枚举元素
导入其他消息定义:使用public关键字可以传递导入
// old.proto
import public "new.proto";
import "other.proto";
// client.proto
import "old.proto";
// You use definitions from old.proto and new.proto, but not other.proto
消息可以嵌套定义
message SearchResponse {
message Result {
string url = 1;
string title = 2;
repeated string snippets = 3;
}
repeated Result results = 1;
}
2.定义服务
service SearchService {
rpc Search (SearchRequest) returns (SearchResponse);
}
二、从实例出发了解gRPC
gRPC的使用流程是这样的:
1.在.proto文件中定义消息体和服务,规定客户端要发送的消息和服务器的通信方式
2.编译.proto文件,生成Java类
3.编写Server和Client端程序,定义通信方法
4.运行服务器程序,监听请求
5.运行客户端程序,发送请求消息,接收返回消息
Protocol Buffers和gRPC都需要自己的编译器,先添加maven依赖
<properties>
<grpc.version>1.13.1</grpc.version>
<protobuf.version>3.5.1</protobuf.version>
<protoc.version>3.5.1-1</protoc.version>
</properties>
<dependencies>
<dependency>
<groupId>io.grpc</groupId>
<artifactId>grpc-netty</artifactId>
<version>${grpc.version}</version>