成功的秘诀,在永不改变既定的目的。 —— 卢梭
Thrift简介
The Apache Thrift software framework, for scalable cross-language services development, combines a software stack with a code generation engine to build services that work efficiently and seamlessly between C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi and other languages.
通过官方介绍,我们可以了解到Thrift是一个软件框架,可以提供跨语言的服务开发。Thrift框架包含一个软件栈,包含生成各种语言的引擎,我们通过Thrift提供的接口定义语言(IDL)来定义接口,然后引擎会自动生成各种语言的代码。
Windows平台下Thrift安装与使用
下载与安装
下载地址:点我下载Thrift
建议:修改名称为Thrift.exe,方便使用
建议:配置环境变量
在系统变量Path中添加Thrift路径到环境变量中
使用
定义helloServer.thrift文件
在本例中,定义了一个用户对象User,包含两个字段,用户姓名username,用户年龄age,定义了一个接口sayHello(User user),返回用户姓名和年龄。
namespace java cn.ac.ict.software.thrift
struct User {
1: string username,
2: i32 age,
}
service HelloWorldService {
string sayHello(1:User user)
}
定义完成helloServer.thrift文件之后我们使用命令thrift -r --gen java helloServer.thrift生成代码,如下图所示。
可以看到生成的代码包含两个类,HelloWorldService.java和User.java类,如下图所示。
随后,把自动生成的代码添加到项目中去,如下图所示。
添加完代码发现build会报错,查看日志发现是因为没有添加Thrift依赖的库文件,我使用的是gradle来开发,添加Thrift的依赖就可以了,在build.gradlezhong 添加如下代码
// https://mvnrepository.com/artifact/org.apache.thrift/libthrift
compile group: 'org.apache.thrift', name: 'libthrift', version: '0.10.0'
如果你使用的是mawen来添加依赖的话,可以添加如下代码
<!-- https://mvnrepository.com/artifact/org.apache.thrift/libthrift -->
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>0.10.0</version>
</dependency>
更多的添加方式,大家可以参考http://mvnrepository.com/artifact/org.apache.thrift/libthrift
客户端代码
客户端主要是将User对象发送给服务端,首先,实例化TTransport ,设置IP地址、服务端口port、超时时间timeout等。然后设置协议TProtocol ,注意要和服务端保持一致。接着调用接口sayHello把User对象传递过去。
public class HelloClient {
private static final String SERVER_IP = "localhost";
private static final int SERVER_PORT = 8090;
private static final int TIMEOUT = 30000;
public void startClient() {
TTransport transport = null;
try {
transport = new TSocket(SERVER_IP, SERVER_PORT, TIMEOUT);
// 协议要和服务端一致
TProtocol protocol = new TBinaryProtocol(transport);
// TProtocol protocol = new TCompactProtocol(transport);
// TProtocol protocol = new TJSONProtocol(transport);
HelloWorldService.Client client = new HelloWorldService.Client(protocol);
transport.open();
User user = new User();
user.username = "haiker";
user.age = 26;
String result = client.sayHello(user);
System.out.println("Thrify client result =: " + result);
} catch (TException e) {
e.printStackTrace();
} finally {
if (null != transport) {
transport.close();
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
HelloClient client = new HelloClient();
client.startClient();
}
}
HelloWorldImpl代码
HelloWorldImpl代码implents定义的接口sayHello,本例中只是简单的把姓名和年龄返回。
public class HelloWorldImpl implements HelloWorldService.Iface{
@Override
public String sayHello(User user) throws TException {
return "Hi,My name is " + user.username + " and My age is " + user.age;
}
}
服务端代码
服务端代码首先要实例化TProcessor,传入我们具体的HelloWorldImpl类,本例中我们使用简单的单线程服务模型TSimpleServer来开启一个服务。
public class HelloServer {
private static final int SERVER_PORT = 8090;
public void startServer() {
try {
System.out.println("HelloWorld TSimpleServer start ....");
TProcessor tprocessor = new HelloWorldService.Processor<>(new HelloWorldImpl());
// 简单的单线程服务模型,一般用于测试
TServerSocket serverTransport = new TServerSocket(SERVER_PORT);
TServer.Args tArgs = new TServer.Args(serverTransport);
tArgs.processor(tprocessor);
tArgs.protocolFactory(new TBinaryProtocol.Factory());
TServer server = new TSimpleServer(tArgs);
server.serve();
} catch (Exception e) {
System.out.println("Server start error!!!");
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
HelloServer server = new HelloServer();
server.startServer();
}
}
总结
本文主要探讨了Thrift在Windows中的安装和简单使用,以后会继续深入探讨Thrift在Linux中的安装与使用、Thrift的原理等。