zoukankan      html  css  js  c++  java
  • Thrift协议

    Thrift自下到上可以分为4

    Server(single-threaded, event-driven etc)

    服务器进程调度

    Processor(compiler generated)

    RPC接口处理函数分发,IDL定义接口的实现将挂接到这里面

    Protocol (JSON, compact etc)

    协议

    Transport(raw TCP, HTTP etc)

    网络传输

    Thrift实际上是实现了C/S模式,通过代码生成工具将接口定义文件生成服务器端和客户端代码(可以为不同语言),从而实现服务端和客户端跨语言的支持。用户在Thirft描述文件中声明自己的服务,这些服务经过编译后会生成相应语言的代码文件,然后用户实现服务(客户端调用服务,服务器端提服务)便可以了。其中protocol(协议层, 定义数据传输格式,可以为二进制或者XML等)和transport(传输层,定义数据传输方式,可以为TCP/IP传输,内存共享或者文件共享等)被用作运行时库。

    Thrift支持的传输及服务模型

    支持的传输格式:

    参数 描述

    TBinaryProtocol 二进制格式

    TCompactProtocol 压缩格式

    TJSONProtocol JSON格式

    TSimpleJSONProtocol 提供JSON只写协议, 生成的文件很容易通过脚本语言解析。

    TDebugProtocol 使用易懂的可读的文本格式,以便于debug

    支持的数据传输方式:

    参数 描述

    TSocket 阻塞式socker

    TFramedTransport 以frame为单位进行传输,非阻塞式服务中使用。

    TFileTransport 以文件形式进行传输。

    TMemoryTransport 将内存用于I/O. java实现时内部实际使用了简单的ByteArrayOutputStream。

    TZlibTransport 使用zlib进行压缩, 与其他传输方式联合使用。当前无java实现。

    支持的服务模型:

    参数 描述

    TSimpleServer 简单的单线程服务模型,常用于测试

    TThreadPoolServer 多线程服务模型,使用标准的阻塞式IO。

    TNonblockingServer 多线程服务模型,使用非阻塞式IO(需使用TFramedTransport数据传输方式)

     

    基本类型

    • bool: 布尔值 (true or false), one byte
    • byte:  有符号字节
    • i16:  16位有符号整型
    • i32:  32位有符号整型
    • i64:  64位有符号整型
    • double: 64位浮点型
    • string: Encoding agnostic text or binary string
    • struct结构体  thrift中struct是定义为一种对象,和面向对象语言的class差不多.,但是struct有以下一些约束: 

    struct不能继承,但是可以嵌套,不能嵌套自己。 

    1. 其成员都是有明确类型 

    2. 成员是被正整数编号过的,其中的编号使不能重复的,这个是为了在传输过程中编码使用。 

    3. 成员分割符可以是逗号(,)或是分号(;),而且可以混用,但是为了清晰期间,建议在定义中只使用一种,比如C++学习者可以就使用分号(;)。 

    4. 字段会有optional和required之分和protobuf一样,但是如果不指定则为无类型–可以不填充该值,但是在序列化传输的时候也会序列化进去, 
       optional是不填充则部序列化,required是必须填充也必须序列化

    5. 每个字段可以设置默认值 
    6. 同一文件可以定义多个struct,也可以定义在不同的文件,进行include引入。 

     Expand source
     
    • 容器(Containers

    Thrift3种可用容器类型:

      1. list(t): 元素类型为t的有序表,容许元素重复。
      2. set(t):元素类型为t的无序表,不容许元素重复。对应c++中的set,java中的HashSet,python中的set,php中没有set,则转换为list类型。
      3. map(t,t): 键类型为t,值类型为t的kv对,键不容许重复。对用c++中的map, Java的HashMap, PHP 对应 array, Python/Ruby 的dictionary。
     
     容器中元素类型可以是除了service外的任何合法Thrift类型(包括结构体和异常)。为了最大的兼容性,map的key最好是thrift的基本类型,有些语言不支持复杂类型的key,JSON协议只支持那些基本类型的key。 容器都是同构容器,不失异构容器。 
  • 相关阅读:
    【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版
    【转】 Pro Android学习笔记(三九):Fragment(4):基础小例子-续
    【转】MEAN:Nodejs+express+angularjs+mongodb搭建前端项目框架NJBlog
    handlebars中的partial
    jquery源码分析
    数据库:MySQL索引背后的数据结构及算法原理【转】
    nginx做rails项目web服务器缓存配置方法
    浏览器刷新的三种方式
    【转】火狐浏览器中firebug插件的时间线域解释
    Rails:rails链接多个数据库【转】
  • 原文地址:https://www.cnblogs.com/qingshuiqingqing/p/8721184.html
Copyright © 2011-2022 走看看