zoukankan      html  css  js  c++  java
  • thrift学习

    概念

    http://thrift.apache.org/docs/concepts

     +-------------------------------------------+
      | Server                                    |
      | (single-threaded, event-driven etc)       |
      +-------------------------------------------+
      | Processor                                 |
      | (compiler generated)                      |
      +-------------------------------------------+
      | Protocol                                  |
      | (JSON, compact etc)                       |
      +-------------------------------------------+
      | Transport                                 |
      | (raw TCP, HTTP etc)                       |
      +-------------------------------------------+
    Thrift是FaceBOOK在2009年开源的序列化/RPC框架,主要包括四个组件:protocol,transport, processor和server,
    其中protocol定义消息序列化方式,
    transport定义客户端和服务端通信方式,如http或socket等,
    processor是用户实现的消息处理器,执行业务逻辑处理,
    server是组装这些组件:从transport接受序列化消息,根据protocol协议反序列化,调用用户定义的消息处理器,并将消息处理器返回结果序列化,然后写回transport响应客户端。



    • 协议

         Thrift可以让你选择客户端与服务端之间传输通信协议的类别,在传输协议上总体上划分为文本(text)和二进制(binary)传输协议, 为节约带宽,提供传输效率,一般情况下使用二进制类型的传输协议为多数,但有时会还是会使用基于文本类型的协议,这需要根据项目/产品中的实际需求:
        1、TBinaryProtocol – 二进制编码格式进行数据传输。
        2、TCompactProtocol – 这种协议非常有效的,使用Variable-Length Quantity (VLQ) 编码对数据进行压缩。
        3、TJSONProtocol – 使用JSON的数据编码协议进行数据传输。
        4、TSimpleJSONProtocol – 这种节约只提供JSON只写的协议,适用于通过脚本语言解析
        5、TDebugProtocol – 在开发的过程中帮助开发人员调试用的,以文本的形式展现方便阅读。

    • 传输层

        1、TSocket- 使用堵塞式I/O进行传输,也是最常见的模式。
        2、TFramedTransport- 使用非阻塞方式,按块的大小,进行传输,类似于Java中的NIO。
        3、TFileTransport- 顾名思义按照文件的方式进程传输,虽然这种方式不提供Java的实现,但是实现起来非常简单。
        4、TMemoryTransport- 使用内存I/O,就好比Java中的ByteArrayOutputStream实现。

        5、TZlibTransport- 使用执行zlib压缩,不提供Java的实现。

    通信模型

    • 阻塞服务

           TSimpleServer

           TThreadPoolServer

    • 非阻塞服务模型

          TNonblockingServer

          THsHaServer

          TThreadedSelectorServer


    Transport层提供了一个简单的网络读写抽象层。这使得thrift底层的transport从系统其它部分(如:序列化/反序列化)解耦。

    Protocol抽象层定义了一种将内存中数据结构映射成可传输格式的机制。换句话说,Protocol定义了datatype怎样使用底层的Transport对自己进行编解码。因此,Protocol的实现要给出编码机制并负责对数据进行序列化。

    Processor封装了从输入数据流中读数据和向数据数据流中写数据的操作。读写数据流用Protocol对象表示。Processor的结构体非常简单:

    代码块
    interface TProcessor {

    bool process(TProtocol in, TProtocol out) throws TException

    }


    与服务相关的processor实现由编译器产生。Processor主要工作流程如下:从连接中读取数据(使用输入protocol),将处理授权给handler(由用户实现),最后将结果写到连接上(使用输出protocol)。

    Server将以上所有特性集成在一起:
    (1) 创建一个transport对象
    (2) 为transport对象创建输入输出protocol
    (3) 基于输入输出protocol创建processor
    (4) 等待连接请求并将之交给processor处理


    ref

    https://qinzhaokun.github.io/2017/09/12/Thrift%E9%80%9A%E4%BF%A1%E6%A8%A1%E5%9E%8B/

    https://www.cnblogs.com/exceptioneye/p/4945073.html

    https://blog.csdn.net/houjixin/article/details/42778335

  • 相关阅读:
    针对 jQuery Gridly 控件显示多少列的问题。
    网上找的几款拖拽插件
    商品价格加价区间的实现(策略模式)
    【C#】GC和析构函数(Finalize 方法)
    C#微信开发之旅(一):前言
    Opserver配置Redis、SqlServer监控
    线程安全的方式引发事件
    使用SSL的IIS下WCF配置(CSDN手动迁移)
    由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作--解决方法(CSDN手动迁移)
    EF Code First(The model backing the '***' context has changed since the database was created.解决方法)(CSDN手动迁移)
  • 原文地址:https://www.cnblogs.com/huilei/p/10762355.html
Copyright © 2011-2022 走看看