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
  • 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的使用和原理_第1张图片
  • grpc 的协议支持流量控制,这里也是采用了 http2 的 flow control 机制

protobuf

  • message编码成二进制消息体时字段编号1-15将会占用1个字节,16-2047将占用两个字节
    • 所以在一些频繁使用用的message中,你应该总是先使用前面1-15字段编号
  • .proto文件中的注释和C,C++的注释风格相同,使用/// ... /
  • 如果添加了新字段,任何由旧版消息格式生成的代码所序列化的消息,仍能被依据新消息格式生成的代码所解析
  • 类似的,新代码创建的消息也能由旧版代码解析:旧版消息(二进制)在解析时简单地忽略了新增的字段
    RPC的使用和原理_第2张图片

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的使用和原理_第3张图片

参考

  • 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的使用和原理_第4张图片

grpc通信过程

RPC的使用和原理_第5张图片

你可能感兴趣的:(分布式)