我的netty之旅(3)(apache thrift)

前几天记录了一下protobuf,现在还有一种新的方案就叫thrift.是facebook最初做的项目,后来捐给apache作为开源项目在使用。使用方法如下
第一步,下载个thrift的软件包,可以直接去apache的官方( http://www.apache.org/ )按照系统要求下载,然后拖拽到本地,配置一下环境变量就可以了,
弄完了输入  thrift --version   测试一下 ,如果显示版本号就是正确,没有问题
第二步是 创建thrift的idl文件,具体每字段代表什么属性建议详细查资料,因为太多了我就不做太多介绍

namespace java com.thrift

typedef i16 short
typedef i32 int
typedef i64 long
typedef bool boolean
typedef string String

struct Person {
	1: optional String username,
	2: optional int age,
	3: optional boolean married 
}

exception DataException {
	1: optional String message,
	2: optional String callStack,
	3: optional String date
}

service PersonService {
	Person getPersonByUsername(1: required String username) throws (1: DataException dataException),

	void savePerson(1: required Person person) throws (1: DataException dataException)

}

第三步是输入命令 ,就会生成java文件,copy到自己需要的文件夹就可以
thrift --gen java tutorial.thrift 
在这里插入图片描述
第四步导包

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

第五步是 写个java的class类文件,实现上面生成的接口文件

package com.thrift;

import org.apache.thrift.TException;

public class PersonServiceImpl implements PersonService.Iface {

	@Override
	public Person getPersonByUsername(String username) throws DataException, TException {
		System.out.println(username);
		Person person = new Person();
		person.setUsername(username);
		person.setAge(50);
		person.setMarried(true);
		return person;
	}

	@Override
	public void savePerson(Person person) throws DataException, TException {
		System.out.println("got client param:");
		System.out.println(person.getUsername());
		System.out.println(person.getAge());
		System.out.println(person.isMarried());
	}

}

然后写服务端代码

package com.thrift;

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;

public class ThriftServer {
	public static void main(String[] args) throws TTransportException {

		TNonblockingServerSocket serverSocket = new TNonblockingServerSocket(8899);
		THsHaServer.Args arg = new THsHaServer.Args(serverSocket).minWorkerThreads(2).maxWorkerThreads(4);
		PersonService.Processor<PersonServiceImpl> processor = new PersonService.Processor<>(new PersonServiceImpl());
		// 压缩协议
		arg.protocolFactory(new TCompactProtocol.Factory());
		// 发送数据
		arg.transportFactory(new TFramedTransport.Factory());
		arg.processorFactory(new TProcessorFactory(processor));
		TServer tserver = new THsHaServer(arg);
		System.out.println("Thrift server start!");
		tserver.serve();
	}
}

和client端代码

package com.thrift;

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;

public class ThriftClient {

	public static void main(String[] args) {

		TTransport transport = new TFramedTransport(new TSocket("localhost", 8899), 600);
		TProtocol tProtocol = new TCompactProtocol(transport);
		PersonService.Client client = new PersonService.Client(tProtocol);

		try {
			transport.open();
			System.out.println("------------------------");
			Person personByUsername = client.getPersonByUsername("张三");
			System.out.println("name:" + personByUsername.getUsername());
			System.out.println("age:" + personByUsername.getAge());
			System.out.println("married:" + personByUsername.isMarried());

			Person person = new Person();
			person.setAge(40);
			person.setUsername("郑丹丹");
			person.setMarried(true);
			client.savePerson(person);

			System.out.println("----------------");
		} catch (Exception e) {
			throw new RuntimeException(e.getMessage(), e);
		} finally {
			transport.close();
		}

	}
}

此框架可以在多种不同的语言之间实现接口调用,只要生成的idl文件是同一个就可以,通过修改生成代码的命令,就可以生成不同的文件
TProtocol(协议层),定义数据传输格式,例如:

TBinaryProtocol:二进制格式;
TCompactProtocol:压缩格式;
TJSONProtocol:JSON格式;
TSimpleJSONProtocol:提供JSON只写协议, 生成的文件很容易通过脚本语言解析;
TDebugProtocol:使用易懂的可读的文本格式,以便于debug
TTransport(传输层),定义数据传输方式,可以为TCP/IP传输,内存共享或者文件共享等)被用作运行时库。

TSocket:阻塞式socker;
TFramedTransport:以frame为单位进行传输,非阻塞式服务中使用;
TFileTransport:以文件形式进行传输;
TMemoryTransport:将内存用于I/O,java实现时内部实际使用了简单的ByteArrayOutputStream;
TZlibTransport:使用zlib进行压缩, 与其他传输方式联合使用,当前无java实现;

Thrift支持的服务模型

TSimpleServer:简单的单线程服务模型,常用于测试;
TThreadPoolServer:多线程服务模型,使用标准的阻塞式IO;
TNonblockingServer:多线程服务模型,使用非阻塞式IO(需使用TFramedTransport数据传输方式);

Thrift实际上是实现了C/S模式,通过代码生成工具将thrift文生成服务器端和客户端代码(可以为不同语言),从而实现服务端和客户端跨语言的支持。用户在Thirft文件中声明自己的服务,这些服务经过编译后会生成相应语言的代码文件,然后客户端调用服务,服务器端提服务便可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值