grpc简介(二)

120 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第 15 天,点击查看活动详情

一、安装protoc

# 1,下载压缩包
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.15.6/protobuf-cpp-3.15.6.tar.gz
# 2,解压
tar -xzvf protobuf-cpp-3.15.6.tar.gz
cd protobuf-cpp-3.15.6
# 3,设置编译目录
./configure --prefix=/usr/local/protobuf
# 4,编译检测
make check
# 5,编译
make
# 6,安装
make install
# 7,配置环境变量
vim ~/.bash_profile
export PROTOBUF=/usr/local/protobuf 
export PATH=$PATH:$PROTOBUF/bin
source ~/.bash_profile
# 8,测试
protoc --version

二、安装go插件

go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
# 编译器插件protoc-gen-go将安装在 $GOBIN 中,默认为$GOPATH/bin,它必须在您$PATH的协议编译器protoc中才能找到它。

三、获取示例代码

git clone -b v1.46.0 --depth 1 https://github.com/grpc/grpc-go
cd grpc-go/examples/route_guide

四、生成双端代码

# IMPORT_PATH 指定.proto解析import指令时在其中查找文件的目录。如果省略,则使用当前目录。--proto_path 多次传递该选项可以指定多个导入目录;他们将被按顺序搜索。
protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative routeguide/route_guide.proto
  • 客户端代码:

    route_guide.pb.go,其中包含用于填充、序列化和检索请求和响应消息类型的所有协议缓冲区代码。

  • 服务端代码:

    route_guide_grpc.pb.go,其中包含客户端使用服务中定义的方法调用的接口类型,服务器要实现的接口类型,也可以使用RouteGuide服务中定义的方法。

五、对比

  • gRPC 与 HTTP:

    gRPC 也是一组库,它们将在通用 HTTP 库通常不提供的跨平台上一致地提供更高级别的功能。此类功能的示例包括:在应用层与流控制交互、级联呼叫取消、负载平衡和故障转移等。

  • gRPC 与 REST:

    gRPC 在很大程度上遵循 HTTP2 之上的 HTTP 语义,并明确允许全双工流式传输。与典型的 REST 约定不同,在调用期间出于性能原因使用静态路径,因为从路径、查询参数和有效负载正文中解析调用参数会增加延迟和复杂性。另外,grpc还形式化了一组错误,这些错误比 HTTP 状态代码更直接适用于 API 用例。

  • protobuf 与 json:

    数据编码就是序列化,反序列化,将对象变成字节流发送给服务端,服务端将收到的字节流再转化为对象,常见的序列化,反序列化工具XML, JSON, Protobuf。 json的缺点就是非字符串的编码效率低,int类型在内存只占两个字节65535, 转化成JSON却需要五个字节,bool则需要占用四到五个字节;另一个缺点就是信息冗余,面对同一个接口同一个对象,需要重复传送相同的字段名。json在编码效率和可读性之间选择了可读性。

    protobuf选用了VarInts对数字进行编码,解决了效率问题,另一方面将字段都指定为整数编号,传输的时候只传送字段编号,解决了冗余问题,Protobuf使用.proto文件作为schema记录字段和编号的对应关系

    gRPC底层使用的HTTP/2协议,HTTP协议本身可以通过Content-Encoding表示压缩算法,使用Contetn-length指定数据长度。而gRPC重新定义了一套机制,因为gRPC支持stream rpc,流式接口。