`
SmallMin
  • 浏览: 24874 次
  • 性别: 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

namespace java thrift.demo.gen
namespace py thrift.demo
struct User{
	1: i32 id,
	2: string username,
	3: string password
}

exception UserNotFound{
	1:string message
}

service UserService{
	list<User> getUsers(),
	User getUserByName(1:string username) throws(1:UserNotFound unf)
}


定义了一个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代码

thrift-0.6.1.exe --gen java  user.thrift


生成python代码

thrift-0.6.1.exe --gen py user.thrift


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

package thrift.demo.server;

import java.util.ArrayList;
import java.util.List;

import org.apache.thrift.TException;

import thrift.demo.gen.User;
import thrift.demo.gen.UserNotFound;
import thrift.demo.gen.UserService.Iface;

public class UserServiceHandler implements Iface {

	@Override
	public List<User> getUsers() throws TException {
		List<User> list = new ArrayList<User>();
		User user = new User();
		user.setId(1);
		user.setUsername("user1");
		user.setPassword("pwd1");
		list.add(user);
		User user2 = new User();
		user2.setId(1);
		user2.setUsername("user2");
		user2.setPassword("pwd2");
		list.add(user2);
		return list;
	}

	@Override
	public User getUserByName(String username) throws UserNotFound, TException {
		if ("user1".equals(username)) {
			User user = new User();
			user.setId(1);
			user.setUsername("user1");
			user.setPassword("pwd1");
			return user;
		} else {
			throw new UserNotFound();
		}
	}

}



3.2 Server启动类

package thrift.demo.server;

import org.apache.thrift.TProcessorFactory;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.server.THsHaServer;
import org.apache.thrift.server.TServer;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TNonblockingServerSocket;
import org.apache.thrift.transport.TTransportException;

import thrift.demo.gen.UserService;

public class UserServer {

	public final static int PORT = 8989;
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		try {
			TNonblockingServerSocket socket = new TNonblockingServerSocket(PORT);
			final UserService.Processor processor = new UserService.Processor(
			        new UserServiceHandler()); 
			THsHaServer.Args arg = new THsHaServer.Args(socket);
			arg.protocolFactory(new TCompactProtocol.Factory());
			arg.transportFactory(new TFramedTransport.Factory());
			arg.processorFactory(new TProcessorFactory(processor));
			TServer server = new THsHaServer(arg);
			server.serve();
		} catch (TTransportException e) {
			e.printStackTrace();
		}
		

	}

}



4.实现客户端

package thrift.demo.client;

import org.apache.thrift.TApplicationException;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;

import thrift.demo.gen.UserNotFound;
import thrift.demo.gen.UserService;

public class UserClient {
	public static void main(String[] arsg) {

		String address = "127.0.0.1";
		int port = 8989;
		int clientTimeout = 30000;
		TTransport transport = new TFramedTransport(new TSocket(address, port,
				clientTimeout));
		TProtocol protocol = new TCompactProtocol(transport);
		UserService.Client client = new UserService.Client(protocol);

		try {
			transport.open();
			System.out.println(client.getUserByName("user1"));

		} catch (TApplicationException e) {
			System.out.println(e.getMessage() + " " + e.getType());
		} catch (TTransportException e) {
			e.printStackTrace();
		} catch (UserNotFound e) {
			e.printStackTrace();
		} catch (TException e) {
			e.printStackTrace();
		}
		transport.close();
	}
}



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

 

 

 

 

 

  • 大小: 33.6 KB
分享到:
评论

相关推荐

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

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

    thrift学习资料

    apache thift 学习资料

    nginx_photo_thrift_module:用于从 thrift 后端提供照片的 nginx 模块

    该模块使用 Apache thrift、boost 和 ConncurrentQueue.hpp(创建到 thrift 服务器的连接池),要安装它,您的系统必须安装 thrift 和 boost[system, thread) 你不能只安装这个模块,你必须写一个 thrift 服务器,...

    93个netty高并发教学视频下载.txt

    17_Protobuf使用最佳实践与Apache Thrift介绍;18_Apache Thrift应用详解与实例剖析;19_Apache Thrift原理与架构解析;20_通过Apache Thrift实现Java与Python的RPC调用;21_gRPC深入详解 ;22_gRPC实践 ;23_Gradle...

    精通并发与netty视频教程(2018)视频教程

    17_Protobuf使用最佳实践与Apache Thrift介绍 18_Apache Thrift应用详解与实例剖析 19_Apache Thrift原理与架构解析 20_通过Apache Thrift实现Java与Python的RPC调用 21_gRPC深入详解 22_gRPC实践 23_Gradle Wrapper...

    apache-hive-2.3.5-bin.tar.gz

    其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。 Hive是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来...

    精通并发与 netty 视频教程(2018)视频教程

    14_Protobuf完整实例详解 15_Protobuf集成Netty与多协议消息传 递 16_Protobuf多协议消息支援与工程最佳实践 17_Protobuf使用最佳实践与Apache Thrift介绍 18_Apache Thrift应用详解与实例剖析 19_Apache Thrift原理...

    Apache Hue 2小时轻松搞定大数据可视化终端视频教程

    4,每一块知识点, 都有配套案例, 学习不再迷茫。 适用人群 1、对大数据感兴趣的在校生及应届毕业生。 2、对目前职业有进一步提升要求,希望从事大数据行业高薪工作的在职人员。 3、对大数据行业感兴趣的相关人员。 ...

    精通并发与netty 无加密视频

    第17讲:Protobuf使用最佳实践与Apache Thrift介绍 第18讲:Apache Thrift应用详解与实例剖析 第19讲:Apache Thrift原理与架构解析 第20讲:通过Apache Thrift实现Java与Python的RPC调用 第21讲:gRPC深入详解 ...

    ece454750s15a1

    要获得Apache Thrift的动手经验: •defining and implementing RPC interfaces •selecting Thrift protocols and server implementations 对可伸缩性有基本的了解: •request level parallelism (RLP) •load...

    thrift-maven-play-pen:对 Java、thrift 和 maven 进行更多实验

    这么多新东西这主要是取自https://thrift.apache.org/tutorial/代码。 这个项目是我玩多 pom maven 项目并学习mvn help:effective-pom的输出意味着什么。 http://books.sonatype.com/mvnex-book/一直是很好的资源。

    OpenSource_Study:日积月累,开源框架学习(Thrift,Dubbo,Spring,Guava ...)-Open source

    1,Apache.commons 1.1,beanutils propertyUtils类副本与反射副本使用及效率比较。 1.2,收藏CollectionUtils从一个列表中查找符合一定条件的对象。 2,太阳 2.1,发送邮件javax.mail完成邮件的发送和接收。 3,...

    Flume核心思想与解密

    Apache flume是一个分布式、可靠、和高可用的海量日志采集、聚合和传输的系统,用于有效地收集、聚合和将大量日志数据从许多不同的源移动到一个集中的数据存储(如文本、HDFS、Hbase等)。  其使用不仅仅限于日志...

    Spark 2.0.2 Spark 2.2 中文文档 本资源为网页,不是PDF

    运行 Thrift JDBC/ODBC 运行 Spark SQL CLI 迁移指南 从 Spark SQL 1.6 升级到 2.0 从 Spark SQL 1.5 升级到 1.6 从 Spark SQL 1.4 升级到 1.5 从 Spark SQL 1.3 升级到 1.4 从 Spark SQL 1.0~1.2 升级到 ...

    Hadoop实战(第2版)

    你将会学习到每个技术的细节,以及当遇到一个具体问题时能够给出对应的解决方案。本书提供了结构良好且易于理解的例子,可用于应对你所遇到的问题。 《Hadoop硬实战》包含: ·Hadoop和MapReduce的基本概念 ·85...

Global site tag (gtag.js) - Google Analytics