一、环境与配置
1.操作系统Win10
2.IDEA Java
3.Thrift version 0.10.0
二、准备工作
1.下载 thrift.exe 文件(本文附件中)
2.配置环境变量
D盘创建文件夹 thrift 把 thrift.exe 文件放在下面 D:\thrift\thrift.exe
3.Maven 中加入 lib 库
<dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId> <version>0.10.0</version> </dependency>
4.命令行下输入 thrift -version 检测是否配置成功
三、生成相应语言代码
1. 创建 .thrift 文件
目录结构
Hello.thrift
namespace java com.dokee.manager.core.thrift enum RequestType { SAY_HELLO, //问好 QUERY_TIME, //询问时间 } struct HelloWordRequest { 1: required RequestType type; // 请求的类型,必选 2: required string name; // 发起请求的人的名字,必选 3: optional i32 age; // 发起请求的人的年龄,可选 } exception RequestException { 1: required i32 code; 2: optional string reason; } // 服务名 service HelloWordHandle { string doAction(1: HelloWordRequest request) throws (1:RequestException qe); // 可能抛出异常。 }
基本语法与详细介绍请参考
http://www.jianshu.com/p/0f4113d6ec4b
2.生成对应代码
命令行下 cd 到 对应.thrift 文件目录中 ,然后输入 thrift --gen javaHello.thrift
会输出对应语言的代码
3.实现对应接口
实现thrift 命令中生成的 接口 HelloWordHandle.Iface HelloWordHandleImpl.java package com.dokee.manager.core.thrift.impl; import com.dokee.manager.core.thrift.HelloWordHandle; import com.dokee.manager.core.thrift.HelloWordRequest; import com.dokee.manager.core.thrift.RequestException; import com.dokee.manager.core.thrift.RequestType; import org.apache.thrift.TException; import org.common5iq.util.Utils; import java.util.Date; public class HelloWordHandleImpl implements HelloWordHandle.Iface { // 实现这个方法完成具体的逻辑。 public String doAction(HelloWordRequest request) throws RequestException, TException { System.out.println("Get request: " + request); if (Utils.isBlank(request.getName()) || request.getType() == null) { throw new RequestException(); } String result = "Hello, " + request.getName(); if (request.getType() == RequestType.SAY_HELLO) { result += ", Welcome!"; } else { result += ", Now is " + new Date().toLocaleString(); } return result; } }
四、测试
1.创建服务器端
此次用java作为服务器端 HelloWordServer.java 也可用C++作为服务器端来测试
import org.apache.thrift.TProcessor; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TCompactProtocol; import org.apache.thrift.server.TServer; import org.apache.thrift.server.TThreadedSelectorServer; import org.apache.thrift.transport.TFramedTransport; import org.apache.thrift.transport.TNonblockingServerSocket; /** * @author qifuguang * @date 15/9/11 16:07 */ public class HelloWordServer { public static final int SERVER_PORT = 8989; public static void main(String[] args) throws Exception { TProcessor tprocessor = new HelloWordHandle.Processor(new HelloWordHandleImpl()); // 传输通道 - 非阻塞方式 TNonblockingServerSocket serverTransport = new TNonblockingServerSocket(SERVER_PORT); //多线程半同步半异步 TThreadedSelectorServer.Args tArgs = new TThreadedSelectorServer.Args(serverTransport); tArgs.processor(tprocessor); tArgs.transportFactory(new TFramedTransport.Factory()); //二进制协议 tArgs.protocolFactory(new TCompactProtocol.Factory()); // 多线程半同步半异步的服务模型 TServer server = new TThreadedSelectorServer(tArgs); System.out.println("HelloTThreadedSelectorServer start...."); server.serve(); // 启动服务 } }(new HelloWordHandleImpl()); // 传输通道 - 非阻塞方式 TNonblockingServerSocket serverTransport = new TNonblockingServerSocket(SERVER_PORT); //多线程半同步半异步 TThreadedSelectorServer.Args tArgs = new TThreadedSelectorServer.Args(serverTransport); tArgs.processor(tprocessor); tArgs.transportFactory(new TFramedTransport.Factory()); //二进制协议 tArgs.protocolFactory(new TCompactProtocol.Factory()); // 多线程半同步半异步的服务模型 TServer server = new TThreadedSelectorServer(tArgs); System.out.println("HelloTThreadedSelectorServer start...."); server.serve(); // 启动服务 } } 运行 HelloWordServer.java 控制台打印 2.创建 HelloClient.java import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TCompactProtocol; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TFramedTransport; import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransport; /** * @author qifuguang * @date 15/9/11 16:13 */ public class HelloWordClient { public static final String SERVER_IP = "localhost"; public static final int SERVER_PORT = 8989; public static final int TIMEOUT = 30000; public static void main(String[] args) throws Exception { //设置传输通道,对于非阻塞服务,需要使用TFramedTransport,它将数据分块发送 TTransport transport = new TFramedTransport(new TSocket(SERVER_IP, SERVER_PORT, TIMEOUT)); //使用高密度二进制协议 TProtocol protocol = new TCompactProtocol(transport); // 创建client HelloWordHandle.Client client = new HelloWordHandle.Client(protocol); transport.open(); // 建立连接 // 第一种请求类型 HelloWordRequest request = new HelloWordRequest() .setType(RequestType.SAY_HELLO).setName("winwill2012").setAge(24); System.out.println(client.doAction(request)); // 第二种请求类型 request.setType(RequestType.QUERY_TIME).setName("winwill2012"); System.out.println(client.doAction(request)); transport.close(); // 请求结束,断开连接 } } 运行 HelloClient.java 控制台打印 五、注意事项 1.客户端与服务器端传输协议一致 同时使用 TCompactProtocol 或者 TBinaryProtocol 不一直会报错 2.文件下载 Hello.thrift 等文件 以及 生成的相关代码 , 链接: https://pan.baidu.com/s/1kVaGT6Z 密码: zeuq 链接: https://pan.baidu.com/s/1hsOmaaS 密码: fqqq