GRPC 概念和 ProtoBuf初识

9/14/2022

# 一、名词解释

RPC,GRPC,GoRPC,protoc,protoBuf,到底都是些什么牛马……

# 1.RPC

全称Remote Produce Call,翻译后是:远程过程调用。对应的是本地过程调用,如系统调用。

远程过程调用就是某台计算机,通过网络让另一台计算机执行一些功能。

看起来很像接口调用?因为HTTP可以看做是 RPC的一种,这两个都是基于TCP/IP协议传输的。

而GRPC 就是基于HTTP2协议的

有了HTTP为什么还需要其他RPC?关于这个网上很多文章有详细介绍,简单概况来说就是:HTTP效率低,定制的RPC通信效率更高。

# 2.GRPC 和 GoRPC

这俩都是某种RPC的实现,但并不是同一个。

  • GoRPC 是go语言的RPC框架,使用的是Gob编码,一般仅限于go程序间调用。

  • 而GRPC是跨语言的RPC框架,使用的是ProtoBuf编码方式。

类似这样跨语言的RPC框架,还有 thrift 框架。

# 3.ProtoBuf/Protoc/proto

ProtoBuf 是一种编码协议,定义了一种数据的编解码方式(序列化/反序列化方式)。

按这种协议编码的数据比较小,而且编解码消耗较少,速度较快。

这种协议要求把数据按他们的语法定义,并且需要用官方的程序配套生成代码

用来定义的语法就是proto语法,定义数据的文件名后缀是 .proto

现在用的比较多的是proto2和proto3。文件名开头都要加语法标识,如下:

syntax = "proto3";

Protoc 就是用来生成配套代码的二进制程序。

但这个程序只能编译proto文件,如果需要做GRPC开发,生成框架代码还需要搭配语言插件。

# 4.其他

使用ProtoBuf不一定要使用GRPC。

因为这只是一种序列化的协议,并不是一个GRPC框架。

GRPC是一整套通信机制,一套依赖ProtoBuf的RPC机制。所以使用GRPC必须使用ProtoBuf协议

此外,RPC框架除了编解码的逻辑,一般还有其他的配套功能:

  • 连接保活
  • 阻塞非阻塞调用
  • 流式传输的支持(thrift没有)
  • 安全认证
  • 拦截器等

# 二、ProtoBuf的使用

关于proto文件的基本语法,网上有很多。

这里介绍下开发常见的问题。

# 1.下载主程序

刚用ProtoBuf 最大的问题就是不知道都要下载哪些文件?下载什么版本?下载之后怎么用?

首先到github上protoBuf的release页面下载。

如果有要求可以下载指定版本,无要求下载 Latest 即可,最好不要下载 pre-release版本。

只需要下载用于编译的主要程序 protoc。

这里提供的 protobuf-java/protobuf-php 等等,只是ProtoBuf的运行时环境,是为了让这些语言支持ProtoBuf。

比如对于PHP语言来说是个扩展,对于java来说就是个jar包,但是对于go这种天生支持的就不需要。

建议把解压后的 bin 目录的 protoc/protoc.exe 加入系统变量。

# 2.编译

命令示例:

protoc --java_out=/path/to/java/code \
-I=/path/to/proto1 \
-I=/path/to/proto2 \
/path/to/user.proto
  • java_out 指定了要生产的java代码存放路径;
  • -I 指定了 .proto 文件所在的路径 可以指定多个,都用-I指定
  • 最后一个参数是要编译的 .proto 文件,每次只能编译单个文件。
  • 如果要编译多个文件只能用*.proto,不支持目录递归

# 3.使用GRPC

单纯使用protoc 只能编译出编解码相关的逻辑**,要编译出GRPC相关的代码还需要使用生成grpc代码的插件**。

不同的语言生成GRPC的方式也不同:

  • go 语言需要自行下载 protoc-gen-go-grpc 插件
  • java 虽然本质也是用 protoc-gen-java-grpc,但是可以使用maven或gradle插件代劳

而这些在官网 grpc.io 都有案例和demo。

# 三、小结

先简单了解下 ProtoBuf,下次讲讲 proto 如何引入其他文件和第三方文件,以及在IDE里的配置。