`
tcspecial
  • 浏览: 912562 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Thrift 使用

    博客分类:
  • java
阅读更多

 

 Thrift 是apache开源的rpc框架,支持多种语言绑定。相对protobuf,提供server,序列化等一站式解决方案。

 

一. 下载

 http://thrift.apache.org/download

 

二. 编写IDL

namespace java org.sun.service 

service SimpleThriftService
{
	string getStr( 1:string src, 2:string dst );
	
	i32 getInt( 1:i32 val );
	
	map<i32,i32> getMap( 1:string name );
}

 

该IDL是用于生成各语言绑定的描述文件,pb中对应*.proto文件。thrift的IDL支持数据类型比较丰富,包含struct/map。

 

Thrift Types:

Base Types:

bool: A boolean value (true or false)

byte: An 8-bit signed integer

i16: A 16-bit signed integer

i32: A 32-bit signed integer

i64: A 64-bit signed integer

double: A 64-bit floating point number

string: A text string encoded using UTF-8 encoding

Structs

Containers:

list, set, map 

 

三. 生成Java Binding

thrift --gen java test_service.thrift

 当前目录生成:./gen-java/org/sun/service/SimpleThriftService.java

 

四. 编写实现类

// 实现Binding class的Iface接口
public class ThriftServiceImpl implements SimpleThriftService.Iface {

	public String getStr(String src, String dst) throws TException {
		System.out.println( "Input: " + src + "\t" + dst );
		String strResult = String.format( "%s-%s", src, dst );
		return strResult;
	}

	public int getInt(int val) throws TException {
		int sum = 10*val;
		return sum;
	}

	public Map<Integer, Integer> getMap(String name) throws TException {
		System.out.println( "Name: " + name );
		
		Map<Integer,Integer> pMap = new HashMap<Integer,Integer>();
		pMap.put( 1, 1 );
		return pMap;
	}
}

 

五. 启动server

Thrift对外提供工作模式:TSimpleServer、TNonblockingServer、TThreadPoolServer、TThreadedSelectorServer等。

 

Thrift支持通信协议格式:TCompactProtocol、TBinaryProtocol、TJSONProtocol等。

/**
 * Thrift Server
 */
private static void main( String[] args) throws TTransportException {
	ThriftServiceImpl m_ServImpl = new ThriftServiceImpl();	// 实现类

	TProcessor tProcessor = new SimpleThriftService.Processor<SimpleThriftService.Iface>( m_ServImpl );
	TNonblockingServerSocket nioSocket = new TNonblockingServerSocket( 12345 );  

	// 设置参数
	TNonblockingServer.Args tnbArgs = new TNonblockingServer.Args(nioSocket);  
	tnbArgs.processor(tProcessor);  	// 设置处理器
	tnbArgs.transportFactory(new TFramedTransport.Factory());	// 按块方式传输
	tnbArgs.protocolFactory(new TBinaryProtocol.Factory());  	// 二进制序列化协议

	// 启动TCP服务
	m_Server = new TNonblockingServer( tnbArgs );		

	// 循环提供服务
	m_Server.serve();
}

 

六. Client测试

/**
 * Thrift Client
 */
public static void main(String[] args) {
	// 建立tcp client
	TTransport m_Socket = new TFramedTransport( new TSocket( "127.0.0.1", 12345, 2000 ) );
	
	// 设置二进制协议
	TProtocol protocol = new TBinaryProtocol( m_Socket );
	SimpleThriftService.Client client = new SimpleThriftService.Client(protocol);
	
	try {
		m_Socket.open();
		
		// 调用远程函数
		String result = client.getStr( "hello", "world" );
		System.out.println( "Result: " + result );
		m_Socket.close();
	} catch (TException e) {
		e.printStackTrace();
	}
}

 

七. 抓包分析

 

 

 Wireshark居然能识别thrift协议,thrift协议包括header(18字节) + Data,很明显thrift未对字段做压缩,相对于pb比较占用网络带宽。

 

 

参考文章 

Thrift官网

深入浅出了解Thrift

 

  

 

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

相关推荐

    通过thrift使用c++访问hbase

    【标题】: "通过Thrift使用C++访问HBase" 【描述】: "本文档详述了如何在Linux和Windows环境下配置Thrift环境并使用HBase的C++客户端。" 【标签】: "hadoop hbase thrift boost" 在IT领域,特别是大数据处理中,...

    Apache Thrift 使用说明

    对于 Java 示例,首先同样使用 `thrift` 生成 Java 代码,然后进入 `gen-java` 文件夹,如果尚未安装 ant,可以使用 `sudo apt-get install ant` 来安装。使用 ant 来编译 Java 代码,并运行生成的可执行文件,同样...

    Thrift使用示例代码

    在本示例中,我们将深入探讨Thrift的使用,通过具体的代码示例来帮助理解其工作原理。 首先,Thrift的使用流程通常包括以下几个步骤: 1. **定义服务接口**:在Thrift IDL(Interface Description Language)文件...

    thrift实现http协议案例

    通过运行这个测试工程,你可以了解如何将Thrift服务部署到支持HTTP的服务器上,如Tomcat或Jetty,以及如何使用HTTP客户端(如curl或浏览器)与之交互。 总结一下,Thrift实现HTTP协议的关键在于创建一个自定义...

    thrift的使用介绍

    一旦有了IDL文件,你可以使用Thrift编译器生成对应语言的客户端和服务器端代码。例如,对于PHP和Python,这将生成服务接口类、协议处理类以及数据结构的序列化和反序列化代码。 - `PhpClient.php`: 这是生成的PHP...

    使用thrift、websocket在javascript和cpp之间建立rpc调用

    使用thrift、websocket在javascript和c++之间建立rpc调用机制。 如果要使用js+html来写界面,cpp来写底层业务逻辑,这就非常有用了。 当然,如果底层不用cpp来写,也可以参考本代码的js对thrift的rpc包装。

    Thrift-java学习小结

    Thrift使用一种高效的二进制协议进行通信,它支持多种传输方式,如TCP、HTTP等。这种协议设计考虑了网络通信的性能,包括数据序列化和反序列化,使得跨语言通信变得更加高效。 七、异常处理 Thrift支持自定义异常,...

    thrift-编译工具

    1. **IDL(接口定义语言)**:Thrift使用类似C++的语法定义服务接口和数据结构,这些定义存储在.thrift文件中。例如: ```thrift service MyService { string sayHello(1:string name) } ``` 2. **编译器**:Thrift...

    thrift开源项目研究

    1. IDL(Interface Definition Language):Thrift使用IDL文件定义服务接口和数据类型,类似于protobuf的.proto文件。 2. 编译器:Thrift编译器将IDL文件转换为各种目标语言(如Java、Python、C++等)的代码,包括...

    thrift环境搭建(内附thrift运行环境可执行程序、搭建说明文本)

    Thrift使用二进制协议,既高效又紧凑,同时支持HTTP、TCP和多种其他传输层协议,使其能够在各种环境中灵活部署。 10. **应用场景** Thrift广泛应用于分布式系统中的数据交换,例如数据库访问、消息队列、RPC...

    thrift0.9.3附带jar包

    这个压缩包“thrift0.9.3附带jar包”包含了Thrift 0.9.3版本的相关库文件,对于Java开发者来说,这些jar包是使用Thrift在Java平台上开发RPC(远程过程调用)服务所必需的。 Thrift 的核心概念包括: 1. **IDL...

    thrift入门教程+代码

    1. 接口定义语言(IDL):Thrift使用IDL文件来定义服务接口,这些文件通常以`.thrift`为扩展名。在IDL文件中,你可以定义数据类型(如结构体、枚举、异常)、服务以及它们的操作。例如: ```thrift service ...

    采用java操作thrift代码示例

    以上是基本的Thrift使用步骤。在实际项目中,可能需要处理更复杂的场景,如异常处理、连接池管理、多线程等。Thrift还提供了多种传输方式(如HTTP、HTTPS、NIO等)和协议(如Binary、Compact等),可以根据具体需求...

    thrift javascript example

    1. **IDL(Interface Definition Language)**: Thrift使用一种类似C++的语法来定义服务接口和数据结构。这些定义文件通常以`.thrift`为扩展名,它们描述了服务的方法、数据类型以及它们之间的交互方式。 2. **...

    thrift详解

    用户通过定义 .thrift 文件来指定数据类型和服务接口,然后使用 Thrift 编译器生成特定语言的客户端和服务端代码。例如,可以使用以下命令来生成 Java 代码: ``` thrift-0.9.3.exe -r -gen java TestThrift.thrift...

    thrift中文简易教程

    - **高性能**:Thrift 使用高效的二进制格式进行数据交换,相比于文本格式如 XML 或 JSON,具有更高的性能。 - **易于扩展**:Thrift 的设计使得服务易于扩展,可以通过修改 IDL 文件来添加新的功能,而无需对现有的...

    thrift运行成功的例子

    5. **通信协议与序列化**:Thrift 使用自己的二进制协议进行数据传输,这种协议高效且紧凑,适合跨语言通信。同时,Thrift 还提供了数据序列化和反序列化的功能,确保不同语言之间的数据交换是透明的。 6. **安全与...

    thrift-0.11.0

    4. 协议:Thrift使用自己的二进制协议进行数据传输,该协议高效且紧凑,适合大规模数据交换。同时,它还支持HTTP和HTTPS等标准协议,以便于集成到现有的网络环境中。 5. 传输层:Thrift支持多种传输方式,如TCP、...

    Thrift简单调用demo代码

    6. **网络通信**:Thrift使用二进制协议进行高效的数据传输,支持HTTP、TCP等多种传输层协议。在本示例中,很可能是TCP。 7. **异常处理**:Thrift定义了自己的异常体系,可以在IDL中声明可能抛出的异常。当服务端...

Global site tag (gtag.js) - Google Analytics