Apache Thrift 是 Facebook 实现的一种高效的、支持多种编程语言的远程服务调用的框架
一:
首先加入thrift的java的依赖
<dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId> <version>0.9.3</version> </dependency>
二:
本文首先介绍一个简单的 Thrift 实现实例,使读者能够快速直观地了解什么是 Thrift 以及如何使用 Thrift 构建服务。
创建一个简单的服务Calculator。首先根据 Thrift 的语法规范编写脚本文件 Calculator.thrift,代码如下:
namespace java com.pp.calc service Calculator{ i32 add(1:i32 num1, 2:i32 num2) i64 multi(1:i32 num1, 2:i32 num2) }
thrift -r -gen java Calculator.thrift
这样,就会在当前目录下创建了一个gen-java目录,目录里面是java代码,把目录里面的东西放到项目的src目录中
编写Calculator.Iface(thrift自动生成的,这里就不贴出来了)接口的实现类
package com.pp.calc.impl; import org.apache.thrift.TException; import com.pp.calc.Calculator; public class CalculatorImpl implements Calculator.Iface { public int add(int num1, int num2) throws TException { return num1 + num2; } public long multi(int num1, int num2) throws TException { return Long.valueOf(num1 * num2); } }
package com.pp.server; import org.apache.thrift.TMultiplexedProcessor; import org.apache.thrift.protocol.TCompactProtocol; import org.apache.thrift.protocol.TProtocolFactory; import org.apache.thrift.server.TServer; import org.apache.thrift.server.TThreadPoolServer; import org.apache.thrift.transport.TServerSocket; import com.pp.calc.Calculator; import com.pp.calc.impl.CalculatorImpl; public class Server { public static final int PORT = 9988; public static void main(String[] args)throws Exception { TServerSocket serverSocket = new TServerSocket(PORT); TProtocolFactory protocolFactory = new TCompactProtocol.Factory(); TMultiplexedProcessor mp = new TMultiplexedProcessor(); mp.registerProcessor("Calculator", new Calculator.Processor<>(new CalculatorImpl())); final TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(serverSocket).protocolFactory(protocolFactory).processor(mp)); new Thread(() -> { //这个方法会阻塞线程 server.serve(); }).start(); System.out.println("Start server on port " + PORT + " ..."); } }
package com.pp.client; import org.apache.thrift.protocol.TCompactProtocol; import org.apache.thrift.protocol.TMultiplexedProtocol; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransport; import com.pp.calc.Calculator; public class Client { public static void main( String[] args)throws Exception { TTransport transport = new TSocket("127.0.0.1", 9988); transport.open(); TProtocol protocol = new TCompactProtocol(transport); TMultiplexedProtocol mp = new TMultiplexedProtocol(protocol, "Calculator"); Calculator.Client calc = new Calculator.Client(mp); System.out.println(calc.add(1, 222)); System.out.println(calc.multi(22, 33)); transport.close(); } }