Dawn's Blogs

分享技术 记录成长

0%

go-micro基础 (1) gRPC和ProtoBuf

gRPC

介绍

  • gRPC 是一个高性能、开源、通用的RPC框架。
  • 基于 HTTP 2.0 开发,支持双向流、消息头压缩、单 TCP 的多路复用等特性。
  • 支持多语言,默认采用 Protocol Buffers 数据序列化协议。
  • gRPC 开发的核心在于编写 *.proto 文件,它定义了 gRPC 的服务和消息,根据这个文件可以生成多语言的标准代码(所以只需要传送 *.proto 文件,就可以生成多语言支持的代码)。

调用流程

gRPC的整体流程如下:

  • 客户端通过 Protocol Buffers 协议序列化发送请求到服务端。
  • 服务器收到请求后将请求内容反序列化,本地调用函数并返回结果。
  • 服务端将结果通过 Protocol Buffers 协议序列化后,回送响应。
  • 客户端反序列化请求内容,得到远程调用结果。

1663509291485

1663509425881

流的支持

gRPC 通过 HTTP 2.0 对流媒体提供支持,它支持所有的流组合:

  • 一元(没有流媒体):一个请求对象对应一个返回对象。客户端发起一次请求,服务端响应一个数据。
1
rpc SayHello(HelloRequest) returns (HelloResponse);
  • 客户端流:客户端分批发送数据给服务端,服务端响应一次性返回数据。应用场景:物联网终端向服务器报送数据。
1
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);
  • 服务端流:客户端一次请求,服务端分批次多次响应数据给客户端。应用场景举例:客户端向服务端发送一个股票代码,服务端就把该股票的实时数据源源不断的返回给客户端。
1
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);
  • 双向流媒体:分批多次请求,多次响应。应用场景:聊天应用。
1
rpc LotsOfGreetings(stream HelloRequest) returns (stream HelloResponse);

ProtoBuf

介绍

  • 是一种轻便高效的序列化数据的协议(通常用于通信和存储)。
  • 跨语言,更小、更快(序列化速度、传输速度快)、更简单。
  • ProtoBuf 是以二进制的方式存储的,体积小,但是可读性差。

Protocol Buffers 的优点(为什么):

  • 加速站点之间的数据传输速度。
  • 解决数据传输的不规范问题。

常用概念

ProtoBuf中有几个常用概念,下面是他们的定义:

  • Message:描述了一个响应或者请求的消息格式。
    • Message 字段修饰符:
      • singular:表示成员有 0 或者 1 个,一般省略不写。
      • repeated:表示该字段可以包含 0 ~ N 个元素(对应于 Go 中的数组或者切片)。
  • 字段标识:消息的定义中,每个字段都有一个唯一数值标签
  • 常用数据类型:double、float、int32、int64、bool、string、bytes。
  • Service:在 Service 中可以定义一个 RPC 服务接口。

例子

在定义 ProtoBuf 文件时需要注意:

  • 版本号 syntax,默认是 proto2,需要使用 proto3 则要说明。
  • 包名 package,可选的,用来防止不同的消息类型有命名冲突。
  • 定义的服务 service
  • 消息格式 message
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
syntax = "proto3";

package go.micro.service.product;

service Product {
rpc AddProduct(ProductInfo) returns (ResponseProduct) {}
}

message ProductInfo {
int64 id = 1;
string product_name = 2;

}

message ResponseProduct {
int64 product_id = 1;
}