RPC的使用和原理

使用 grpc

  • 安装
# 安装grpc go get -u google.golang.org/grpc# 安装protobuf wget https://github.com/google/protobuf/releases/download/v3.5.1/protobuf-all-3.5.1.zip unzip protobuf-all-3.5.1.zip cd protobuf-3.5.1/ ./configure make make install # 检查是否安装成功 protoc --version# 安装go protoc plugin go get -u github.com/golang/protobuf/protoc-gen-go

  • 【RPC的使用和原理】grpc是一个高性能、开源的通用RPC框架,具有以下特性:
    • 强大的IDL,使用Protocol Buffers作为数据交换的格式,支持v2、v3(推荐v3)
    • 跨语言、跨平台,也就是Grpc支持多种平台和语言
    • 支持HTTP2,双向传输、多路复用、认证等
  • gRPC 的服务接口实现类的调用并不是通过动态代理和反射机制,而是通过 protoc 工具生成代码
    • 在服务端启动时,将服务接口实现类实例注册到 gRPC 内部的服务注册中心上
    • 请求消息接入之后,可以根据服务名和方法名,直接调用启动时注册的服务实例,而不需要通过反射的方式进行调用,性能更优
  • 除了simple PRC模式,grpc也支持streaming模式
    • 包括client_to_server_streaming、server_to_client_streaming、bidirectional_streaming三种类型
      • 就是说同时支持单边流和双向流
    • 对于 streaming 模式,可以充分利用 HTTP/2.0 协议的多路复用功能,实现在一条 HTTP 链路上并行双向传输数据,有效的解决了 HTTP/1.X 的数据单向传输问题,在大幅减少 HTTP 连接的情况下,充分利用单条链路的性能,可以媲美传统的 RPC 私有长连接协议
      RPC的使用和原理
      文章图片
  • grpc 的协议支持流量控制,这里也是采用了 http2 的 flow control 机制
protobuf
  • message编码成二进制消息体时字段编号1-15将会占用1个字节,16-2047将占用两个字节
    • 所以在一些频繁使用用的message中,你应该总是先使用前面1-15字段编号
  • .proto文件中的注释和C,C++的注释风格相同,使用/// ... /
  • 如果添加了新字段,任何由旧版消息格式生成的代码所序列化的消息,仍能被依据新消息格式生成的代码所解析
  • 类似的,新代码创建的消息也能由旧版代码解析:旧版消息(二进制)在解析时简单地忽略了新增的字段
    RPC的使用和原理
    文章图片
grpc-gateway
  • grpc-gateway读取gRPC服务定义,并生成一个反向代理服务器,将 RESTful JSON API转换为gRPC
  • 假定希望用Rpc作为内部API的通讯,同时也想对外提供Restful Api,又不想写两套,于是可以使用Grpc Gateway
    • gRPC 的协议是基于 HTTP/2 的,因此应用程序能够在单个 TCP 端口上提供 HTTP 和 RPC 接口服务(两种不同的流量)
  • 对于HTTP流量,必须使用TLS加密,即必须采取https的形式
    • 因为 net/http2 仅支持 “h2” 标识,而 “h2” 标识 HTTP/2 必须使用传输层安全性(TLS)的协议
      RPC的使用和原理
      文章图片
参考
  • https://zhuanlan.zhihu.com/p/82604466
  • https://eddycjy.com/posts/go/talk/2019-06-29-talking-grpc/
thrift ///TODO
原理
  • RPC 框架负责屏蔽底层的传输方式(TCP 或者 UDP)、序列化方式(XML/Json/ 二进制)和通信细节
    • 服务调用者可以像调用本地接口一样调用远程的服务提供者,而不需要关心底层通信细节和调用过程
      RPC的使用和原理
      文章图片
grpc通信过程 RPC的使用和原理
文章图片

    推荐阅读