轻量级、高性能;序列化支持PB(Protocol Buffer) 和JSON,PB 是一种语言无关的高性能序列化框架。
基于标准的 HTTP2 设计,支持双向流、消息头压缩、单 TCP 的多路复用、服务端推送等特性,这些特性使得 gRPC 在移动端设备上更加省电和节省网络流量。
RPC 框架原理
RPC 框架的目标就是让远程服务调用更加简单、透明,RPC 框架负责屏蔽底层的传输方式(TCP 或者 UDP)、序列化方式(XML/Json/ 二进制)和通信细节。服务调用者可以像调用本地接口一样调用远程的服务提供者,而不需要关心底层通信细节和调用过程。
RPC 框架的调用原理图如下所示:
Grpc是一个高性能、开源的通用RPC框架
- 强大的IDL,使用Protocol Buffers作为数据交换的格式,支持v2、v3(推荐v3)
- 跨语言、跨平台,也就是Grpc支持多种平台和语言
- 基于HTTP2,双向传输、多路复用、认证等
概览
gRPC 特点
通信协议基于标准的 HTTP/2 设计,HTTP/2 是第 7 层(应用层)协议,它运行在 TCP(第 4 层 - 传输层)协议之上,相比于传统的 REST/JSON 机制有诸多的优点:支持双向流、消息头压缩、单 TCP 的多路复用、服务端推送等特性,这些特性使得 gRPC 在移动端设备上更加省电和节省网络流量;
序列化支持 PB(Protocol Buffer)和 JSON,PB 是一种语言无关的高性能序列化框架,基于 HTTP/2 + PB, 保障了 RPC 调用的高性能。
当存在跨网络边界的 RPC 调用时,往往需要通过 TLS/SSL 对传输通道进行加密,以防止请求和响应消息中的敏感数据泄漏。
- 客户端(gRPC Sub)调用 A 方法,发起 RPC 调用
- 对请求信息使用 Protobuf 进行对象序列化压缩(IDL)
- 服务端(gRPC Server)接收到请求后,解码请求体,进行业务逻辑处理并返回
- 对响应结果使用 Protobuf 进行对象序列化压缩(IDL)
- 客户端接受到服务端响应,解码请求体。回调被调用的 A 方法,唤醒正在等待响应(阻塞)的客户端调用并返回响应结果
构建和启动服务端
lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
grpcServer := grpc.NewServer()
...
pb.RegisterXXXServer(grpcServer, &XXXServer{})
grpcServer.Serve(lis)
- 监听指定 TCP 端口,用于接受客户端请求
- 创建 gRPC Server 的实例对象
- gRPC Server 内部服务和路由的注册
- Serve() 调用服务器以执行阻塞等待,直到进程被终止或被 Stop() 调用
创建客户端
var opts []grpc.DialOption
...
conn, err := grpc.Dial(*serverAddr, opts...)
if err != nil {
log.Fatalf("fail to dial: %v", err)
}
defer conn.Close()
client := pb.NewXXXClient(conn)
...
- 创建 gRPC Channel 与 gRPC Server 进行通信(需服务器地址和端口作为参数)
- 设置 DialOptions 凭证(例如,TLS,GCE凭据,JWT凭证)
- 创建 Search Client Stub
- 调用对应的服务方法