zoukankan      html  css  js  c++  java
  • Thrift学习记录

    Thrift学习记录

    Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在C++,Java,Python,PHP,Ruby,Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml等等编程语言间无缝结合的、高效的服务。

    Thrift服务开发的三个步奏:(如下图)

    编写Thrift IDL,运行thrift命令生成相应的服务代码。

    服务端编码(需要thrift生成的服务代码)。

    客户端编码(需要thrift生成的服务代码)

     

    一、编写Thrift IDL:

    在*.thrift文件中,有以下基本类型。

    基本类型:

           bool:布尔值,true 或 false,对应 Java 的 boolean

           byte:8 位有符号整数,对应 Java 的 byte

           i16:16 位有符号整数,对应 Java 的 short

           i32:32 位有符号整数,对应 Java 的 int

           i64:64 位有符号整数,对应 Java 的 long

           double:64 位浮点数,对应 Java 的 double

           string:utf-8编码的字符串,对应 Java 的 String

    结构体类型:

    struct:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是 一个 JavaBean

    容器类型:

           list:对应 Java 的 ArrayList

           set:对应 Java 的 HashSet

           map:对应 Java 的 HashMap

    异常类型: 

    exception:对应 Java 的 Exception

    服务类型:

    service:对应服务的类

    实例:

    环境搭建:下载JDK,并且配置环境变量。(JDK在ghost的系统里已经配置好)

    下载:thrift-0.9.2.exe

    生成服务代码命令:将*.thrift文件和thrift-0.9.2.exe放在同一目录下

    使用cmd进入该目录下:

    thrift-0.9.2.exe -r -gen java ./thriftTest.thrift

     

    将生成的java文件分别拷贝至服务端和客户端,进行下步编码。

    二、支持的数据传输格式、数据传输方式和服务模型(*为重点关注)

    1. 数据传输协议

    TBinaryProtocol – 二进制格式.

    TCompactProtocol – 压缩格式

    TJSONProtocol – JSON格式(*)

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

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

    1. 支持的数据传输方式

    TSocket -阻塞式socker

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

    TFileTransport – 以文件形式进行传输。

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

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

    TBufferedTransport – 对某个transport对象操作的数据进行buffer,即从buffer中读取数据进行传输,或将数据直接写入到buffer

    1. 支持的服务模型

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

    TThreadedServer – 多线程服务模型使用标准的阻塞式IO,每个请求创建一个线程

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

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

    三、服务端编码

    实现服务处理接口impl(工作量大在接口impl类的业务实现编写)

    创建TProcessor(协议层与用户实现的服务代码的纽带)

    创建TServerTransport(数据传输方式)

    创建TProtocol(数据传输协议)

    创建TServer(服务模型)

    启动Server

    实例:

    TProcessor tprocessor = new HelloWorldService.Processor<HelloWorldService.Iface>(new HelloWorldImpl());

    // 简单的单线程服务模型,一般用于测试 ()

    TServerSocket serverTransport = new TServerSocket(SERVER_PORT);

    TServer.Args tArgs = new TServer.Args(serverTransport);

    tArgs.processor(tprocessor);

    tArgs.protocolFactory(new TBinaryProtocol.Factory());

    // tArgs.protocolFactory(new TCompactProtocol.Factory()); //

    // tArgs.protocolFactory(new TJSONProtocol.Factory());

    TServer server = new TSimpleServer(tArgs);

    server.serve();

    四、客户端编码

    创建Transport(数据传输方式)

    创建TProtocol(数据传输协议)

    基于TTransport和TProtocol创建 Client

    调用Client的相应方法

    实例:

    TTransport transport = null;

    try {

        transport = new TSocket(SERVER_IP, SERVER_PORT, TIMEOUT);

        // 协议要和服务端一致

        TProtocol protocol = new TBinaryProtocol(transport);

        // TProtocol protocol = new TCompactProtocol(transport);

        // TProtocol protocol = new TJSONProtocol(transport);

        HelloWorldService.Client client = new HelloWorldService.Client(protocol);

    transport.open();

    String result = client.XXXX ();

    }

    实际开发过程:Spring+Thrift

    服务器端使用说明

     

    1. 1.     Trend.thrift.dao:spring 的dao层
    2. Trend.thrift.service:IDL生成的java文件
    3. 3.     Trend.thrift.service.impl:具体的业务实现类

     

    1. 4.     Thrift-service.xml

     

    客户端使用说明:

     

    1. 1.     Trend.thrift.controller:调用接口获取接口返回的数据()

       

    1. 2.     Trend.thrift.service: IDL生成的java文件
    2. 3.     Thrift-client.xml:配置thrift连接池

       

    1. 4.     Thrift.properties:目前以此方式配置,后期加入订阅广播方式实现分布式部署。

           

  • 相关阅读:
    Django 1.6 最佳实践: 如何设置和使用 Log(转)
    Django Signals 从实践到源码分析(转)
    Django 1.6 最佳实践: 如何正确使用 Signal(转)
    Django 1.6 最佳实践: django项目的服务器自动化部署(转)
    Django中如何使用django-celery完成异步任务1(转)
    Django中如何使用django-celery完成异步任务2(转)
    干货 | 精选《SQL注入、渗透、反病毒》学习总结集锦给你们~
    Kali Linux来袭~老司机带你进击
    CTF中密码学一些基础【三】
    DC010的精华分享【首发速看】
  • 原文地址:https://www.cnblogs.com/libaoting/p/thrift.html
Copyright © 2011-2022 走看看