gRPC是什么
gRPC是谷歌的开源RPC框架,诞生的目的是为了帮助不同编程语言的软件系统之间能够使用相同的服务。客户端和服务端只需要拥有相同的proto文件(也叫做存根),就能使用protobuf工具生成对应语言的grpc方法文件。
gRPC使用的哪种通信协议,与其他相比优点在哪?
gRPC使用HTTP2协议,拥有HTTP2的特性
-
使用二进制帧
- 高性能和健壮性
- 更轻量级的传输、解码更安全等特性
- 因为它是二进制的,它也能很好地契合protocol buffer格式,使得传输更加方便。
- HTTP2在头部使用HPACK压缩,也大大地减少了传输中的开销,提高传输性能。
- HTTP2的多路复用特性,使得gRPC可以保证客户端和服务器在同一个TCP连接中进行多次请求和响应,很有效的减少网络延迟和提高网络利用率
- 允许服务器主动推送资源也是HTTP2赋予gRPC的一大特性,服务端明确知道客户端的需求,客户端只需发送一次请求,服务端就将所需的资源一并发送给客户端,减少交互产生的网络IO和延迟
关于HTTP2,可查看这篇文档HTTP
什么是protobuf
protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。
Protocol Buffers 是一种灵活,高效,自动化机制的结构数据序列化方法-可类比 XML,但是比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单。
你可以定义数据的结构,然后使用特殊生成的源代码轻松的在各种数据流中使用各种语言进行编写和读取结构数据。你甚至可以更新数据结构,而不破坏由旧数据结构编译的已部署程序。
简单来讲, ProtoBuf 是结构数据序列化方法,可简单类比于 XML,其具有以下特点:
- 语言无关、平台无关。即 ProtoBuf 支持 Java、C++、Python 等多种语言,支持多个平台
- 高效。即比 XML 更小(3 ~ 10倍)、更快(20 ~ 100倍)、更为简单
- 扩展性、兼容性好。你可以更新数据结构,而不影响和破坏原有的旧程序
相较于XML和JSON,protobuf的数据结构化,可读性要弱一些,但是数据序列化更强大(为什么更强大可以参考深入 ProtoBuf - 编码了解 ProtoBuf 是如何极尽所能的压榨每一寸空间和性能,其中的编码原理正是 ProtoBuf 的关键所在)。
protobuf的应用场景明确性强(跨平台的RPC数据传输),xml和json的应用场景更加丰富(web接口等数据,便于阅读)
HTTP和RPC有什么区别,相同之处
这个问题在知乎上被讨论的很激烈,当中有一个回答我觉得是比较合理的,如果读这篇博客的同学有另外的看法,可以到知乎上去分享一下
从历史角度来看:
RPC在1984年就被拿来做分布式系统的通信,而HTTP在1990年才开始作为主流协议出现,并且HTTP的应用场景是在web领域,而不是分布式系统之间的通信,这样导致在很长一段时间内HTTP都是浏览器程序和后端web系统之间通信的的东西,传输的都是啰嗦的HTML,当AJAX和JSON成为主流,HTTP才摆脱了HTML用上了JSON。后面restful思潮兴起,HTTP也就成为了浏览器程序的首选,因为都是在内网中走,系统之间的调用在性能上要求不高,这时的HTTP也恰好满足这个条件,维护成本也低。
从技术角度来看:
这俩不是一个平行的概念,rpc是远程调用,http是传输协议。rpc是对底层的封装,可以很好的帮助调用远程服务器上的方法。rpc既可以在tcp上构建,也可以在http上构建。更多的是接口的封装与使用友好性. 基于http的rpc在传输层使用文本协议.基于tcp的rpc传输层是二进制协议.
顺带贴一个使用grpc实现的客户端服务端demo
|