`
dxm1986
  • 浏览: 436334 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【转】Apache Thrift 学习

 
阅读更多

Apache Thrift 是跨语言服务访问的框架。最早由Facebook 开发,贡献给了Apache。
通过接口定义语言(IDL),定义和创建服务,Thrift生成特定语言的可供server和client 访问的代码。
Thrfit 有着非常优秀的效率,无论是内存还是 传输效率上。

Cassandra 支持多种语言的编程接口,正式由于使用了Thrift。

架构




以上是创建server和client的stack。最上面的是IDL,然后生成Client和Processor。红色的是发送的数据。protocol和transport 是Thrift运行库的一部分。
通过Thrift 你只需要关心服务的定义,而不需要关心protocol和transport。

Thrift允许你选择 protocol ,transport和server。因为Thrift 最早是有C++开发的,Thrift在C++实现中有最大的变化。

Thrift支持 text 和 binary protocols,binary protocols要比text protocols,但是有时候 text protocols比较有用(例如:调试的时候)。支持的协议有:
TBinaryProtocol  -直接的二进制格式
TCompactProtocol  效率和高压缩编码数据
TDenseProtocoal  和TCompactProtocol相似,但是省略了meta信息,从哪里发送的,增加了receiver。还在实验中,java实现还不可用。
TJSONProtocoal 使用JSON
TSImpleJSONProtocoal  只写的protocol使用JSON。适合被脚本语言转化
TDebugProtocoal  使用人类可读的text 格式 帮助调试

上面的protocol 说明了 什么被传送,Thrift  transports 说明了怎样传送。支持的transport:
TSocket  使用 blocking socket I/O
TFramedTransport   以帧的形式发送,每帧前面是一个长度。要求服务器来non-blocking server
TFileTransport   写到文件。没有包括在java实现中。
TMemoryTransport   使用内存 I/O 。java实现中在内部使用了ByteArrayOutputStream
TZlibTransport 压缩 使用zlib。在java实现中还不可用

最后,thrift 提供了servers:
TSimpleServer  单线程 server,使用标准的blocking IO。用于测试
TThreadPoolServer  多线程  使用标准的blocking IO
TNonblockingServer  多线程  使用 non-blocking IO (java实现中使用了NIO channels)。TFramedTransport必须使用在这个服务器。

一个server只允许定义一个接口服务。这样的话多个接口需要多个server。这样会带来资源的浪费。同意通过继承接口的方式。

创建服务 
1创建user.thrift

Java代码  收藏代码
  1. namespace java thrift.demo.gen  
  2. namespace py thrift.demo  
  3. struct User{  
  4.     1: i32 id,  
  5.     2: string username,  
  6.     3: string password  
  7. }  
  8.   
  9. exception UserNotFound{  
  10.     1:string message  
  11. }  
  12.   
  13. service UserService{  
  14.     list<User> getUsers(),  
  15.     User getUserByName(1:string username) throws(1:UserNotFound unf)  
  16. }  


定义了一个User ,一个UerNotFound异常,一个UserService服务接口

 

服务定义主要使用了 类C的语法

Types

Thrift 定义的类型

base type:bool,byte,i16,i32,i64,double,string(UTF-8 编码)

binary

structs

Contains:list<type>,set<type>,map<type>

exception

services:包含了一组接口方法

 

注意定义的时候 序号是不可省略的,使用序号可以提升序列化和反序列对象的速度。



2.生成代码
命令行下执行
生成java代码

Java代码  收藏代码
  1. thrift-0.6.1.exe --gen java  user.thrift  


生成python代码

Java代码  收藏代码
  1. thrift-0.6.1.exe --gen py user.thrift  


3.实现服务端
3.1接口服务实现

Java代码  收藏代码
  1. package thrift.demo.server;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import org.apache.thrift.TException;  
  7.   
  8. import thrift.demo.gen.User;  
  9. import thrift.demo.gen.UserNotFound;  
  10. import thrift.demo.gen.UserService.Iface;  
  11.   
  12. public class UserServiceHandler implements Iface {  
  13.   
  14.     @Override  
  15.     public List<User> getUsers() throws TException {  
  16.         List<User> list = new ArrayList<User>();  
  17.         User user = new User();  
  18.         user.setId(1);  
  19.         user.setUsername("user1");  
  20.         user.setPassword("pwd1");  
  21.         list.add(user);  
  22.         User user2 = new User();  
  23.         user2.setId(1);  
  24.         user2.setUsername("user2");  
  25.         user2.setPassword("pwd2");  
  26.         list.add(user2);  
  27.         return list;  
  28.     }  
  29.   
  30.     @Override  
  31.     public User getUserByName(String username) throws UserNotFound, TException {  
  32.         if ("user1".equals(username)) {  
  33.             User user = new User();  
  34.             user.setId(1);  
  35.             user.setUsername("user1");  
  36.             user.setPassword("pwd1");  
  37.             return user;  
  38.         } else {  
  39.             throw new UserNotFound();  
  40.         }  
  41.     }  
  42.   
  43. }  



3.2 Server启动类

Java代码  收藏代码
  1. package thrift.demo.server;  
  2.   
  3. import org.apache.thrift.TProcessorFactory;  
  4. import org.apache.thrift.protocol.TCompactProtocol;  
  5. import org.apache.thrift.server.THsHaServer;  
  6. import org.apache.thrift.server.TServer;  
  7. import org.apache.thrift.transport.TFramedTransport;  
  8. import org.apache.thrift.transport.TNonblockingServerSocket;  
  9. import org.apache.thrift.transport.TTransportException;  
  10.   
  11. import thrift.demo.gen.UserService;  
  12.   
  13. public class UserServer {  
  14.   
  15.     public final static int PORT = 8989;  
  16.     /** 
  17.      * @param args 
  18.      */  
  19.     public static void main(String[] args) {  
  20.         try {  
  21.             TNonblockingServerSocket socket = new TNonblockingServerSocket(PORT);  
  22.             final UserService.Processor processor = new UserService.Processor(  
  23.                     new UserServiceHandler());   
  24.             THsHaServer.Args arg = new THsHaServer.Args(socket);  
  25.             arg.protocolFactory(new TCompactProtocol.Factory());  
  26.             arg.transportFactory(new TFramedTransport.Factory());  
  27.             arg.processorFactory(new TProcessorFactory(processor));  
  28.             TServer server = new THsHaServer(arg);  
  29.             server.serve();  
  30.         } catch (TTransportException e) {  
  31.             e.printStackTrace();  
  32.         }  
  33.           
  34.   
  35.     }  
  36.   
  37. }  



4.实现客户端

Java代码  收藏代码
  1. package thrift.demo.client;  
  2.   
  3. import org.apache.thrift.TApplicationException;  
  4. import org.apache.thrift.TException;  
  5. import org.apache.thrift.protocol.TCompactProtocol;  
  6. import org.apache.thrift.protocol.TProtocol;  
  7. import org.apache.thrift.transport.TFramedTransport;  
  8. import org.apache.thrift.transport.TSocket;  
  9. import org.apache.thrift.transport.TTransport;  
  10. import org.apache.thrift.transport.TTransportException;  
  11.   
  12. import thrift.demo.gen.UserNotFound;  
  13. import thrift.demo.gen.UserService;  
  14.   
  15. public class UserClient {  
  16.     public static void main(String[] arsg) {  
  17.   
  18.         String address = "127.0.0.1";  
  19.         int port = 8989;  
  20.         int clientTimeout = 30000;  
  21.         TTransport transport = new TFramedTransport(new TSocket(address, port,  
  22.                 clientTimeout));  
  23.         TProtocol protocol = new TCompactProtocol(transport);  
  24.         UserService.Client client = new UserService.Client(protocol);  
  25.   
  26.         try {  
  27.             transport.open();  
  28.             System.out.println(client.getUserByName("user1"));  
  29.   
  30.         } catch (TApplicationException e) {  
  31.             System.out.println(e.getMessage() + " " + e.getType());  
  32.         } catch (TTransportException e) {  
  33.             e.printStackTrace();  
  34.         } catch (UserNotFound e) {  
  35.             e.printStackTrace();  
  36.         } catch (TException e) {  
  37.             e.printStackTrace();  
  38.         }  
  39.         transport.close();  
  40.     }  
  41. }  



注意 客户端和服务端要使用同一中 Protocol 和 Transport,否则会抛出异常

分享到:
评论
2 楼 dxm1986 2011-12-23  
w54653520 写道
多谢分享,有没有这方面的api啊,最好是中文的。多谢


没有。网上应该比较多吧。
1 楼 w54653520 2011-12-23  
多谢分享,有没有这方面的api啊,最好是中文的。多谢

相关推荐

    Apache Thrift 初学小讲(五)【代理】

    Apache Thrift 是一个开源的软件框架,用于构建可伸缩的、跨语言的服务。它结合了接口定义语言(IDL)来定义服务,编译器来生成代码,以及...通过学习和实践,开发者可以利用Thrift构建高效、安全、可扩展的服务架构。

    Apache Thrift 初学小讲(七)【负载均衡】

    Apache Thrift 是一个开源的软件框架,用于构建可伸缩的、高性能的跨语言服务。在本篇初学小讲中,我们将重点关注Thrift在...通过深入学习Thrift的内部机制和实践操作,可以更好地利用其特性来优化服务的性能和可靠性。

    Learning Apache Thrift

    Apache Thrift 是一个开源的软件框架,用于构建可伸缩的、跨语言的服务。它结合了编译器、协议和库,使得开发人员能够轻松地定义数据类型和服务接口,然后在多种编程语言之间进行高效通信。这个框架最初由Facebook...

    Apache Thrift - 可伸缩的跨语言服务开发框架(代码已修正)

    Apache Thrift 是一个开源的跨语言服务开发框架,它由Facebook于2007年创建,现由Apache软件基金会维护。Thrift的主要目标是解决在分布式...学习并掌握Thrift,对于提升开发效率和构建健壮的分布式系统具有重要意义。

    Apache Thrift 初学小讲(三)【http】

    Apache Thrift 是一个开源的软件框架,用于构建可伸缩的、跨语言的服务。它通过定义一种中间表示(IDL,接口定义语言),允许开发者在多种编程语言之间轻松地构建服务。在“Apache Thrift 初学小讲(三)【http】”...

    thrift实例以及所需jar包

    Apache Thrift是一个开源的软件框架,它用于构建跨语言的服务。这个实例包含了Thrift的使用方法和必要的库文件,帮助...通过学习和实践,你可以掌握如何利用Thrift创建自己的服务,并与其他语言的客户端进行交互。

    Apache Thrift环境配置

    Apache Thrift是一款强大的软件框架,用于构建跨语言的服务。它允许使用一种定义良好的接口描述语言(IDL)来定义...对于那些希望在多语言环境中构建高效通信服务的开发者,Apache Thrift是一个值得学习和掌握的工具。

    《springcloud&学习资料》--Apache Thrift 在 SpringCloud 中的使用.zip

    无论做毕业设计还是用于学习技能,或工作中当做参考资料,都能发挥重要作用 亲们下载我任何一个付费资源后,即可私信联系我免费下载其他相关资源哦~ 个人花大量时间整理出的实战资料,内容丰富,文档也很详细。无论...

    THRIFT 学习资料

    THRIFT 是一个开源的跨语言服务开发框架,由 Facebook 在 2007 年创建并贡献给了 Apache 基金会。它旨在提供一种高效、可扩展、跨平台的解决方案,用于构建分布式系统中的应用程序接口(API)。通过 THRIFT,开发者...

    Thrift--JSClient

    标题中的“Thrift--JSClient”指的是Apache Thrift在JavaScript客户端的使用。Apache Thrift是一种软件框架,用于构建跨语言的服务。它通过定义一个中间表示(IDL,接口定义语言)来构建服务,然后自动生成各种编程...

    thrift实现http协议案例

    Thrift是一种高效的、跨语言的服务框架,最初由Facebook开发,现在是Apache的顶级项目。它提供了强大的代码生成工具,可以从接口定义文件(IDL)生成多种编程语言的客户端和服务端代码,使得不同语言之间可以轻松地...

    thrift入门学习教程

    Thrift是由Facebook开发并在2007年贡献给Apache基金会的一款开源项目。它的主要目的是解决跨平台、跨语言的系统间大数据量传输通信问题。在早期,Facebook面临着系统之间语言环境不一致的问题,因此需要一种能够实现...

    Thrift学习

    Thrift是一种开源的跨语言服务开发框架,由Facebook于2007年开发并开源,后来成为Apache软件基金会的顶级项目。它通过定义一种中间语言(IDL,Interface Definition Language)来描述服务接口,允许开发者在不同的...

    Thrift框架使用分享

    Apache Thrift是由Facebook开发并开源的远程服务调用框架,它能够实现高效的跨语言服务开发和通信。Thrift框架通过接口描述语言(IDL)来定义服务,支持多种编程语言,如C++, Java, Python, PHP, Ruby, Erlang, Perl...

    thrift样例操作实例

    在学习这个实例时,你需要理解Thrift的IDL语法,如何使用Thrift编译器生成代码,以及如何在Java环境中集成和使用Thrift库。此外,你还需要了解如何配置和运行Thrift服务以及客户端,这通常涉及到网络通信、序列化和...

    thrift入门教程+代码

    Thrift是一种开源的跨语言服务开发框架,由Facebook于2007年设计并发布,后来成为Apache软件基金会的顶级项目。它旨在提供一个高效、轻...通过深入学习Thrift,你可以更好地理解和实践服务化、分布式系统的设计与实现。

    thrift开源项目研究

    Thrift是一种高性能的跨语言服务框架,由Facebook于2007年开发并开源,现已成为Apache软件基金会的顶级项目。它的主要目标是解决分布式系统中的通信问题,通过提供一套代码生成工具,使得开发者可以方便地在不同的...

    thrift-Demo

    Thrift是一种开源的跨语言服务开发框架,由Facebook于2007年开发并开源,后来成为Apache软件基金会的顶级项目。Thrift的核心思想是通过定义一种中间描述文件(.thrift),来实现数据结构和服务接口的跨语言共享。这...

    Windows下QT使用Thrift的样例

    通过学习和分析这个样例,开发者可以快速掌握在Windows环境下使用QT、Thrift和Boost进行服务开发的方法。 总之,这个样例项目提供了一个很好的起点,帮助开发者了解如何在Windows上用QT与Thrift协同工作,同时利用...

Global site tag (gtag.js) - Google Analytics