apache thrift基础学习

tech2024-01-14  65

下载编译器

http://thrift.apache.org/download

配置环境变量

下载完成后改名为thrift

在环境变量path中添加路径

验证

thrift --version

在idea中创建.thrift文件

namespace java thrift.generated //编译命令 thrift --gen java src/thrift/data.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) }
编译

编写实现类
public class PersonServiceImpl implements PersonService.Iface { @Override public Person getPersonByUserName(String userName) throws TException { System.out.println("userName:"+userName); Person person =new Person(); person.setUserName(userName); person.setAge(14); person.setMarried(false); return person; } @Override public void savePerson(Person person) throws TException { System.out.println("person:"+person); System.out.println(person.getUserName()); System.out.println(person.getAge()); System.out.println(person.isMarried()); } }
编写服务端
public class ThriftServer { public static void main(String[] args) throws TTransportException { /** * thrift支持的服务模型 * TSimpleServer 简单的单线程服务模型,常用于测试 * TThreadPoolServer 多线程服务模型,使用标准的阻塞式IO * TNonblockingServer 多线程服务模型,用用非阻塞式IO(需使用TFramedTransport数据传输方式) * THsHaServer -THsHa 引入了线程池去处理,其模型把读写任务放到线程池去处理;Half-sync/Half-async的处理模式,Half-async是在处理IO时间上(accept/read/write io) Half-sync用于handler对rpc的同步处理 */ TNonblockingServerSocket socket =new TNonblockingServerSocket(8899); THsHaServer.Args arg =new THsHaServer.Args(socket).minWorkerThreads(2).maxWorkerThreads(4); PersonService.Processor<PersonServiceImpl> processor =new PersonService.Processor<>(new PersonServiceImpl()); /** * 数据协议/格式 * TBinaryProtocol 二进制格式 * TCompactProtocol 压缩格式 * TJSONProtocol json格式 * TSimpleJSONProtocol 提供json只写协议,生成的文件很容易通过脚本语言解析 * TDebugProtocol 使用易懂的可读的文本格式,以便于debug */ arg.protocolFactory(new TCompactProtocol.Factory()); /** * 数据传输方式 * TSocket 阻塞式socket * TFramedTransport 以frame为单位进行传输,非阻塞式服务中使用 * TFileTransport 以文件形式进行传输 * TMemoryTransport 将内存用于I/O,java实现时内部实际使用了简单的ByteArrayOutPutStream * TZliTransport 使用zlib进行压缩,与其它传输方式联合使用,当前无java实现 */ arg.transportFactory(new TFastFramedTransport.Factory()); arg.processorFactory(new TProcessorFactory(processor)); TServer server =new THsHaServer(arg); System.out.println("thrift server started!"); server.serve(); } }
编写客户端
public class ThriftClient { public static void main(String[] args) { TTransport transport = new TFastFramedTransport(new TSocket("localhost", 8899), 600); TProtocol protocol = new TCompactProtocol(transport); PersonService.Client client = new PersonService.Client(protocol); try { transport.open(); Person person = client.getPersonByUserName("张三"); System.out.println(person.getUserName()); Person p =new Person(); p.setUserName("李四"); p.setAge(14); p.setMarried(true); client.savePerson(p); } catch (Exception e) { e.printStackTrace(); } finally { transport.close(); } } }
最新回复(0)