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使用C++访问HBase" 【描述】: "本文档详述了如何在Linux和Windows环境下配置Thrift环境并使用HBase的C++客户端。" 【标签】: "hadoop hbase thrift boost" 在IT领域,特别是大数据处理中,...
对于 Java 示例,首先同样使用 `thrift` 生成 Java 代码,然后进入 `gen-java` 文件夹,如果尚未安装 ant,可以使用 `sudo apt-get install ant` 来安装。使用 ant 来编译 Java 代码,并运行生成的可执行文件,同样...
在本示例中,我们将深入探讨Thrift的使用,通过具体的代码示例来帮助理解其工作原理。 首先,Thrift的使用流程通常包括以下几个步骤: 1. **定义服务接口**:在Thrift IDL(Interface Description Language)文件...
通过运行这个测试工程,你可以了解如何将Thrift服务部署到支持HTTP的服务器上,如Tomcat或Jetty,以及如何使用HTTP客户端(如curl或浏览器)与之交互。 总结一下,Thrift实现HTTP协议的关键在于创建一个自定义...
一旦有了IDL文件,你可以使用Thrift编译器生成对应语言的客户端和服务器端代码。例如,对于PHP和Python,这将生成服务接口类、协议处理类以及数据结构的序列化和反序列化代码。 - `PhpClient.php`: 这是生成的PHP...
使用thrift、websocket在javascript和c++之间建立rpc调用机制。 如果要使用js+html来写界面,cpp来写底层业务逻辑,这就非常有用了。 当然,如果底层不用cpp来写,也可以参考本代码的js对thrift的rpc包装。
Thrift使用一种高效的二进制协议进行通信,它支持多种传输方式,如TCP、HTTP等。这种协议设计考虑了网络通信的性能,包括数据序列化和反序列化,使得跨语言通信变得更加高效。 七、异常处理 Thrift支持自定义异常,...
1. **IDL(接口定义语言)**:Thrift使用类似C++的语法定义服务接口和数据结构,这些定义存储在.thrift文件中。例如: ```thrift service MyService { string sayHello(1:string name) } ``` 2. **编译器**:Thrift...
1. IDL(Interface Definition Language):Thrift使用IDL文件定义服务接口和数据类型,类似于protobuf的.proto文件。 2. 编译器:Thrift编译器将IDL文件转换为各种目标语言(如Java、Python、C++等)的代码,包括...
Thrift使用二进制协议,既高效又紧凑,同时支持HTTP、TCP和多种其他传输层协议,使其能够在各种环境中灵活部署。 10. **应用场景** Thrift广泛应用于分布式系统中的数据交换,例如数据库访问、消息队列、RPC...
这个压缩包“thrift0.9.3附带jar包”包含了Thrift 0.9.3版本的相关库文件,对于Java开发者来说,这些jar包是使用Thrift在Java平台上开发RPC(远程过程调用)服务所必需的。 Thrift 的核心概念包括: 1. **IDL...
1. 接口定义语言(IDL):Thrift使用IDL文件来定义服务接口,这些文件通常以`.thrift`为扩展名。在IDL文件中,你可以定义数据类型(如结构体、枚举、异常)、服务以及它们的操作。例如: ```thrift service ...
以上是基本的Thrift使用步骤。在实际项目中,可能需要处理更复杂的场景,如异常处理、连接池管理、多线程等。Thrift还提供了多种传输方式(如HTTP、HTTPS、NIO等)和协议(如Binary、Compact等),可以根据具体需求...
1. **IDL(Interface Definition Language)**: Thrift使用一种类似C++的语法来定义服务接口和数据结构。这些定义文件通常以`.thrift`为扩展名,它们描述了服务的方法、数据类型以及它们之间的交互方式。 2. **...
用户通过定义 .thrift 文件来指定数据类型和服务接口,然后使用 Thrift 编译器生成特定语言的客户端和服务端代码。例如,可以使用以下命令来生成 Java 代码: ``` thrift-0.9.3.exe -r -gen java TestThrift.thrift...
- **高性能**:Thrift 使用高效的二进制格式进行数据交换,相比于文本格式如 XML 或 JSON,具有更高的性能。 - **易于扩展**:Thrift 的设计使得服务易于扩展,可以通过修改 IDL 文件来添加新的功能,而无需对现有的...
5. **通信协议与序列化**:Thrift 使用自己的二进制协议进行数据传输,这种协议高效且紧凑,适合跨语言通信。同时,Thrift 还提供了数据序列化和反序列化的功能,确保不同语言之间的数据交换是透明的。 6. **安全与...
4. 协议:Thrift使用自己的二进制协议进行数据传输,该协议高效且紧凑,适合大规模数据交换。同时,它还支持HTTP和HTTPS等标准协议,以便于集成到现有的网络环境中。 5. 传输层:Thrift支持多种传输方式,如TCP、...
6. **网络通信**:Thrift使用二进制协议进行高效的数据传输,支持HTTP、TCP等多种传输层协议。在本示例中,很可能是TCP。 7. **异常处理**:Thrift定义了自己的异常体系,可以在IDL中声明可能抛出的异常。当服务端...