thrift使用小记
Thrift中的几个概念:
Server 服务模型
Handler 数据处理接口
Processor 数据处理对象
Protocol 数据传输协议
Transport 数据传输方式

TBinaryProtocol – 二进制格式.
TCompactProtocol – 压缩格式
TJSONProtocol – JSON格式
TSimpleJSONProtocol –提供JSON只写协议, 生成的文件很容易通过脚本语言解析。
TDebugProtocol – 使用易懂的可读的文本格式,以便于debug
(2) 支持的数据传输方式
TFileTransport:文件(日志)传输类,允许client将文件传给server,允许server将收到的数据写到文件中。
THttpTransport:采用Http传输协议进行数据传输
TSocket:采用TCP Socket进行数据传输
TZlibTransport:压缩后对数据进行传输,或者将收到的数据解压
下面几个类主要是对上面几个类地装饰(采用了装饰模式),以提高传输效率。
TBufferedTransport:对某个Transport对象操作的数据进行buffer,即从buffer中读取数据进行传输,或者将数据直接写入buffer
TFramedTransport:以frame为单位进行传输,非阻塞式服务中使用。同TBufferedTransport类似,也会对相关数据进行buffer,同时,它支持定长数据发送和接收。
TMemoryBuffer:从一个缓冲区中读写数据
TSimpleServer – 简单的单线程服务模型,常用于测试
TThreadedServer - 多线程服务模型,使用阻塞式IO,每个请求创建一个线程。
TThreadPoolServer – 线程池服务模型,使用标准的阻塞式IO,预先创建一组线程处理请求。
TNonblockingServer – 多线程服务模型,使用非阻塞式IO(需使用TFramedTransport数据传输方式)
thrift的C++编译器使用了boost中的shared_ptr,如果需要配合c++使用的话,需要先安装boost。
如果要使用NonBlockingServer的话,需要安装libevent。
1. 创建Handler
2. 基于Handler创建Processor
3. 创建Transport
4. 创建Protocol方式
5. 基于Processor, Transport和Protocol创建Server
6. 运行Server
1. 创建Transport
2. 创建Protocol方式
3. 基于Transport和Protocol创建Client
4. 运行Client的方法
3. 默认TServerSocket和TSocket都设置了NoDelay为1,使得报文尽快发送出去,如果客户端和服务器间传输数据量较大,通过可以设置NoDelay为0来开启Nagel算法,缓存一段数据后再进行发送,减少报文数量。
TSocket默认开启了Linger,并设置linger time为0,这样close会丢弃socket发送缓冲区中的数据,并向对端发送一个RST报文,close不会被阻塞,立即返回。
TServerSocket默认关闭了Linger,close不会被阻塞,立即返回。
4. fb303作为handler的基类,里面预置了一些rpc方法,用于监控,包括系统状态,请求次数等状态信息。
thrift文件中需要include "fb303.thrift"这样来将service导入目标thrift文件中。thrift编译后的代码只需要相应的Handler多重继承facebook::fb303::FacebookBase就好了。
- class scribeHandler : virtual public scribe::thrift::scribeIf,
- public facebook::fb303::FacebookBase {
可以参考thrift-0.7.0/contrib/zeromq中的代码。【未进行测试】
https://issues.apache.org/jira/browse/THRIFT-812
6. thrift支持完全async,生成代码的时候需要使用
thrift --gen cpp:cob_style xxx.thrift
这样的话,生成的代码需要TEventServer.h,但是async目录下没有,只有TEvhttpServer.h
https://github.com/klickverbot/thrift/commit/5ddabb8e3f63a15874e436c9a650dc17f7dd7028#diff-2
http://dongxicheng.org/search-engine/thrift-framework-intro/
http://dongxicheng.org/search-engine/thrift-guide/
http://dongxicheng.org/search-engine/thrift-rpc/
阅读(627) | 评论(1) | 转发(0) |
-->
thrift使用小记的更多相关文章
- 和 Thrift 的一场美丽邂逅
一. 与 Thrift 的初识 也许大多数人接触 Thrift 是从序列化开始的.每次搜索 “java序列化” + “方式”.“对比” 或 “性能” 等关键字时,搜索引擎总是会返回一大堆有关各种序列化 ...
- [原]Paste.deploy 与 WSGI, keystone 小记
Paste.deploy 与 WSGI, keystone 小记 名词解释: Paste.deploy 是一个WSGI工具包,用于更方便的管理WSGI应用, 可以通过配置文件,将WSGI应用加载起来. ...
- Apache thrift RPC 双向通信
在上一篇介绍Apache thrift 安装和使用,写了一个简单的demo,讲解thrift服务的发布和客户端调用,但只是单向的客户端发送消息,服务端接收消息.而客户端却得不到服务器的响应. 在不涉及 ...
- common-pool2 学习:thrift连接池的另一种实现
对象池是一种很实用的技术,经典的例子就是数据库连接池.去年曾经从零开始写过一个thrift客户端连接池.如果不想重造轮子,可以直接在apache开源项目commons-pool的基础上开发. 步骤: ...
- thrift:swift项目笔记
先声明:此swift不是Apple公司的那个swift开发语言,而是facebook的另一个开源项目. facebook的thrift IDL文件,如果默认用thrift -gen java生成jav ...
- dubbo/dubbox 增加原生thrift及avro支持
(facebook) thrift / (hadoop) avro / (google) probuf(grpc)是近几年来比较抢眼的高效序列化/rpc框架,dubbo框架虽然有thrift的支持,但 ...
- MySql 小记
MySql 简单 小记 以备查看 1.sql概述 1.什么是sql? 2.sql发展过程? 3.sql标准与方言的关系? 4.常用数据库? 5.MySql数据库安装? 2.关键概念 表结构----- ...
- Thrift的TJsonProtocol协议分析
Thrift协议实现目前有二进制协议(TBinaryProtocol),紧凑型二进制协议(TCompactProtocol)和Json协议(TJsonProtocol). 前面的两篇文字从编码和协议原 ...
- Thrift的TBinaryProtocol二进制协议分析
先上张图,说明一下thrift的二进制协议是什么东东. 报文格式编码: bool类型: 一个字节的类型,两个字节的字段编号,一个字节的值(true:1,false:0). Byte类型: 一个字节的类 ...
随机推荐
- LoadRunner几个重要的概念:事务、集合点、思考时间
在LoadRunner的脚步编写中,有三个重要的概念:事务.集合点.思考时间 事务: 事务又称为Transaction,在LoadRunner中的定义如下:An end-to-end(browser- ...
- IDEA中遇到的gradle问题:unindexed remote maven repositories found
环境公司提供的IDEA,版本为16.3. 前端环境为react.版本控制使用gradle,后端语言使用kotlin. 在项目的依赖导入过程中出现了如下问题: unindexed remote mave ...
- laravel 添加自定义类 全局自定义方法 自定义常量
添加自定义类 https://blog.csdn.net/suchfool/article/details/38758367 https://blog.csdn.net/liukai6/article ...
- 三层自动生成 完整源代码(for oracle)
using Oracle.DataAccess.Client; using System; using System.Collections.Generic; using System.Compone ...
- hihoCoder#1062(最近公共祖先一)
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho最近发现了一个神奇的网站!虽然还不够像58同城那样神奇,但这个网站仍然让小Ho乐在其中,但这是为什么呢? “为什么呢 ...
- Mybatis-Spring包学习
MyBatis-Spring包用来将MyBatis无缝整合到Spring中.使用这个类库中的类, Spring将会加载必要的MyBatis工厂类和Session类. 这个类库也提供一个简单的方式来注入 ...
- 关于jsp和html页面中的三种弹出框
代码: <!-- 引入jquery 由于在下面使用jquery选择器,与弹出框无关 --> <script type="text/javascript" src= ...
- Solaris10怎么创建flash archive
使用flarcreate命令可以创建Solaris操作系统的映像(flash archive).Flash archive相当于Solaris系统的克隆.使用flash archive可以用于安装新系 ...
- SqlServer——判断对象是否存在
对以下对象判断是否存在:database.table.proc.触发器.临时表.索引.对于这些对象的判断是通过数据表 SysObjects来获得的. 一.基础知识 1.SysObjects系统表 对于 ...
- C#封装CRUD到SqlHelper类解读
1.简单说明一下,一般情况下,数据库连接字符串是在App.config文件中进行配置,然后再在代码中进行引用.因此,我们在这里先看一下App.config文件. 首先看需要添加的内容: 参数说明: n ...