文章目录
前提
谈到gRPC,我们不得不说一下RPC,RPC(Remote Procedure Call)远程过程调用协议,一种通过网络从远程计算机上请求服务,而不需要了解底层网络技术的协议。RPC它假定某些协议的存在,例如TPC/UDP等,为通信程序之间携带信息数据。在OSI网络七层模型中,RPC跨越了传输层和应用层,RPC使得开发,包括网络分布式多程序在内的应用程序更加容易。
RPC模式
RPC采用客户端/服务端的模式,通过request-response消息模式实现
通过上图可以了解到RPC模式和WebApi其实是一样的,都是服务端模式,也就是客户端call服务端的形式。但是这里是否有区别呢,我们下面慢慢探索。
Java和.NET平台中常见的通信技术
Java中支持的包括:
技术 | 简介 | 是否支持跨平台 |
---|---|---|
Corbra | 90年代产物,已被淘汰 | 不支持 |
RMI | EJB时代产物,已逐渐被淘汰 | 不支持 |
WebService | 基于Http SOAP,效率低,逐渐被淘汰 | 支持 |
Hessain | 基于Http,二进制序列化,效率高,使用广泛 | 支持 |
Rest(spring mvc等) | 支持Http Rest,广泛应用于无线API,开放平台等 | 支持 |
JMS、开源MQ | Java消息服务(消息中间件),使用广泛 | 支持 |
Socket | 基于Mina、Netty(NIO、AIO高效通信) | 理论上支持 |
.NET中包括:
技术 | 简介 | 是否支持跨平台 |
---|---|---|
WebService | 基于Http SOAP,效率低,逐渐被WCF整合淘汰 | 支持 |
.NET Remoting | 通信效率尚可,使用复杂,逐渐被WCF整合淘汰 | 不支持 |
WCF SOAP | 整合了原有的WebService,通信效率低 | 支持 |
WCF NET.TCP | 通信效率高,部分.NET项目内部服务在使用 | 不支持 |
WCF Rest | 使用较少,已经被Web Api逐渐取代 | 支持 |
Web Api | 支持Http Rest,广泛应用于无线API,开放平台等 | 支持 |
MSMQ、开源MQ | 微软自己的消息中间件或者其他开源MQ | 支持(MSMQ除外) |
Hessain .NET | 基于Http,二进制序列化,效率高,使用较少 | 支持 |
Socket | 通过Socket网络编程方式实现系统通信 | 理论上支持 |
gRPC
谷歌开源的一套 RPC 协议框架,默认基于Protobuf协议进行数据输出。
Protobuf(Protocol Buffers 编码)
Protobuf 是一种与语言无关、与平台无关的可扩展机制,用于序列化结构化数据。
proto3
第一行第一句syntax = "proto3";
,如何html5的第一句一样,都是为了定义版本和语义
定义类型
message SearchRequest {
string query = 1;
int32 page_number = 2;
int32 results_per_page = 3;
}
关于更多proto3的语法请查阅语言指南(原型 3) |协议缓冲区文档 (protobuf.dev)
C#版本的proto3协议基础知识查阅协议缓冲区基础知识:C# |协议缓冲区文档 (protobuf.dev)
gRPC 的优势
gRPC 使用 HTTP/2 作为传输协议。 虽然与 HTTP 1.1 也能兼容,但 HTTP/2 具有许多高级功能:
- 用于数据传输的二进制组帧协议 - 与 HTTP 1.1 不同,HTTP 1.1 是基于文本的。
- 对通过同一连接发送多个并行请求的多路复用支持 - HTTP 1.1 将处理限制为一次处理一个请求/响应消息。
- 双向全双工通信,用于同时发送客户端请求和服务器响应。
- 内置流式处理,支持对大型数据集进行异步流式处理的请求和响应。
- 减少网络使用率的标头压缩。
gRPC 是轻量型且高性能的。 其处理速度可以比 JSON 序列化快 8 倍,消息小 60% 到 80%。 在 Microsoft Windows Communication Foundation (WCF) 中,gRPC 的性能超过经过高度优化的 NetTCP 绑定的速度和效率。 与偏向于 Microsoft 堆栈的 NetTCP 不同,gRPC 是跨平台的。