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文件分别拷贝至服务端和客户端,进行下步编码。
二、支持的数据传输格式、数据传输方式和服务模型(*为重点关注)
- 数据传输协议
TBinaryProtocol – 二进制格式.
TCompactProtocol – 压缩格式
TJSONProtocol – JSON格式(*)
TSimpleJSONProtocol –提供JSON只写协议, 生成的文件很容易通过脚本语言解析。
TDebugProtocol – 使用易懂的可读的文本格式,以便于debug
- 支持的数据传输方式
TSocket -阻塞式socker
TFramedTransport – 以frame为单位进行传输,非阻塞式服务中使用。
TFileTransport – 以文件形式进行传输。
TMemoryTransport – 将内存用于I/O. java实现时内部实际使用了简单的ByteArrayOutputStream。
TZlibTransport – 使用zlib进行压缩, 与其他传输方式联合使用。当前无java实现。
TBufferedTransport – 对某个transport对象操作的数据进行buffer,即从buffer中读取数据进行传输,或将数据直接写入到buffer
- 支持的服务模型
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. Trend.thrift.dao:spring 的dao层
- Trend.thrift.service:IDL生成的java文件
- 3. Trend.thrift.service.impl:具体的业务实现类

- 4. Thrift-service.xml:

客户端使用说明:

- 1. Trend.thrift.controller:调用接口获取接口返回的数据()
  
- 2. Trend.thrift.service: IDL生成的java文件
- 3. Thrift-client.xml:配置thrift连接池
  
- 4. Thrift.properties:目前以此方式配置,后期加入订阅广播方式实现分布式部署。
      
Thrift学习记录的更多相关文章
- Quartz 学习记录1
		原因 公司有一些批量定时任务可能需要在夜间执行,用的是quartz和spring batch两个框架.quartz是个定时任务框架,spring batch是个批处理框架. 虽然我自己的小玩意儿平时不 ... 
- Java 静态内部类与非静态内部类 学习记录.
		目的 为什么会有这篇文章呢,是因为我在学习各种框架的时候发现很多框架都用到了这些内部类的小技巧,虽然我平时写代码的时候基本不用,但是看别人代码的话至少要了解基本知识吧,另外到底内部类应该应用在哪些场合 ... 
- Apache Shiro 学习记录4
		今天看了教程的第三章...是关于授权的......和以前一样.....自己也研究了下....我觉得看那篇教程怎么说呢.....总体上是为数不多的精品教程了吧....但是有些地方确实是讲的太少了.... ... 
- UWP学习记录12-应用到应用的通信
		UWP学习记录12-应用到应用的通信 1.应用间通信 “共享”合约是用户可以在应用之间快速交换数据的一种方式. 例如,用户可能希望使用社交网络应用与其好友共享网页,或者将链接保存在笔记应用中以供日后参 ... 
- UWP学习记录11-设计和UI
		UWP学习记录11-设计和UI 1.输入和设备 通用 Windows 平台 (UWP) 中的用户交互组合了输入和输出源(例如鼠标.键盘.笔.触摸.触摸板.语音.Cortana.控制器.手势.注视等)以 ... 
- UWP学习记录10-设计和UI之控件和模式7
		UWP学习记录10-设计和UI之控件和模式7 1.导航控件 Hub,中心控件,利用它你可以将应用内容整理到不同但又相关的区域或类别中. 中心的各个区域可按首选顺序遍历,并且可用作更具体体验的起始点. ... 
- UWP学习记录9-设计和UI之控件和模式6
		UWP学习记录9-设计和UI之控件和模式6 1.图形和墨迹 InkCanvas是接收和显示墨迹笔划的控件,是新增的比较复杂的控件,这里先不深入. 而形状(Shape)则是可以显示的各种保留模式图形对象 ... 
- UWP学习记录8-设计和UI之控件和模式5
		UWP学习记录8-设计和UI之控件和模式5 1.日历.日期和时间控件 日期和时间控件提供了标准的本地化方法,可供用户在应用中查看并设置日期和时间值. 有四个日期和时间控件可供选择,选择的依据如下: 日 ... 
- UWP学习记录7-设计和UI之控件和模式4
		UWP学习记录7-设计和UI之控件和模式4 1.翻转视图 使用翻转视图浏览集合中的图像或其他项目(例如相册中的照片或产品详细信息页中的项目),一次显示一个项目. 对于触摸设备,轻扫某个项将在整个集合中 ... 
随机推荐
- [置顶] WPF数据修改demo
			今天晚上研究了下wpf,现在把代码贴出来供大家学习参考 sql语句: create table userinfos ( ContactID int primary key identity(1,1) ... 
- Quartz表达式生成器
			Java版的Quartz表达式生成器,同时适用于Quartz.net(免费下载) Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2 ... 
- CF 161D Distance in Tree【树DP】
			题目大意:给一棵树,求树上两点之间距离为K的点对数目. 方程含义: dp(i,j)表示从已经遍历过的点到当前点i,路径长度为 j 的路径条数.因此,对于当前点,每当遍历了其中一个儿子节点的时候,首先统 ... 
- 《C++游戏开发》笔记十二 战争迷雾:初步实现
			本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9475979 作者:七十一雾央 新浪微博:http:/ ... 
- linux nVidia driver 304 319 . installation by hand
			It's so painful to install nVidia driver by hand on linux. If you remove it or you want to upgrade b ... 
- 使用C#开发ActiveX控件
			使用C#开发ActiveX控件(新) 前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动 ... 
- Linux CPU affinity
			在Linux中,我们知道可以通过nice.renice命令改变进程的执行优先级,优先级高的进程优先执行,从而一定程度上保证重要任务的运行. 除了nice.renice外,可以通过CPU affini ... 
- Nodejs应用安全备忘录
			本人新博客www.wjs.photo,基于360的firekylin,感兴趣的可以看看哈 本文翻译自 www.risingstack.com ,并非逐字逐句的翻译,有错误的地方请指出,谢谢啦 应用程序 ... 
- 对 Select 的各种操作(JQuery)
			在写表单时,经常要用到select元素,这个元素相较于其他文本框标签而言有不同.最近在写一个页面表单时需要对select进行各种操作,现将其用法收集并总结如下: HTML元素: <select ... 
- 控制 Memory 和 CPU 资源的使用
			Resource Governor的出现,解决了在一台SQL Server实例上,管理多用户工作负载和资源隔离的需求,它允许管理员限制系统处理Requsts时所耗费的CPU 和 Memory资源的数量 ... 
