Apache Thrift使用
首先需要下载Thrift,最好在Linux环境或这Mac下,Windows也提供了相应的版本。
在Windows上可以解压到任意目录,然后配置到环境变量中。
在项目src目录下创建thrift目录,新建data.thrift文件,名称并不重要。然后内容如下:
namespace java thrift.generated
typedef i16 short
typedef i32 int
typedef i64 long
typedef bool boolean
typedef string String
struct Person {
1: optional String username,
2: optional int age,
3: optional boolean married
}
exception DataException {
1: optional String message,
2: optional String callback,
3: optional String date
}
service PersonService {
Person getPersonByUsername(1: required String username) throws (1: DataException dataException),
void savePerson(1: required Person person) throws (1: DataException dataException)
}
然后进入工程目录下,在命令行执行:
thrift.exe -gen src/thrift/data.thrift
如下图,会生成gen-java及子目录:
把thrift及其子目录拷贝到我们的src/main/java下,
ThriftServer.java
package com.dongqiang.thrift;
import org.apache.thrift.TProcessorFactory;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.server.THsHaServer;
import org.apache.thrift.server.TServer;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TNonblockingServerSocket;
import org.apache.thrift.transport.TTransportException;
import thrift.generated.PersonService;
/**
* Created by dongqiang on 2017/6/25.
*/
public class ThriftServer {
public static void main(String[] args) throws TTransportException {
TNonblockingServerSocket socket = new TNonblockingServerSocket(8899);
THsHaServer.Args arg = new THsHaServer.Args(socket).minWorkerThreads(2).maxWorkerThreads(4);
PersonService.Processor<PersonServiceImpl> processor = new PersonService.Processor<>(new PersonServiceImpl());
//压缩工厂,协议层,数据压缩在网络上传输
arg.protocolFactory(new TCompactProtocol.Factory());
//传输层
arg.transportFactory(new TFramedTransport.Factory());
arg.processorFactory(new TProcessorFactory(processor));
//HsHa half synchronized half Asynchronized 半同步半异步
TServer server = new THsHaServer(arg);
System.out.println("Thrift Server Started!");
server.serve();
}
}
PersonServiceImpl.java
package com.dongqiang.thrift;
import org.apache.thrift.TException;
import thrift.generated.DataException;
import thrift.generated.Person;
import thrift.generated.PersonService;
/**
* Created by dongqiang on 2017/6/25.
*/
public class PersonServiceImpl implements PersonService.Iface {
@Override
public Person getPersonByUsername(String username) throws DataException, TException {
System.out.println("Got client param: " + username);
Person person = new Person();
person.setUsername(username);
person.setAge(20);
person.setMarried(false);
return person;
}
@Override
public void savePerson(Person person) throws DataException, TException {
System.out.println("Got client param.");
System.out.println(person.getUsername());
System.out.println(person.getAge());
System.out.println(person.isMarried());
}
}
ThriftClient.java
package com.dongqiang.thrift;
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;
import thrift.generated.Person;
import thrift.generated.PersonService;
/**
* Created by dongqiang on 2017/6/25.
*/
public class ThriftClient {
public static void main(String[] args) {
TTransport transport = new TFramedTransport(new TSocket("localhost", 8899, 600));
TProtocol protocol = new TCompactProtocol(transport);
PersonService.Client client = new PersonService.Client(protocol);
try {
//打开socket
transport.open();
Person person = client.getPersonByUsername("zhangsan");
System.out.println(person.getUsername());
System.out.println(person.getAge());
System.out.println(person.isMarried());
Person person1 = new Person();
person1.setUsername("lisi");
person1.setAge(22);
person1.setMarried(true);
client.savePerson(person1);
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
} finally {
transport.close();
}
}
}
运行结果:
Server
client
Thrift架构
Thdkkdf
fdsjkflsd
传输格式中前两种常用,第二种最多。
sdafd