环境

  • 系统 : Windows 7 64Bit
  • 语言 : Java

步骤

1. 工具生成代码

虽然 Thrift 支持不同语言,但是不同语言的调用方式和定义的方式并不一样,所以官方准备了一个生成指定语言调用方式的工具,我们只需要使用该工具生成调用 Thrift 的接口,然后调用这个类就可以了。

windows 平台想要调用该工具十分的简单,只需要在官方提供的地址下载一个可直接运行的二进制文件就可以了,不过需要注意的是,想要生成 Java 代码,还需要 Java 的运行环境才行(最后这不太确定,还没确认过)。
下载地址: thrift-0.11.0
修改下载文件名为 thrift.exe ,在所在目录直接使用 cmd 调用即可。
命令如下:

1
2
:: 根据 Test.thrift 生成 Java 文件
thrift -r -gen java Test.thrift

2. Spring Boot 项目

  1. 导入 thrift 的相关包
    在 pox.xml 中引用包

    1
    2
    3
    4
    5
    <dependency>
    <groupId>org.apache.thrift</groupId>
    <artifactId>libthrift</artifactId>
    <version>0.11.0</version>
    </dependency>
  2. 编写.thrift文件
    根据 Thrift 定义的语句编写接口文件 Test.thrift ,内容大致如下:

    1
    2
    3
    4
    5
    6
    7
    8
    //定义包位置
    namespace java com.reasuon.thrift
    //定义服务
    service Test{
    //定义接口
    string TestString(1:string param),
    i32 TestInteger(1:string param)
    }

    在 cmd 中使用 thrift.exe 生成 Java 代码,这个命令会生成一大串与 thrift 交互的 Java 代码,代码写的很简单清晰,感兴趣的可以看看,这里主要介绍生成的两个接口方法。

  3. 调用 Test.java
    Test.java 的包下创建实现类 TestServiceImpl.java,内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class TestServiceImpl implements Test.Iface {

    @Override
    public String TestString(String param) throws TException {
    return "Thrift 调用成功";
    }

    @Override
    public int TestInteger(String param) throws TException {
    return 1;
    }

    }
  4. 启动 thrift
    Thrift 的启动方式是启动一个专门的线程来实现功能,所以启动的方法比较随意,可以在 Spring 的启动方法 XXXXApplication.java 的 main 函数里面加入启动,也可以使用注解 @Bean ,将 thrift 的启动交由 Spring Boot 管理。
    这里展示使用最简单的方式,也就是在 XXXXApplication.java 的 main 中加入启动

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    @SpringBootApplication
    public class DemoApplication {

    public static void main(String[] args) {
    SpringApplication.run(DemoApplication.class, args);

    try {
    System.out.println("服务端开启....");
    TProcessor tprocessor = new Test.Processor<Test.Iface>(new TestImpl());
    // 简单的单线程服务模型
    TServerSocket serverTransport = new TServerSocket(8056);
    TServer.Args tArgs = new TServer.Args(serverTransport);
    tArgs.processor(tprocessor);
    tArgs.protocolFactory(new TBinaryProtocol.Factory());
    TServer server = new TSimpleServer(tArgs);
    server.serve();
    } catch (TTransportException e) {
    e.printStackTrace();
    }
    }
    }
  5. 测试
    编写一个简单的客户端对服务端做一个简单的测试,代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    class ThriftTests {

    public static void main (String args[]) {
    TTransport transport = null;
    try {
    transport = new TSocket("localhost", 8056, 30000);
    // 协议要和服务端一致
    TProtocol protocol = new TBinaryProtocol(transport);
    Test.Client client = new Test.Client(protocol);
    transport.open();
    String result = client.TestString("xxxx");
    Integer i = client.TestInteger("xxxx");
    System.out.println(result + "-->" + i);
    } catch (TTransportException e) {
    e.printStackTrace();
    } catch (TException e) {
    e.printStackTrace();
    } finally {
    if (null != transport) {
    transport.close();
    }
    }
    }
    }

    输出的内容如下:

    1
    Thrift 调用成功-->1