使用:
先在官网下载对应的编译器,然后在项目里配置好依赖
之后我们就可以编写我们的idl文件了
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 callStack, 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) }
之后我们就用我们的下载的编译器来根据我们的idl文件来编译
我们只需要使用 thrift-0.12.0.exe Java + 文件名 就可以使用了。
最后生成了我们idl文件里对应的信息
之后我们就可以编写我们的客户端和服务器端来实现远程过程通信了。
注意,服务端的接口工作内容由我们自己实现
public class PersonServiceImpl implements PersonService.Iface { @Override public Person getPersonByUsername(String username) throws DataException, TException { System.out.println("get client param: " + username); Person person = new Person().setAge(18).setUsername("zhangsan").setMarried(true); return person; } @Override public void savePerson(Person person) throws DataException, TException { System.out.println("get client param: "); System.out.println(person.getAge()); System.out.println(person.getUsername()); System.out.println(person.isMarried()); } }
服务端:
public class ThriftServer { public static void main(String[] args) throws Exception { TNonblockingServerSocket socket = new TNonblockingServerSocket(8080); THsHaServer.Args ags = new THsHaServer.Args(socket).minWorkerThreads(2).maxWorkerThreads(4); PersonService.Processor<PersonServiceImpl> processor = new PersonService.Processor<>(new PersonServiceImpl()); ags.protocolFactory(new TCompactProtocol.Factory()); ags.transportFactory(new TFramedTransport.Factory()); ags.processorFactory(new TProcessorFactory(processor)); TServer server = new THsHaServer(ags); System.out.println("server started..."); server.serve(); } }
客户端:
public class ThriftClient { public static void main(String[] args) { TTransport transport = new TFramedTransport(new TSocket("localhost", 8080), 600); TProtocol protocol = new TCompactProtocol(transport); PersonService.Client client = new PersonService.Client(protocol); try { transport.open(); Person person = client.getPersonByUsername("zhangsan"); System.out.println(person.getUsername()); System.out.println(person.getAge()); System.out.println(person.isMarried()); System.out.println("----------"); Person newPerson = new Person().setAge(20).setUsername("lisi").setMarried(false); client.savePerson(newPerson); } catch (Exception e) { e.printStackTrace(); } finally { transport.close(); } } }
之后启动服务端, 客户端就可以实现通讯了。
原理:
官网的指南
1. 先下载Apache thrift
2. 如果是Linux环境要编译,安装
./configure && make
3.编写一个 .thrift的文件
这个文件定义了thrift的类型和服务信息,这些服务由服务器端实现,由客户端来调用
4.之后使用命令就可以了
服务器端:
1. 服务器端要设置一个socket来绑定端口
socket有两种,阻塞式的和非阻塞式的
TServerSocket, TNonblockingServerSocket
他们都是 TServerTransport 的子类
2.创建好socket之后我们就可以创建服务器来使用这个socket了
服务器也有很多种,上面我们使用的是 THsHaServer
这是一个基于frame(块)传输信息的
3. 之后就是一些服务器的参数设置了,比如线程数,传输的协议,以及我们要处理的服务实现等等信息,设置好了之后就可以启动了。
客户端:
客户端也是指定了要连接的服务器的ip,端口号之后就可以启动了。
之后就会像调用本地方法一样来调用远程的接口来返回结果了。