介绍
我猜测大部分长期使用 Java
的开发者应该较少会接触 gRPC
,毕竟在 Java
圈子里大部分使用的还是 Dubbo/SpringClound
这两类服务框架。
我也是近段时间有机会从零开始重构业务才接触到 gRPC
的,当时选择 gRPC
时也有几个原因:
- 基于云原生的思路开发部署项目,而在云原生中
gRPC
几乎已经是标准的通讯协议了。 - 开发语言选择了 Go,在 Go 圈子中
gRPC
显然是更好的选择。 - 公司内部有部分业务使用的是
Python
开发,在多语言兼容性上gRPC
支持的非常好。
经过线上一年多的平稳运行,可以看出 gRPC
还是非常稳定高效的;rpc 框架中最核心的几个要点:
- 序列化
- 通信协议
- IDL(接口描述语言)
这些在 gRPC
中分别对应的是:
- 基于
Protocol Buffer
序列化协议,性能高效。 - 基于
HTTP/2
标准协议开发,自带stream
、多路复用等特性;同时由于是标准协议,第三方工具的兼容性会更好(比如负载均衡、监控等) - 编写一份
.proto
接口文件,便可生成常用语言代码。
HTTP/2
学习 gRPC
之前首先得知道它是通过什么协议通信的,我们日常不管是开发还是应用基本上接触到最多的还是 HTTP/1.1
协议。
由于 HTTP/1.1
是一个文本协议,对人类非常友好,相反的对机器性能就比较低。
需要反复对文本进行解析,效率自然就低了;要对机器更友好就得采用二进制,HTTP/2
自然做到了。
除此之外还有其他优点:
- 多路复用:可以并行的收发消息,互不影响
HPACK
节省header
空间,避免HTTP1.1
对相同的header
反复发送。
Protocol
gRPC
采用的是 Protocol
序列化,发布时间比 gRPC
早一些,所以也不仅只用于 gRPC
,任何需要序列化 IO 操作的场景都可以使用它。
它会更加的省空间、高性能;之前在开发 https://github.com/crossoverJie/cim 时就使用