一、thrift介绍:
thrift是跨语言的远程调用开源框架,支持C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml等语言,支持无缝结合和高效服务。
thrift接口定义语言(IDL:Interface definition language):是thrift自己的一套接口定义语法,编写好接口定义文件后,通过thrift编译环境生成所需语言对应的接口文件,客户端和服务端分别使用自己需要的文件进行开发,实现rpc通讯。
二、接口定义文件示例USER.thrift:
service USER{
string checkUser(1:string strCd,2:string strPwd);
string getUserInfo(1:string strCd);
string getUserList();
string AddOneUser(1:string vstrCd,2:string vstrName,3:string vstrPwd,4:i32 role);
string UpdateOneUser(1:string vstrCd,2:string vstrName,3:string vstrPwd,4:i32 role);
string DelOneUsers(1:string vstrCd);
string queryLog(1:string vstrT,2:string vstrLogType,3:string vstrServerType);
}
三、thrift支持的数据类型:
基本类型
bool:布尔值,true或false,对应java的boolean
byte:8位有符号整数,对应java的byte
i16:16位有符号整数,对应java的short
i32:32位有符号整数,对应java的int
i64:64位有符号整数,对应java的long
double:64位浮点数,对应java的double
string:为止编码文本或二进制字符串,对应java的String
结构体类型:
struct:定义公共的对象,类似于c语言中的结构体定义,在java中是一个javabean
集合类型:
list:对应java中的ArrayList
set:对应java中的HashSet
map:对应java中的HashMap
异常类型:
exception:对应java中的Exception
服务类型:
service:对应服务的类
四、数据传输层Transport:
Tsocket:使用阻塞式I/O进行传输,是最常见的模式
TFramedTransport:使用非阻塞方式,按快的大小进行传输,类似于java中的NIO,若使用TFramedTransport的传输层,其服务器必须修改为非阻塞式的服务类型
TNonblockingTransport:使用非阻塞方式,用于构建异步客户端
五、数据传输协议Protocol:
thrift可以让用户选择客户端与服务端之间的传输通信协议类别,在传输协议书行总体划分为文本和二进制传输协议,为节约带宽,提高传输效率,一般情况下使用二进制类型的传输协议,有事还会使用基于文本类型的协议,这需要根据实际需求进行选择。
常用协议有以下几种:
TBinaryProtocol:二进制格式
TCompactProtocol:高效率的、密集的二进制压缩格式
TJSONProtocol:JSON格式
TSimpleJSONProtocol:提供JSON只写协议,生成的文件很容易通过脚本语言解析
客户端和服务端协议要一致。
服务器类型Server:
TSimpleServer:单线程服务器端使用标准的的阻塞式I/O,一般用于测试。
TThreadPoolServer:多线程服务端,使用标准的阻塞式I/O,预先创建一组线程出力请求
TNonblockingServer:多线程服务端,使用非阻塞式I/O,服务端和客户端需要制定TFramedTransport数据传输方式。
THsHaServer:半同步半异步的服务端模型,需要制定TFramedTransport的传输方式
六、服务端:
使用命令生成java语言接口类:thrift --gen java USER.thrift
生成的接口类示例:
接下来只需要实现接口类的各个接口即可完成服务端的开发:
七、客户端代码示例:
public class UserServerTest {
public static final int SERVER_PORT = 33288;
public static final String SERVER_IP = "127.0.0.1";
public static com.bitc.tsd2020.server.USER.Client client;
public static TTransport tTransport = null;
public UserServerTest() {
try {
tTransport = new TSocket(SERVER_IP, SERVER_PORT);
//协议要和服务端一致
TProtocol protocol = new TBinaryProtocol(tTransport);
client = new USER.Client(protocol);
tTransport.open();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
try{
UserServerTest userTest=new UserServerTest();
System.out.println(client.checkUser("admin", "admin"));
}catch(Exception e){
e.printStackTrace();
}
}
}