grpc框架_初识gRPC和他的朋友们

今天刚认识gRPC和他的朋友 RPC、Protocol Buffers(昵称PB)、Netty

2e1f00e500aa720222bbf93e2f0ece78.png
gRPC的工作
gRPC和朋友们的关系
  • gRPC与 RPC: gRPC 是 RPC协会的一员,gRPC是一种支持多语言的 RPC 框架。gRPC有 server 和 stub 端,端与端需要 PB 和Netty帮忙 通信。
  • gRPC与 PB: Protocol Buffers 帮 gRPC 跑腿, *.proto 来定义RPC请求的数据结构,可以用 protoc 生成其他多种语言。 PB把 *.proto 定义的 structure 编译成 bytebuffer 在Netty 的 stream上 传来传去。
  • gRPC与 Netty:Netty 如同 交通管理局 ,建站、修路、为gRPC 的通信传输信息。
gRPC与Rest小组对比

e9c5da9779069d075bf5196f29cdaa68.png
gRPC小组优秀于REST小组
  • gRPC运行于OSI七层网络参考模型的第七层:应用层,使用HTTP/2协议,而Rest/Json机制运行于第四层:传输层,使用 TCP/IP协议。
RPC 、 gRPC、 Protocol Buffers 的官方名片

1.1 RPC 框架原理

让远程服务调用更加简单、透明
  1. RPC 框架负责屏蔽底层的传输方式(TCP 或者 UDP)、序列化方式(XML/Json/ 二进制)和通信细节。
  2. 用户可以像调用本地方法一样调用远程服务,而不需要关心服务提供者部署在哪里,以及部署形态(透明化调用)。由于本地方法通常都是同步调用,所以服务调用也应该是同步的。

e4333281744754b12137fcf53e6b3f5b.png
RPC 框架的调用原理图

1.2 普通 RPC 调用方式

  1. 同步 阻塞,通常实现类是 xxxBlockingStub(基于 proto 定义生成)。
  2. 异步 阻塞,基于 Future-Listener 机制,通常实现类是 xxxFutureStub。
  3. 异步 非阻塞,基于 Reactive 的响应式编程模式,通常实现类是 xxxStub。Reactive 风格的异步调用,相比于 Future 模式,没有任何同步阻塞点,无论是业务线程还是 gRPC 框架的线程都不会同步等待,调用异步化更彻底一些。

gRPC

gRPC 是一个高性能、开源和通用的 RPC 框架,面向服务端和移动端,基于 HTTP/2 设计。

a6bfced56eb16e36f914cd2851f309de.png
gRPC 调用示意图

2.1 gRPC 特点

  1. 语言中立,支持多种语言;
  2. 基于 IDL 文件定义服务,通过 proto3 工具生成指定语言的数据结构、服务端接口以及客户端 Stub;
  3. 通信协议基于标准的 HTTP/2 设计,支持双向流、消息头压缩、单 TCP 的多路复用、服务端推送等特性,这些特性使得 gRPC 在移动端设备上更加省电和节省网络流量;
  4. 序列化支持 PB(Protocol Buffer)和 JSON,PB 是一种语言无关的高性能序列化框架,基于 HTTP/2 + PB, 保障了 RPC 调用的高性能。

2.2 gRPC 服务调用

gRPC 的通信协议基于标准的 HTTP/2 设计,主要提供了两种 RPC 调用方式:

  1. 普通 RPC 调用方式,即请求 - 响应模式。(例如Reactive 风格异步 RPC 调用)
  2. 基于 HTTP/2.0 的 streaming 调用方式。(服务端 streaming、客户端 streaming、服务端和客户端双向 streaming)

2.3 gRPC 序列化原理

gRPC 默认使用 Protocol Buffers 作为 RPC 序列化框架,通过 Protocol Buffers 对消息进行序列化和反序列化,然后通过 Netty 的 HTTP/2,以 Stream 的方式进行数据传输。

由于存在一些特殊的处理,gRPC 并没有直接使用 Netty 提供的 Protocol Buffers Handler, 而是自己集成 Protocol Buffers 工具类进行序列化和反序列化


Protocol Buffers

常用的序列化框架

3.1 用途

  1. 当进行远程跨进程服务调用时,需要把被传输的数据结构 / 对象序列化为字节数组或者 ByteBuffer。
  2. 而当远程服务读取到 ByteBuffer 对象或者字节数组时,需要将其反序列化为原始的数据结构 / 对象。利用序列化框架可以实现上述转换工作。

3.2 优点

  1. 灵活、高效、结构化,相比于 XML 等传统的序列化工具,它更小、更快、更简单。
  2. Protocol Buffers 通过代码生成工具可以自动生成不同语言版本的源代码,可以在使用不同版本的数据结构进程间进行数据传递,实现一写多用、数据结构的前向兼容。
  3. Protocol Buffers 是一个可独立使用的序列化框架,它并不与 gRPC 框架绑定,任何需要支持多语言的 RPC 框架都可以选择使用 Protocol Buffers 作为序列化框架。

3.3 使用

  1. IDL 文件定义(*.proto), 包含数据结构定义,以及可选的服务接口定义(gRPC)
  2. 各种语言的代码生成(含数据结构定义、以及序列化和反序列化接口)
  3. 使用 Protocol Buffers 的 API 进行序列化和反序列化
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值