四步完成跨平台调用——thrift的开发应用
一、安装thrift
首先,你要有个Linux平台,反正安装好了就行,用不着太多的东西。
thrift这个东东可以在http://www.thrift-rpc.org/下载。
具体在http://www.thrift-rpc.org/?p=thrift.git;a=shortlog;h=refs/misc/instant,一般点第一个snapshot就行了,这是最新的。版本几个小时更新一个,太牛叉了。
接下来,安装thrift。到thrift的解压目录,执行命令:
#chmod +x * //设置执行权限
#./bootstrap.sh
#./configure
#make
#make install
二、确定接口
平台与平台的方法调用或数据交换,需要依赖一组结构和一些方法。需要定义好这个方法,才可以进行接下来的开发。比如,我现在需要通过C#调用Java。如果说Java的服务端已经开发好了,那就非常像是适配器模式了。
现在书写一个简单的接口:
service ThriftTest
{
void work();
i32 test(1:string s);
}
(注:复杂一些的接口可以参考下载来包里的thrift\test目录下的*.thrift文件。)
现在开始生成代码:
# /home/xieping/thrift/compiler/cpp/thrift -gen java test.thrift
# /home/xieping/thrift/compiler/cpp/thrift -gen csharp test.thrift
分别生成了java和csharp的应用,在gen-java和gen-csharp目录下。
三、开发服务端
把Java下的ThriftTest类拷贝到项目中,注意添加package。定义服务类ThriftServer,实现ThriftTest.Iface接口。(项目需要引用thrift\lib\java\src里的项目。同时需要引用slf4j-log4j12-1.5.11.jar,slf4j-api-1.5.11.jar,log4j-1.3alpha-8.jar三个包。)
import org.apache.thrift.TException;
public class ThriftServer implements ThriftTest.Iface {
@Override
public int test(String s) throws TException {
// TODO Auto-generated method stub
return Integer.parseInt(s);
}
@Override
public void work() throws TException {
// TODO Auto-generated method stub
System.out.println("ccc");
}
}
在main方法中写入:
try {
ThriftServer t = new ThriftServer();
ThriftTest.Processor p = new ThriftTest.Processor(t);
TServerTransport serverTransport = new TServerSocket(9090);
TServer server = new TThreadPoolServer(p, serverTransport);
// Use this for a multithreaded server
// server = new TThreadPoolServer(processor, serverTransport);
System.out.println("Starting the server...");
server.serve();
} catch (Exception x) {
x.printStackTrace();
}
System.out.println("done.");
这里的Server有好几种,我使用了TThreadPoolServer.运行,服务端就OK了。
四、客户端调用
客户端把gen-csharp里的类,拷贝到项目中。引用thrift\lib\csharp\src里的项目。
然后编写代码:
static void Main(string[] args) {
TTransport transport = new TSocket("localhost",9090);
TProtocol protocol = new TBinaryProtocol(transport);
ThriftTest.Client client = new ThriftTest.Client(protocol);
transport.Open();
int val = client.test("1213");
client.work();
transport.Close();
Console.WriteLine(val);
}
运行,出结果了。
四步就完成了通过Thrift跨平台调用的目的。Java和C#还好些,php调用Java的相对来说使用上更广泛一些。