GRPC 概念和 ProtoBuf初识
# 一、名词解释
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里的配置。