您好,欢迎来到微智科技网。
搜索
您的当前位置:首页Apache Thrift 学习

Apache Thrift 学习

来源:微智科技网

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

Cassandra 支持多种语言的编程接口,正式由于使用了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,i,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 = ;
	/**
	 * @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 = ;
		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,否则会抛出异常

 

 

 

 

 

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 7swz.com 版权所有 赣ICP备2024042798号-8

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务