最近要使用Grpc代替Feign,实现服务间的接口调用,简单了解了一下
gRpc:Google开源使用的远程过程调用(RPC)系统
使用HTTP/2协议传输
使用Protocol Buffers 作为接口描述语言(生成目标代码)
提供身份验证、双向流和流的控制、阻塞和非阻塞的绑定、消除和超时
应用于不同微服务(包括不同语言)间的相互通信以及前端对后端的请求
引用grpc官方文档图片https://grpc.io/docs/guides/
1、当Android-Java编写的服务需要调用C++编写的服务时,C++作为grpc的服务端,Android-Java作为客户端
2、C++作为服务端是可以同时被其它服务同时调用的
3、请求和响应的方式的都为Proto形式
在grpc的使用中,我们需要编写Protocol Buffers作为接口描述语言,在proto3中,它支持Java、C++、Python、Go、Ruby、Objective C、C#,在三方实现也可用于C、Perl、PHP,R、 Scala,Swift 和Julia
我们可以编写同一个proto文件,定义好服务端的请求数据和相应数据,然后根据不同的语言,生成不同的代码
helloworld.proto
syntax = "proto3";
option java_multiple_files = true;
option java_package = "com.novice.grpc.helloworld";
option java_outer_classname = "HelloWorldProto";
service Greeter {
rpc SayHello (HelloRequest) returns (HelloResponse) {}
}
message HelloRequest {
string jsonData= 1;
}
message HelloResponse {
string jsonData= 1;
}
grpc的通信方式:
(引用自官网https://grpc.io/docs/tutorials/basic/java.html)
1、简单grpc:客户端使用存根向服务器发送请求并等待响应返回,就像正常的函数调用一样
rpc SayHello (HelloRequest) returns (HelloResponse) {}
2、服务端流:其中客户端发送请求到服务器,并获得一个流中读取消息的序列后面。客户端从返回的流中读取,直到没有更多消息
rpc SayHello (HelloRequest) returns (stream HelloResponse) {}
3、客户端流:其中客户端将消息写入的序列,并且将它们发送到服务器,再次使用提供的流。客户端完成消息编写后,等待服务器全部读取并返回响应
rpc SayHello (stream HelloRequest) returns (HelloResponse) {}
4、双向流:双方都派出使用读写流的消息序列。这两个流独立运行,因此客户端和服务器可以按照他们喜欢的顺序进行读写:例如,服务器可以在写入响应之前等待接收所有客户端消息,或者它可以交替读取消息然后写入消息,或其他一些读写组合。保留每个流中的消息顺序。
rpc SayHello (stream HelloRequest) returns (stream HelloResponse) {}
grpc之proto的基本数据类型
引用官网https://developers.google.com/protocol-buffers/docs/proto
proto支持大部分基本数据类型,可以使用message对基本数据类型进行封装,但在处理较为复杂的结构对象时,处理会极为不便
个人建议使用json字符串传输
优点:json字符串是string类型,同时json是轻量级数据交互语言,可在多平台上生成和解析,降低了proto的复杂性和处理压力,很好的支持了proto
缺点:添加了服务端和客户端对json的生成和解析操作【不适用json时,复杂接口下还是需要解析转型】
grpc消息传输限制
默认最大消息大小默认被设置为4MB,在创建Server的时候,配置相关的参数来扩大限制最小消息大小的值
MaxRecvMsgSize和MaxSendMsgSize分别设置服务器可以接收的最大消息大小和可以发送的最大消息大小(以字节为单位)。不设置的话默认都是4MB
但是设置限制值过大时,会造成一般情况下的资源浪费(如,只需要2M传输,不需要20M)
可以使用上述流steam传递,分块传输