thrift的Windows环境准备
首先在Apache官网下载thrift 编译应用,戳这里下载 Apache Thrift - Download
下载好windows 版本的exe文件。在c盘新建一个thrift文件夹,将下载好的thrift-xxx.exe文件该名成 thrift.exe,放入Thrift文件夹中。
配置环境变量
检查是否配置成功:
开发配置文件
在str目录下与main文件夹平级:
在idea中添加插件使用,它的插件相比来说比protobuf的插件要强大很多:
创建文件data.thrift里面包含其中设置命令空间为java路径
将thrift里面的数据类型定义成java类型,这样看起来比较舒服,而且使用起来也比较方便,现在对比发现相比之前那个protobuf来说好用多了o(* ̄︶ ̄*)o
namespace java thrift.generated
typedef i16 short
typedef i32 int
typedef i64 long
typedef string String
typedef bool boolean
struct Person {
1: required String username,
2: required int age,
3: required boolean married
}
exception DataException {
1: optional String message
2: optional String callStack
3: optional String data
}
service PersonService {
void savePerson(1: required Person person) throws (1: DataException dataException)
Person getPersonByUsername(1: required String username) throws (1: DataException dataException)
}
生成thrift相关java代码:
thrift --gen java .\src\thrift\data.thrift
将thrift的代码复制到java目录下,方便使用:
引入依赖
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.79.Final</version>
</dependency>
<!-- 依赖包地址:https://thrift.apache.org/download
https://thrift.apache.org/
-->
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>0.20.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.24</version>
</dependency>
这里提醒一下大家,没必要去看那些生产的java代码,直接看.thrift文件就可以了,直接了当,而且数据本身更具有可读性。
创建一个类,然后实现来自thrift中java代码中的接口,这种代码敲起来的感觉和写java的service层那里感觉很像
PersonServiceImpl:
服务端:
创建主函数来调用ThriftServer.java
其中NonblockingServerSocket是一个非阻塞式的socket
简单的和protobuf对比理解,相当于就是一个加入了很多处理器,对数据进行处理
package thrift.service.main;
import org.apache.thrift.TProcessorFactory;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.server.THsHaServer;
import org.apache.thrift.transport.TNonblockingServerSocket;
import org.apache.thrift.transport.TTransportException;
import org.apache.thrift.transport.layered.TFramedTransport;
import thrift.generated.PersonService;
import thrift.service.PersonServiceImpl;
public class ThriftServerBoot {
public static void main(String[] args) throws TTransportException {
TNonblockingServerSocket socket = new TNonblockingServerSocket(8899);
THsHaServer.Args arg = new THsHaServer.Args(socket).minWorkerThreads(1).maxWorkerThreads(10);
PersonService.Processor<PersonServiceImpl> personServiceProcessor = new PersonService.Processor<>(new PersonServiceImpl());
arg.protocolFactory(new TCompactProtocol.Factory());
arg.transportFactory(new TFramedTransport.Factory());
arg.processorFactory(new TProcessorFactory(personServiceProcessor));
THsHaServer server = new THsHaServer(arg);
server.serve();
}
}
客户端:
服务端用的是TFrameTransport,那客户端也得使用一样的:
600毫秒为超时时间;
package thrift.client.main;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.layered.TFramedTransport;
import thrift.generated.Person;
import thrift.generated.PersonService;
public class ThriftClientBoot {
public static void main(String[] args) throws TException {
TFramedTransport transport = new TFramedTransport(new TSocket("localhost", 8899), 600);
TCompactProtocol tCompactProtocol = new TCompactProtocol(transport);
PersonService.Client client = new PersonService.Client(tCompactProtocol);
transport.open();
Person mxl = client.getPersonByUsername("mxl");
System.out.println("Username:"+mxl.getUsername());
System.out.println("age:" +mxl.getAge());
System.out.println("married:"+mxl.isMarried());
Person person = new Person();
person.setAge(100);
person.setUsername("xiaoming");
person.setMarried(true);
client.savePerson(person);
}
}
运行服务端:
一直处于一个运行的状态;
运行客户端:
服务端收到结果 :
这样一来就解决了一个很大的问题,两台计算机远程调用彼此之间的信息。