gRPC
介绍
- gRPC 是一个高性能、开源、通用的RPC框架。
- 基于 HTTP 2.0 开发,支持双向流、消息头压缩、单 TCP 的多路复用等特性。
- 支持多语言,默认采用 Protocol Buffers 数据序列化协议。
- gRPC 开发的核心在于编写
*.proto
文件,它定义了 gRPC 的服务和消息,根据这个文件可以生成多语言的标准代码(所以只需要传送*.proto
文件,就可以生成多语言支持的代码)。
调用流程
gRPC的整体流程如下:
- 客户端通过 Protocol Buffers 协议序列化发送请求到服务端。
- 服务器收到请求后将请求内容反序列化,本地调用函数并返回结果。
- 服务端将结果通过 Protocol Buffers 协议序列化后,回送响应。
- 客户端反序列化请求内容,得到远程调用结果。
流的支持
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 中的数组或者切片)。
- Message 字段修饰符:
- 字段标识:消息的定义中,每个字段都有一个唯一的数值标签。
- 常用数据类型:double、float、int32、int64、bool、string、bytes。
- Service:在 Service 中可以定义一个 RPC 服务接口。
例子
在定义 ProtoBuf 文件时需要注意:
- 版本号
syntax
,默认是 proto2,需要使用 proto3 则要说明。 - 包名
package
,可选的,用来防止不同的消息类型有命名冲突。 - 定义的服务
service
- 消息格式
message
1 | syntax = "proto3"; |