Thrift 教程 开发 笔记 原理 资料 使用 范例 示例 应用

  在这里汇总一下:thrift版本差异和源码及jar包下载。文档,示例(脚本、代码、),白皮书,常见问题。

  有很内容是重复的,给位看官自行过滤。

  英文资料

  API

  使用介绍

  原理简介(推荐阅读) 和 简单范例

  IBM developerWorks 详细教程以及很多资料(可惜版本是0.6.0的,推荐观看)

  thrift的wiki(优缺点)

  0.8下载

  各版本SVN http://svn.apache.org/repos/asf/thrift/tags/


 

Thrift是个啥东东?

 

来自wiki.apache.org/thrift/FrontPage的定义

 

Thrift is a software framework for scalable cross-language services development. 

 

Thrift是为了实现跨语言服务访问的一个框架

 

Thrift allows you to define data types and service interfaces in a simple definition file.

 

Thrift定义了数据和服务的描述方式,是一种IDL

 

Taking that file as input, the compiler generates code to be used to easily build RPC clients and servers that communicate seamlessly across programming languages.

 

写一个定义文件,就可以使用thrift来生成某种语言RPC客户端和服务端程序框架。你只需要考虑如何实现你的服务就可以了。并且它支持很多种语言。

 

这有点像web service, 定义好一个web service服务描述文件后,可以使用如axis等工具生成服务器端或客户端的框架程序。

 

为什么还需要Thrift

 

thrift-20070401.pdf中有解释。

 

1、多语言开发的需要

 

比如其中提到的搜索服务,LAMP本身没有这个功能,开发者可能使用C++开发,php如何访问这个服务呢?于是需要有一种高效的跨语言访问的方法。

 

2、性能问题

 

web service也可以实现多语言互访问的功能,但xml文件太大,性能不行。Thrift可以使用二进值的格式。


安装部署

Apache Thrift 的官方网站为:http://thrift.apache.org/,具体安装步骤如下:

  1. 下载 thrift 源文件(http://svn.apache.org/repos/asf/thrift/tags/thrift-0.6.1/)
  2. 将 thrift 源文件导入 eclipse,进入 /lib/java 目录,使用 ant 编译 build.xml 获得 libthrift-0.6.1-snapshot.jar (其他版本类似)
  3. 将 libthrift-0.6.1-snapshot.jar、slf4j-api-1.5.8.jar、slf4j-log4j12-1.5.8.jar 和 log4j-1.2.14.jar 导入 eclipse 开发环境
  4. 下载 thrift 编译工具,该工具可将 thrift 脚本文件编译成 java 文件,下载地址:http://apache.etoak.com//thrift/0.6.0/thrift-0.6.1.exe
  5. 创建 Hello.thrift 脚本文件,具体代码如上一章节所述,进入 thrift-0.6.1.exe 所在目录,执行命令"thrift-0.6.1.exe -gen java x:\Hello.thrift",在当前运行盘符下,可看见 gen-java 目录,进入目录可看到生成的 Java 代码。更多 thrift 的命令内容,请参考 thrift 自带的 help 命令
  6. 编写服务端和客户端代码,完成 thrift 的安装和部署 

几个tips:

  1. 结构体不能继承
  2. 异常在service中方法抛出之前必须先定义
  3. required和optional的区别:规范的struct定义中的每个域均会使用required或者optional关键字进行标识。如果required标识的域没有赋值,thrift将给予提示。如果optional标识的域没有赋值,该域将不会被序列化传输。如果某个optional标识域有缺省值而用户没有重新赋值,则该域的值一直为缺省值。
  4. 不同于protocal buffer,thrift不支持枚举类嵌套,枚举常量必须是32位的正整数。
  5. 客户端和server端通道的选择要一致。
  6. 0.8和0.6版本的差异主要在初始化server端,构造函数变了: TServer server = new TSimpleServer(new Args(serverTransport).processor(processor).protocolFactory(new TBinaryProtocol.Factory()));
  7. 应用中发现一个问题,就是3中开始struct中字段都是required的,在C#调用java端方法时,对象未赋值,导致异常;后改为optional,正常工作。
高手分析的问题(转载):

Thrift是一个非常棒的工具,是Facebook的开源项目,目前的开发非常的活跃,由Apache管理,所以用的是Apache Software License,这非常重要,因为可以放心的对其修改并用到自己的项目中。

谈到修改Thrift,这非常重要。因为我觉得如果要严肃的使用Thrift,不可避免的要深入了解它,并几乎都要修改Thrift的代码。一个通信框架,它不可能帮你做到所有的事情,也不可能在不了解的情况下就贸然的使用。

1.Thrift 的Java Server/Client有个较为严重的bug(https://issues.apache.org/jira/browse/THRIFT-601 ),随机向thrift  sever的监听端口发些数据,可能会导致Server OutOfMemory,细细看看代码,这个bug有点土。

2.Thrift Client线程不安全,多线程下使用可能导致Server和客户端程序崩溃。Client的每次调用远程方法其实是有多次Socket写操作,因此每个线程中使用的Client要保证独立,如果多个线程混用同一个Client(其实是用同一个Socket),可能会导致传输的字节顺序混乱,使得Server OutOfMemory(参考1)

3.Thrift定义数据结构时,尽量避免用map, 或者set。在cpp下, map被对应为std::map(rb tree)和std::set,thrift生成的类不会重载”<”,因此需要手动修改生成类,否则link没法通过。较为麻烦。

4.如果Client端基于效率考虑,要缓存Socket,需要重新实现其TTransport类,以支持 Socket缓存池。当然,这个实现其实跟thrift没多大关系,算是2次开发。但一般都要这么做的吧?

5.如果Client基于效率考虑,缓存了Socket,那么thrift Server端的模式选择就较为重要了。如果使用同步的TThreadPoolServer,那么无可避免的,客户端缓存1个Socket,Server端就会有一个线程一直处于Server状态,等待peek这个Socket上的数据。这个线程就不能用于其它请求了。所以,及时清理Client端的Socket及控制Socket池的大小是非常必要的。

6.听同事说CPP Thrift Server的Epoll NonBlocking模式有效率问题。其实,并发要求不高的Server用LT模式的EPoll其实很方便的,当然,这个要自己给Thrfit Server做patch了,不过也不麻烦。开发起来也是很方便的。我想给我们的Server加个EPOLLONESHOT的同步EPoll实现。

7.CPP下的 TThreadPoolServer和TThreadServer由一个有趣的问题,如果有客户端维护长连接,那么对这个Server实例做析构的时候会堵塞(前面说过了,在peek中…)。

8.用valgrind看,thrift cpp似乎有一些内存问题。没细看。

9.无论是Java,还是CPP,Server端都无法通过合法的方式获取Client的ip, port。可以通过编写ThriftServerEventHandler可以处理这件事情。如果想要获取Client ip, port的话,可以看看这个东西。

 上面文章的作者还有两篇帖子 是 TCP通道关闭时发生了什么  和 这个

最后,我整理了一个0.8版本的包,包括了java和c#的调用示例,java源码,白皮书的中文版,一个复杂的脚本示例(wiki上下载的),所以依赖的jar包等

thrift文件.zip

若失效可以留下邮箱。

 

 

转载于:https://www.cnblogs.com/biGpython/archive/2012/02/03/2337198.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576623.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Bulk API实现批量操作

Bulk 批量操作 &#xff08;1&#xff09; 比如&#xff0c;我这里&#xff0c;在$ES_HOME里&#xff0c;新建一文件&#xff0c;命名为requests。&#xff08;这里为什么命名为request&#xff0c;去看官网就是&#xff09;在Linux里&#xff0c;有无后缀没区别。 1 2 3 4 5…

Word2Vec学习笔记(三)续

三、&#xff08;续&#xff09;Skip-gram模型介绍 Skip-gram模型并不是和CBOW模型相反的&#xff0c;它们的目的都是计算出词的向量&#xff0c;只不过在作者的论文中给出的图看样子是反的而已。Skip-gram模型是用每个当前词去预测一定范围内除当前词之外前后的词。同样的&…

三省吾身

自尊心极强&#xff0c;极其自信又极其自卑极其理性又极其感性&#xff0c;平时把自卑隐藏在自信中&#xff0c;因为自卑和感性易冲动发火脾气暴躁&#xff0c;性格非常矛盾。知己知彼。 成熟包容宽恕平和气定神闲。 每日看此&#xff0c;三省吾身。 一定要宽容&#xff0c;如果…

我的博客开通了

一直都比较关注博客园&#xff0c;也一直很想写博客&#xff0c;最近几年发现自己做了很多项目&#xff0c;但好多东西没有很多的积累下来&#xff0c;每次都要从网上搜索别人的东西&#xff0c;感觉太失败&#xff01; 从今天开始&#xff0c;我也要做一个有故事的程序员&…

ElasticSearch关于映射mapping介绍

#首先我们还是先增加几个文档 PUT /myindex/article/1 {"post_date": "2020-03-14","title": "Java","content": "java is the best language","author_id": 119 }PUT /myindex/article/2 {"post…

最优化学习笔记(五)——牛顿法(多维数据)

在最优化学习系列中&#xff0c;第一次就说的是牛顿法&#xff0c;但是那是在一维搜索上的&#xff0c;它其实就是将函数f在x处利用泰勒公式展开&#xff0c;得到它的近似函数&#xff0c;进而求解最小值。本节内容主要说明牛顿法在多维数据上的迭代公式。最优化学习笔记中讲到…

ElasticSearch的Object数据类型

上一篇mapping文章我们知道数字类型和日期类型要精确查找&#xff0c;以及mapping的两个重要的作用。 所以创建索引的时候,是不是可以预先定义字段的类型以及相关属性&#xff0c;这样就能够把日期字段处理成日期&#xff0c;把数字字段处理成数字&#xff0c;把字符串字段处理…

Word2Vec学习笔记(四)——Negative Sampling 模型

前面讲了Hierarchical softmax 模型&#xff0c;现在来说说Negative Sampling 模型的CBOW和Skip-gram的原理。它相对于Hierarchical softmax 模型来说&#xff0c;不再采用huffman树&#xff0c;这样可以大幅提高性能。 一、Negative Sampling 在负采样中&#xff0c;对于给定…

ElasticSearch手动创建mapping

前面也提到过关于手动创建mapping&#xff0c;接着上一篇关于object类型存储以及mapping的介绍&#xff0c;我们接下来就介绍下如何手动创建mapping #手动创建mapping PUT /lib6 {"settings":{"number_of_shards" : 3,"number_of_replicas" : 0…

Array.prototype.slice.call

Array.prototype.slice.call(arguments,0)就类似于arguments.slice(0)&#xff0c;但因为arguments不是真正的Array&#xff0c;所以它没有slice这个方法.能用slice方法的&#xff0c;只要有length属性就行。虽然arguments有length属性&#xff0c;但是没有slice方法&#xff0…

Word2Vec学习笔记(五)——Negative Sampling 模型(续)

本来这部分内容不多&#xff0c;是想写在negative sampling 中和cbow一起的&#xff0c;但是写了后不小心按了删除键&#xff0c;浏览器直接回退&#xff0c;找不到了&#xff0c;所以重新写新的&#xff0c;以免出现上述情况 (接上) 三、Negative Sampling 模型——Skip-gra…

ElasticSearch基本查询一(英文分词)

废话不多说首先准备数据&#xff0c;我们先添加几个文档 PUT /lib3/user/1 { "name" : "zhaoliu","address" :"hei long jiang sheng tie ling shi","age" : 50,"birthday" : "1970-12-12","inte…

HDU1071_数学几何

题目大意&#xff1a; 给你三个点p1,p2,p3,p1是最高点&#xff0c;然后算出面积。 解题思路&#xff1a; 我的解题思路有点水&#xff0c;就是直接求抛物线系数&#xff0c;直线系数&#xff0c;最后求积分搞定e.尽量少用中间变量吧。代码有点丑。虽然这道题目是1a&#xff0c;…

机器学习笔记(十一)——逻辑回归

一、引言 虽然说是逻辑回归&#xff0c;其实既可以用它做回归&#xff0c;也可以用它做分类。一般我们从最简单的二分类问题开始了解他&#xff0c;当然也可以做多分类。 二、Logistic Regression 的一般步骤 找一个合适的假设构造损失函数让损失函数最小&#xff0c;求出对应…

ElasticSearch vs. Solr

为何日志服务商Loggly选择ElasticSearch而非Solr. 原文链接: http://loggly.wpengine.com/bl... 在Gen2产品的早期阶段, 我们事实上是失败的, 这促使我们重新审视我们现有的技术栈. 我们仔细分析系统中的每个独立的组件,并记录下来, 当然其中也包括构成我们核心功能的搜索引擎技…

android 工程结构,它到底是怎么运行的。

为了帮助理解&#xff0c;我决定先上传一个工程截图&#xff0c;这个是我做的一个小作业&#xff0c;3、4个小时完成&#xff0c;没什么含金量&#xff0c;就是交差用的&#xff0c;这里给大家做个模板吧。 我把一个工程分6个部分&#xff0c;如左面的图所示&#xff0c;然后…

为什么ElasticSearch应用开发者需要了解cluster state

原文链接: https://www.loggly.com/blog/p... 在前面的文章(ES vs Solr)中我们提到, ES构建了Loggly的很多核心功能. 在把这项通用搜索技术用于我们的日志管理系统, 并为超过5000多客户提供准实时服务的过程中, 我们在技术上成长颇多. 按照我们对开源社区的尊重, 在此希望能把我…

给 MySQL 增加 Sequence 管理功能

-- Sequence 管理表 DROP TABLE IF EXISTS sequence; CREATE TABLE sequence ( name VARCHAR(50) NOT NULL, current_value INT NOT NULL, increment INT NOT NULL DEFAULT 1, PRIMARY KEY (name) ) ENGINEInnoDB; -- 取当前值的函数 DROP FUNCTION IF EXISTS currval; DE…

最优化学习笔记(六)——牛顿法性质分析

一、牛顿法存在的问题 在单变量的情况下&#xff0c;如果函数的二阶导数f′′<0&#xff0c;牛顿法就无法收敛到极小点。类似的&#xff0c;在多变量的情况下&#xff0c;目标函数的hessian矩阵F(x(k))非正定&#xff0c;牛顿法的搜索方向并不一定是目标函数值的下降方向。甚…

从FLC中学习的设计模式系列-创建型模式(3)-工厂方法

工厂方法是一组方法&#xff0c; 他们针对不同条件返回不同的类实例&#xff0c;这些类一般有共同的父类。 工厂方法模式 来自&#xff1a; http://zh.wikipedia.org/wiki/工厂方法模式 工厂方法模式 是一种面向对象的设计模式。通过调用不同的方法返回需要的类&#xff0c;而不…