轻量级、高性能;序列化支持PB(Protocol Buffer) 和JSON,PB 是一种语言无关的高性能序列化框架。

基于标准的 HTTP2 设计,支持双向流、消息头压缩、单 TCP 的多路复用、服务端推送等特性,这些特性使得 gRPC 在移动端设备上更加省电和节省网络流量。

RPC 框架原理

RPC 框架的目标就是让远程服务调用更加简单、透明,RPC 框架负责屏蔽底层的传输方式(TCP 或者 UDP)、序列化方式(XML/Json/ 二进制)和通信细节。服务调用者可以像调用本地接口一样调用远程的服务提供者,而不需要关心底层通信细节和调用过程。

RPC 框架的调用原理图如下所示:

image.png

Grpc是一个高性能、开源的通用RPC框架

  • 强大的IDL,使用Protocol Buffers作为数据交换的格式,支持v2、v3(推荐v3)
  • 跨语言、跨平台,也就是Grpc支持多种平台和语言
  • 基于HTTP2,双向传输、多路复用、认证等

概览

image.png

gRPC 特点

通信协议基于标准的 HTTP/2 设计,HTTP/2 是第 7 层(应用层)协议,它运行在 TCP(第 4 层 - 传输层)协议之上,相比于传统的 REST/JSON 机制有诸多的优点:支持双向流、消息头压缩、单 TCP 的多路复用、服务端推送等特性,这些特性使得 gRPC 在移动端设备上更加省电和节省网络流量;

序列化支持 PB(Protocol Buffer)和 JSON,PB 是一种语言无关的高性能序列化框架,基于 HTTP/2 + PB, 保障了 RPC 调用的高性能。

当存在跨网络边界的 RPC 调用时,往往需要通过 TLS/SSL 对传输通道进行加密,以防止请求和响应消息中的敏感数据泄漏。

  1. 客户端(gRPC Sub)调用 A 方法,发起 RPC 调用
  2. 对请求信息使用 Protobuf 进行对象序列化压缩(IDL)
  3. 服务端(gRPC Server)接收到请求后,解码请求体,进行业务逻辑处理并返回
  4. 对响应结果使用 Protobuf 进行对象序列化压缩(IDL)
  5. 客户端接受到服务端响应,解码请求体。回调被调用的 A 方法,唤醒正在等待响应(阻塞)的客户端调用并返回响应结果

构建和启动服务端

  1. lis, err := net.Listen("tcp", fmt.Sprintf(":%d", *port))
  2. if err != nil {
  3. log.Fatalf("failed to listen: %v", err)
  4. }
  5. grpcServer := grpc.NewServer()
  6. ...
  7. pb.RegisterXXXServer(grpcServer, &XXXServer{})
  8. grpcServer.Serve(lis)
  1. 监听指定 TCP 端口,用于接受客户端请求
  2. 创建 gRPC Server 的实例对象
  3. gRPC Server 内部服务和路由的注册
  4. Serve() 调用服务器以执行阻塞等待,直到进程被终止或被 Stop() 调用

创建客户端

  1. var opts []grpc.DialOption
  2. ...
  3. conn, err := grpc.Dial(*serverAddr, opts...)
  4. if err != nil {
  5. log.Fatalf("fail to dial: %v", err)
  6. }
  7. defer conn.Close()
  8. client := pb.NewXXXClient(conn)
  9. ...
  1. 创建 gRPC Channel 与 gRPC Server 进行通信(需服务器地址和端口作为参数)
  2. 设置 DialOptions 凭证(例如,TLS,GCE凭据,JWT凭证)
  3. 创建 Search Client Stub
  4. 调用对应的服务方法