`
goofyan
  • 浏览: 14635 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

使用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();
    } 
  }

   
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics