protobuf和grpc实战

267 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情 >>

GRPC

是一个高性能、开源和通用的 RPC 框架,基于ProtoBuf(Protocol Buffers) 序列化协议开发,且支持众多开发语言。

面向服务端和移动端,基于 HTTP/2 设计,带来诸如双向流、流控、头部压缩、单 TCP 连接上的多复用请求等特。

protobuf

即 Protocol Buffers,是一种轻便高效的结构化数据存储格式,与语言、平台无关,可扩展可序列化,类似于XML。主流版本是pb3

gRPC 默认使用 protocol buffers,这是 Google 开源的一套成熟的结构数据序列化机制

protobuf的准备:

  1. brew install autoconf automake libtool
  2. brew install protobuf//安装protoc
  3. go install google.golang.org/protobuf/cmd/protoc-gen-go@latest // golang protobuf 库

小demo尝试对比一下Protocol和json的压缩率:

教程,可以得出结论:Protocol Buffer比json的压缩后的带下少一半多

命令:

  1. 生成protoc --go_out=. *.proto
  2. grpc生成protoc --go-grpc_out=. *.proto

grpc的准备:

  1. go install google.golang.org/grpc/cmd/protoc-gen-go-grpc下载grpc包依赖
  2. protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative *.proto同时生成proto文件和grpc文件
  3. 建在不同的文件夹下,运行代码

grpc的流模式:

  1. 简单RPC:客户端发起一次请求,服务端响应一个数据。

  2. 服务器端流式RPC:这种模式是客户端发起一次请求,服务端返回一段连续的数据流。比如实时传送检测信息。

  3. 客户端流式RPC:与服务端数据流模式相反,这次是客户端源源不断的向服务端发送数据流,而在发送结束后,由服务端返回一个响应。比如物理端采集数据。

  4. 双向流式RPC:这是客户端和服务端都可以向对方发送数据流,这个时候双方的数据可以同时互相发送,也就是可以实现实时交互。比如实时通讯。

    4种方式与以下定义四种服务对应: test.proto文件: service Test{

    rpc LZX1(SayReq) returns (SayResp) {}
    rpc LZX2(SayReq) returns (stream SayResp) {}
    rpc LZX3(stream SayReq) returns (SayResp) {}
    rpc LZX4(stream SayReq) returns (stream SayResp) {}
    

    生成的test.pb.go文件:

    type TestClient interface {

    LZX1(ctx context.Context, in *SayReq, opts ...grpc.CallOption) (*SayResp, error)
    LZX2(ctx context.Context, in *SayReq, opts ...grpc.CallOption) (Test_LZX2Client, error)
    LZX3(ctx context.Context, opts ...grpc.CallOption) (Test_LZX3Client, error)
    LZX4(ctx context.Context, opts ...grpc.CallOption) (Test_LZX4Client, error)
    

    所以无流的函数,也就是第一种简单的RPC,都只是一一对应.只要有流,返回的类型都是 服务结构名_函数名Client;只要客户端是流式,传参将不包含其他参数.

负载均衡三种解决方案

构建高可用、高性能的通信服务,通常采用服务注册与发现、负载均衡和容错处理等机制实现。根据负载均衡实现所在的位置不同,通常可分为以下三种解决方案:

  • 1、集中式LB(Proxy Model)
  • 2、进程内LB(Balancing-aware Client)
  • 3、独立 LB 进程(External Load Balancing Service)

gRPC 默认使用 protocol buffers,这是 Google 开源的一套成熟的结构数据序列化机制

6种负载均衡算法

1、轮询法

2、随机法

3、源地址哈希法

4、加权轮询法

5、加权随机法

6、最小连接数法

参考

grpc和protobuf入门

gRPC负载均衡-Golang