使用thrift执行跨语言的远程过程调用

thrift是个跨语言的远程过程调用(RPC)服务,支持client和server以多种语言通讯。
可以在源代码lib/java中获得jar包。代码、接口示例可参考thrift源代码中的tutorial/tutorial.thrift,tutorial/java。使用:
一、定义接口IDL:xxx.thrift。支持的数据类型有:bool;byte: 有符号字节;i16: 16位有符号整型;i32: 32位有符号整型;i64: 64位有符号整型;double: 64位浮点型;string。其他类型有list、set、map、struct、exception、enum等。包用namespace/include声明/调用(类似c++)。服务接口用service声明,其中声明多个接口。

namespace java com.thrift.test.user //需要指定语言,否则生成代码报错。
struct User { //不支持继承
1: required i32 id; //每个域都有一个唯一数字标签,这些数字标签在传输时用来确定域
2: required string name;
}
service UserService {
i32 getId(1: User user);
void setName(1: User user, 2: string s);
}
参考:http://www.cnblogs.com/tianhuilove/archive/2011/09/05/2167669.html
二、通过thrift.exe,将IDL生成为代码,如thrift.exe -r -gen java test.thrift(-r对其中include的文件也生成服务代码)。生成的类有2个,User.java和UserService.java,分别对应结构体和服务。若有多个结构体或多个服务,就会生成多个对应的类。除此之外,若接口中定义了const常量,还会生成一个xxxConstants类。
在User.java中IDL结构体的域对应为_Fields,是一个enum型,这也就理解了定义中域的数字标签的意义,可以根据数字标签找到相应的域
public static _Fields findByThriftId(int fieldId) {
switch(fieldId) {
case 1: // ID
return ID;
case 2: // NAME
return NAME;
default:
return null;
}
}
另外,在该类中还提供了与的get/set、比较、toString、序列化以及read/write等操作
在UserService类中定义了Iface、AsyncIface接口以及client、AsyncClient、Processor、AsyncProcessor等类,其中有对接口方法的send_xxx,recv_xxx等操作,不需要动这个类。
三、自定义服务处理类UserHandler实现UserService.Iface/AsyncIface接口。其中对服务方法进行具体处理。
四、构建服务端监听方法。
public static void server() {
try {
Calculator.Processor processor = new UserService.Processor(new UserHandler());
TServerTransport serverTransport = new TServerSocket(9090);
TServer server = new TSimpleServer(new Args(serverTransport).processor(processor));
// Use this for a multithreaded server
// TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).processor(processor));
server.serve();
} catch (Exception e) {
e.printStackTrace();
}
}

五、构建客户端请求方法。
public static void main(String [] args) {
try {
TTransport transport = new TSocket("xxxx", 9090);
transport.open();
TProtocol protocol = new TBinaryProtocol(transport);
UserService.Client client = new UserService.Client(protocol);
perform(client); //调用接口提供的服务
transport.close();
} catch (TException x) {
x.printStackTrace();
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值