简介
thrift是由facebook开发的一个跨平台,跨语言RPC框架。于2007年贡献给apache基金会。在HBase中提供了跨平台的服务调用。本文以一个简单的例子来看下thrift在java中的使用,使用的是thrift-0.10.0。
案例
首先需要下载thrift的编译器。
写一个thrift的服务定义文件,Calculator.thrift:
service Calculator{
i32 add(1:i32 num1, 2:i32 num2),
}
上面只是一个Calculator服务包含add一个方法。
使用前面下载的thrift编译器进行编译
thrift-0.10.0.exe --gen java Calculator.thrift
之后就会生成一个java源码文件,将其放入项目,并添加Thrift需要的java依赖
compile group: 'org.apache.thrift', name: 'libthrift', version: '0.10.0'
接下来需要定义对应的服务器,客户端和服务实现
//服务器
public class JavaServer {
public static CalculatorHandler handler;
public static Calculator.Processor processor;
public static void main(String [] args) {
try {
handler = new CalculatorHandler();
processor = new Calculator.Processor(handler);
Runnable simple = new Runnable() {
public void run() {
simple(processor);
}
};
new Thread(simple).start();
/* 安全连接
Runnable secure = new Runnable() {
public void run() {
secure(processor);
}
};
new Thread(secure).start();
*/
} catch (Exception x) {
x.printStackTrace();
}
}
public static void simple(Calculator.Processor processor) {
try {
TServerTransport serverTransport = new TServerSocket(9090);
TServer server = new TSimpleServer(new Args(serverTransport).processor(processor));
// 需要多线程时使用下一行代码
// TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).processor(processor));
System.out.println("Starting the simple server...");
server.serve();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void secure(Calculator.Processor processor) {
try {
TSSLTransportParameters params = new TSSLTransportParameters();
params.setKeyStore("../../lib/java/test/.keystore", "thrift", null, null);
TServerTransport serverTransport = TSSLTransportFactory.getServerSocket(9091, 0, null, params);
TServer server = new TSimpleServer(new Args(serverTransport).processor(processor));
// 需要多线程时使用下一行代码
// TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).processor(processor));
System.out.println("Starting the secure server...");
server.serve();
} catch (Exception e) {
e.printStackTrace();
}
}
}
//客户端
public class JavaClient {
public static void main(String [] args) {
try {
TTransport transport;
transport = new TSocket("localhost", 9090);
transport.open();
/* ssl transport
TSSLTransportParameters params = new TSSLTransportParameters();
params.setTrustStore("../../lib/java/test/.truststore", "thrift", "SunX509", "JKS");
transport = TSSLTransportFactory.getClientSocket("localhost", 9091, 0, params);
*/
TProtocol protocol = new TBinaryProtocol(transport);
Calculator.Client client = new Calculator.Client(protocol);
perform(client);
transport.close();
} catch (TException x) {
x.printStackTrace();
}
}
private static void perform(Calculator.Client client) throws TException
{
//调用add方法
int sum = client.add(1,1);
System.out.println("1+1=" + sum);
}
}
//服务实现
public class CalculatorHandler implements Calculator.Iface {
public int add(int n1, int n2) {
System.out.println("add(" + n1 + "," + n2 + ")");
return n1 + n2;
}
}
运行服务端,服务端就会运行,之后运行客户端,然后就可以看到输出结果。