Thrift实战开发

1、概述
前面一节,我们说了Thrift安装及开发环境准备工作,这一节把主要Thrift IDL规范回顾一下,不常用语法规范在这里不一一列举出来;我们可以把Thrift看作是一个编程语言,那么形成一套语法规范,如接口怎么定义、有什么数据类型、方法怎么定义、变量怎么申明与赋值、命名空间(包)、常量等一系列规定;回答上述的问题,我们就清楚Thrift IDL语法规范,自然知道如何编写thrift文件。

     

    2、数据类型

 

    2.1 基本数据类型

 

Java代码   收藏代码
  1. • bool: 布尔类型  
  2. • byte: 字节  
  3. • i16: 带符号16位整型  
  4. • i32: 带符号32位整型  
  5. • i64: 带符号64位整型  
  6. • double: 带符号64位浮点型  
  7. • string: 字符串类型(UTF-8编码)  
  8. Note: There is no support for unsigned integer types, due to the fact that there are no   
  9. native unsigned integer types in many programming languages. Signed integers can be   
  10. safely cast to their unsigned counterparts when necessary.  

   

 

    2.2 特殊类型

Java代码   收藏代码
  1. binary: 二进制  

 

 

    2.3 结构体类型(类似C语言风构),类似JavaBean定义实体类型

Java代码   收藏代码
  1. struct bean{  
  2.    1:i32 number=10,  
  3.    2:i64 bigNumber,  
  4.    3:double decimals,  
  5.    4:string name="thrifty"  
  6. }  

 

    2.4 集合类型(包括list、set、map)

 

Java代码   收藏代码
  1. • list (Maps to c++ STL vector, Java ArrayList etc)  
  2. • set (Maps to an STL set, Java HashSet etc)  
  3.   PHP doesn’t support sets - so it is treated similar to a List map  
  4. • map (Maps to an STL map, Java HashMap etc)  
  5.   All the above are the defaults but can be customized to correspond to different   
  6.   types of any language. For this reason custom code generation directives have been   
  7.   added.  

    

 

    3、接口、方法、命名空间定义,关键字service,类似Java接口定义

 

Java代码   收藏代码
  1. namespace java com.java // 命名空间定义,规范:namespace + 语言 + 包路径  
  2. service Hello{ // 接口定义,类似Java接口定义  
  3.    string getWord(), // 方法定义,类似Java接口定义  
  4.    void writeWold(1:string words) //参数类型指定  
  5. }  

 

 

    4、异常定义

Java代码   收藏代码
  1. exception InvalidOperation {  
  2.   1: i32 what,  
  3.   2: string why  
  4. }  

 

    更多类型定义,如枚举等,请参考官网:https://thrift.apache.org/docs/idl

    

    5、实例步聚

 

    5.1 定义Thrift文件(hello.thrift)

Java代码   收藏代码
  1. namespace java com.java  
  2. service Hello{  
  3.    string getWord(),  
  4.    void writeWold(1:string words)  
  5. }  

 

    5.2 生成Java文件(Hello.java)

    

Java代码   收藏代码
  1. //执行命令,以Java为例  
  2. thrift -r --gen java hello.thrift  

 

    5.3 创建Maven项目,引入thrift包,将Hello.java拷入项目中

 

Java代码   收藏代码
  1. <dependency>  
  2.   <groupId>org.apache.thrift</groupId>  
  3.   <artifactId>libthrift</artifactId>  
  4.   <version>0.9.2</version>  
  5. </dependency>  
  6. <dependency>  
  7.   <groupId>commons-codec</groupId>  
  8.   <artifactId>commons-codec</artifactId>  
  9.   <version>1.9</version>  
  10. </dependency>  
  11. <dependency>  
  12.   <groupId>org.slf4j</groupId>  
  13.   <artifactId>slf4j-log4j12</artifactId>  
  14.   <version>1.5.8</version>  
  15. </dependency>  
  16. <dependency>  
  17.   <groupId>log4j</groupId>  
  18.   <artifactId>log4j</artifactId>  
  19.   <version>1.2.12</version>  
  20. </dependency>  

 

    5.4 编写Thrift接口实现

     

Java代码   收藏代码
  1. package com.java;  
  2. import org.apache.thrift.TException;  
  3. import org.slf4j.Logger;  
  4. import org.slf4j.LoggerFactory;  
  5. /** 
  6.  * Hello World实现; Hello.Iface为Hello.java中的接口 
  7.  * 
  8.  */  
  9. public class HelloImpl implements Hello.Iface{  
  10.       
  11.     private Logger log = LoggerFactory.getLogger(getClass());  
  12.       
  13.     @Override  
  14.     public String getWord() throws TException {  
  15.           
  16.         return "Hello World!";  
  17.     }  
  18.       
  19.     @Override  
  20.     public void writeWold(String words) throws TException {  
  21.         log.info("【服务端】:接收客户端信息:"+ words);  
  22.     }  
  23.       
  24. }  

 

    5.5 编写Thrift服务端及客户端

    

Java代码   收藏代码
  1. /*** 
  2. * 服务端 
  3. */  
  4. package com.java;  
  5. import java.net.InetSocketAddress;  
  6. import org.apache.thrift.protocol.TBinaryProtocol;  
  7. import org.apache.thrift.protocol.TBinaryProtocol.Factory;  
  8. import org.apache.thrift.server.TServer;  
  9. import org.apache.thrift.server.TThreadPoolServer;  
  10. import org.apache.thrift.server.TThreadPoolServer.Args;  
  11. import org.apache.thrift.transport.TServerSocket;  
  12. import org.apache.thrift.transport.TTransportException;  
  13. import org.slf4j.Logger;  
  14. import org.slf4j.LoggerFactory;  
  15.   
  16. import com.java.Hello.Iface;  
  17. import com.java.Hello.Processor;  
  18.   
  19. /** 
  20.  * Hello World服务端 
  21.  * @author oy 
  22.  * 
  23.  */  
  24. public class HelloServer {  
  25.       
  26.     private static Logger log = LoggerFactory.getLogger(HelloServer.class);  
  27.     // 服务器IP地址  
  28.     private String ip;  
  29.     // 服务端绑定端口,即监听端口  
  30.     private int port;  
  31.       
  32.     private static TServerSocket transport;  
  33.       
  34.     private static Hello.Processor<Iface> processor;  
  35.       
  36.     public HelloServer(String ip, int port){  
  37.         this.ip = ip ;  
  38.         this.port = port ;  
  39.         try {  
  40.             transport = new TServerSocket(new InetSocketAddress(this.ip, this.port));  
  41.             log.info("Thrif服务器绑定成功!");  
  42.         } catch (TTransportException e) {  
  43.             log.error("Thrif服务器绑定失败", e);  
  44.         }  
  45.     }  
  46.       
  47.     public void startServer(Iface iface){  
  48.         processor = new Processor<Iface>(iface);  
  49.         // 协议层:二进制  
  50.         Factory factory = new TBinaryProtocol.Factory(truetrue);  
  51.         // 传输层  
  52.         Args args = new Args(transport);  
  53.         // 执行处理器(绑定业务逻辑处理器)  
  54.         args.processor(processor);   
  55.         args.protocolFactory(factory);  
  56.         // 服务  
  57.         TServer server = new TThreadPoolServer(args);      
  58.         server.serve();      
  59.     }  
  60.       
  61.     public static void main(String[] args) {  
  62.         Iface hello = new HelloImpl();  
  63.         // 启动服务  
  64.         new HelloServer("localhost",9090).startServer(hello);  
  65.         log.info("Thrif服务器启动成功!");  
  66.     }  
  67. }  

 

    

Java代码   收藏代码
  1. /** 
  2. * 客户端 
  3. */  
  4. package com.java;  
  5. import org.apache.thrift.TException;  
  6. import org.apache.thrift.protocol.TBinaryProtocol;  
  7. import org.apache.thrift.protocol.TProtocol;  
  8. import org.apache.thrift.transport.TSocket;  
  9. import org.apache.thrift.transport.TTransport;  
  10. import org.apache.thrift.transport.TTransportException;  
  11. import org.slf4j.Logger;  
  12. import org.slf4j.LoggerFactory;  
  13.   
  14. /** 
  15.  * Hello World客户端 
  16.  * @author oy 
  17.  * 
  18.  */  
  19. public class HelloClient {  
  20.       
  21.     private static Logger log = LoggerFactory.getLogger(HelloClient.class);  
  22.       
  23.     public static void main(String[] args) {  
  24.          TTransport transport = null;      
  25.             try {      
  26.                 transport = new TSocket("localhost"9090);     
  27.                 // 协议处理  
  28.                 TProtocol protocol = new TBinaryProtocol(transport);      
  29.                 Hello.Client client = new Hello.Client(protocol);   
  30.                 transport.open();  
  31.                 log.info("【客户端】:获取服务端信息:" + client.getWord());   
  32.                 client.writeWold("Hello World!");  
  33.                 transport.close();      
  34.                 log.info("【客户端】Thrift客户端关闭连接!");    
  35.             } catch (TTransportException e) {      
  36.                 e.printStackTrace();      
  37.             } catch (TException e) {      
  38.                 e.printStackTrace();      
  39.             }      
  40.     }  
  41. }  

   

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值