Thrift的学习

本文介绍Thrift框架的基本概念及其在Java中的应用实例。从下载安装到编写服务接口、实现类,再到搭建服务端与客户端的过程,详细展示了如何利用Thrift进行跨语言RPC通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 等等编程语言间无缝结合的、高效的服务。

Thrift最初由facebook开发,07年四月开放源码,08年5月进入apache孵化器。thrift允许你定义一个简单的定义文件中的数据类型和服务接口。以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。

Thrift 脚本可定义的数据类型包括以下几种类型:

    基本类型:
        bool:布尔值,true 或 false,对应 Java 的 boolean
        byte:8 位有符号整数,对应 Java 的 byte
        i16:16 位有符号整数,对应 Java 的 short
        i32:32 位有符号整数,对应 Java 的 int
        i64:64 位有符号整数,对应 Java 的 long
        double:64 位浮点数,对应 Java 的 double
        string:未知编码文本或二进制字符串,对应 Java 的 String

    结构体类型:
        struct:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个 JavaBean
    容器类型:
        list:对应 Java 的 ArrayList
        set:对应 Java 的 HashSet
        map:对应 Java 的 HashMap
    异常类型:
        exception:对应 Java 的 Exception
    服务类型:service:对应服务的类
1.下载thrift.exe(我的是window7)

2.下载相关jar包

<dependency>
   <groupId>org.apache.thrift</groupId>
   <artifactId>libthrift</artifactId>
   <version>0.9.3</version>
</dependency>

3.编写Hello.thrift

Hello.thrift

service Hello{
	string helloString(1:string para)
	i32 helloInt(1:i32 para)
	bool helloBoolean(1:bool para)
	void helloVoid()
	string helloNull()
}
把该文件和thrift.exe放在同一个目录下,进入cmd模式,输入
thrift.exe --gen java Hello.thrift

跟着会自动生成gen-java文件夹,把里面的.java文件导入eclipse

4.编写实现类

HelloServiceImpl:

package com.yingze.thrift;

import org.apache.thrift.TException;

/**  
 * @ClassName: HelloServiceImpl
 * @Description: TODO()
 * @author liang
 * @date 2016年6月29日 下午3:07:50
 *
 */
public class HelloServiceImpl implements Hello.Iface{

	public String helloString(String para) throws TException {
		return para;
	}

	public int helloInt(int para) throws TException {
		return para;
	}

	public boolean helloBoolean(boolean para) throws TException {
		return para;
	}

	public void helloVoid() throws TException {
		System.out.println("HelloServiceImpl: helloVoid()...");
	}

	public String helloNull() throws TException {
		return null;
	}

}
5.编写服务端测试main方法

HelloServiceServer:

package com.yingze.thrift;

import org.apache.thrift.TProcessor;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TBinaryProtocol.Factory;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;

/**  
 * @ClassName: HelloServiceServer
 * @Description: TODO()
 * @author liang
 * @date 2016年6月29日 下午3:13:09
 *
 */
public class HelloServiceServer {

	public static void main(String[] args) {		
		try {		
	        TServerSocket serverTransport = new TServerSocket(7911);//设置服务器端口为7911
	        /*协议层TProtocol:
				TBinaryProtocol – 二进制编码格式进行数据传输。 
				TCompactProtocol – 高效的编码方式,使用类似于protobuffer的Variable-Length Quantity (VLQ) 编码(可以节省传输空间,使数据的传输效率更高)对数据进行压缩。 关于VLQ了解更多(http://en.wikipedia.org/wiki/Variable-length_quantity)
				TJSONProtocol – 使用JSON的数据编码协议进行数据传输。 
				TSimpleJSONProtocol – 这种节约只提供JSON只写的协议,适用于通过脚本语言解析    
				TDebugProtocol – 在开发的过程中帮助开发人员调试用的,以文本的形式展现方便阅读。*/
	        Factory proFactory = new TBinaryProtocol.Factory();
	        //关联处理器与接口服务的实现
	        TProcessor processor = new Hello.Processor<Hello.Iface>(new HelloServiceImpl());
	        TServer.Args tArgs = new TServer.Args(serverTransport);
	        tArgs.processor(processor);
	        tArgs.protocolFactory(proFactory);
	        /*服务端类型 :
				TSimpleServer -  单线程服务器端使用标准的阻塞式I/O。     
				TThreadPoolServer -  多线程服务器端使用标准的阻塞式I/O。 
				TNonblockingServer – 多线程服务器端使用非阻塞式I/O,并且实现了Java中的NIO通道。*/
	        TServer server = new TSimpleServer(tArgs);
	        System.out.println("Start server on port 7911....");
	        server.serve();
		} catch (TTransportException e) {
			e.printStackTrace();
		}
	}
}
6.编写客户端测试main方法

package com.yingze.thrift;

import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;

/**  
 * @ClassName: HelloServiceClient
 * @Description: TODO()
 * @author liang
 * @date 2016年6月29日 下午3:18:21
 *
 */
public class HelloServiceClient {

	public static void main(String[] args) {
		
        try {
        	/*传输层TTransport:
	            TSocket- 使用阻塞式I/O进行传输,也是最常见的模式。 
	            TFramedTransport- 使用非阻塞方式,按块的大小,进行传输,类似于Java中的NIO。                
	            TFileTransport- 顾名思义按照文件的方式进程传输,虽然这种方式不提供Java的实现,但是实现起来非常简单。 
	            TMemoryTransport- 使用内存I/O,就好比Java中的ByteArrayOutputStream实现。 
	            TZlibTransport- 使用执行zlib压缩,不提供Java的实现。
	            TNonblockingTransport-使用非阻塞方式,用于构建异步客户端。*/       	
            TTransport transport = new TSocket("localhost", 7911);//设置调用的服务器为本地,端口为7911
			transport.open();
			/*协议层TProtocol:
				TBinaryProtocol – 二进制编码格式进行数据传输。 
				TCompactProtocol – 高效的编码方式,使用类似于protobuffer的Variable-Length Quantity (VLQ) 编码(可以节省传输空间,使数据的传输效率更高)对数据进行压缩。 关于VLQ了解更多(http://en.wikipedia.org/wiki/Variable-length_quantity)
				TJSONProtocol – 使用JSON的数据编码协议进行数据传输。 
				TSimpleJSONProtocol – 这种节约只提供JSON只写的协议,适用于通过脚本语言解析    
				TDebugProtocol – 在开发的过程中帮助开发人员调试用的,以文本的形式展现方便阅读。*/
	        TProtocol protocol = new TBinaryProtocol(transport);
	        Hello.Client client = new Hello.Client(protocol);
	        client.helloVoid();
	        transport.close();
		} catch (TTransportException e) {
			e.printStackTrace();
		} catch (TException e) {
			e.printStackTrace();
		}
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值