zoukankan      html  css  js  c++  java
  • RPC学习一--gRPC的协议

      RPC(remote procedure call 远程过程调用)框架实际是提供了一套机制,使得应用程序之间可以进行通信,而且也遵从server/client模型。使用的时候客户端调用server端提供的接口就像是调用本地的函数一样。

      既然是server/client模型,那么我们直接用restful api不是也可以满足吗,为什么还需要RPC呢?

      gRPC vs. Restful API

      RPC和restful API都提供了一套通信机制,用于server/client模型通信,而且它们都使用http作为底层的传输协议(严格地说, gRPC使用的http2.0,而restful api则不一定)。不过gRPC还是有些特有的优势,如下:

        gRPC可以通过protobuf来定义接口,从而可以有更加严格的接口约束条件。关于protobuf可以参见笔者之前的小文Google Protobuf简明教程

        另外,通过protobuf可以将数据序列化为二进制编码,这会大幅减少需要传输的数据量,从而大幅提高性能。

        gRPC可以方便地支持流式通信(理论上通过http2.0就可以使用streaming模式, 但是通常web服务的restful api似乎很少这么用,通常的流式数据应用如视频流,一般都会使用专门的协议如HLS,RTMP等,这些就不是我们通常web服务了,而是有专门的服务器应用。)

        gRPC 是一个高性能、通用的开源RPC框架,其由 Google 主要面向移动应用开发并基于HTTP/2 协议标准而设计,基于 ProtoBuf(Protocol Buffers) 序列化协议开发,且支持众多开发语言。本文作者深入研究了 gRPC 协议,对协议本身作出解构。

      gRPC 是基于 HTTP/2 协议的。

      gRPC使用protocol buffers作为接口描述语言(IDL)以及底层的信息交换格式,一般情况下推荐使用 proto3因为其能够支持更多的语言,并减少一些兼容性的问题。

       HTTP/2 是一个二进制协议,这也就意味着它的可读性几乎为 0,但幸运的是,我们还是有很多工具,譬如 Wireshark, 能够将其解析出来。

      在了解 HTTP/2 之前,需要知道一些通用术语:

        1、Stream: 一个双向流,一条连接可以有多个 streams。

        2、Message: 也就是逻辑上面的 request,response。

        3、Frame::数据传输的最小单位。每个 Frame 都属于一个特定的 stream 或者整个连接。一个 message 可能有多个 frame 组成。

           Frame 是 HTTP/2 里面最小的数据传输单位,一个 Frame 定义如下(直接从官网 copy 的):

            

        4、Flag 和 R:保留位,可以先不管。

        5、Stream Identifier:标识所属的 stream,如果为 0,则表示这个 frame 属于整条连接。

        6、Frame Payload:根据不同 Type 有不同的格式。Frame 的格式定义还是非常的简单,按照官方协议,可以非常方便的写一个出来。

        7、Multiplexing,HTTP/2 通过 stream 支持了连接的多路复用,提高了连接的利用率。Stream 有很多重要特性:

          1、一条连接可以包含多个 streams,多个 streams 发送的数据互相不影响。

          2、Stream 可以被 client 和 server 单方面或者共享使用。

          3、Stream 可以被任意一段关闭。

          4、Stream 会确定好发送 frame 的顺序,另一端会按照接受到的顺序来处理。

          5、Stream 用一个唯一 ID 来标识。

            1、Stream ID,如果是 client 创建的 stream,ID 就是奇数,如果是 server 创建的,ID 就是偶数。ID 0x00 和 0x01 都有特定的使用场景。

            2、Stream ID 不可能被重复使用,如果一条连接上面 ID 分配完了,client 会新建一条连接。而 server 则会给 client 发送一个 GOAWAY frame 强制让 client 新建一条连接。

      参考:深入了解gRPC

      相比较而言,Protobuf有如下优点:

    • 足够简单
    • 序列化后体积很小:消息大小只需要XML的1/10 ~ 1/3
    • 解析速度快:解析速度比XML快20 ~ 100倍
    • 多语言支持
    • 更好的兼容性,Protobuf设计的一个原则就是要能够很好的支持向下或向上兼容
  • 相关阅读:
    Cannot execute statement: impossible to write to binary log since BINLOG_FORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging. InnoDB is limited to row-logging
    KDiff3使用指南
    Win10解决修改host没有权限问题(其他文件同理) 一步都不能少哦:先添加再授权
    微信小程序
    MyBatisSystemException 【exception】
    [LeetCode] Additive Number 加法数
    [CareerCup] 14.5 Object Reflection 对象反射
    C Memory Layout C语言中的内存布局
    strtol 函数用法
    [CareerCup] 14.4 Templates Java模板
  • 原文地址:https://www.cnblogs.com/hofmann/p/12973204.html
Copyright © 2011-2022 走看看