简介

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;
    }
}

运行服务端,服务端就会运行,之后运行客户端,然后就可以看到输出结果。