thrift(1)------基于thrift通信组件的简单RPC服务

来源:互联网 发布:淘宝自动装修软件 编辑:程序博客网 时间:2024/05/23 20:34

Thrift是facebook于2007年提交Apache基金会的一个开源项目,对于当时的facebook来说创造thrift是为了解决facebook系统中各系统间大数据量的传输通信以及系统之间语言环境不同需要跨平台的特性。

我想我把thrift的概念描述的再清楚,很多同学可能还是不知道thrift在实际中是干什么的以及怎么用的。

那么接下来不管你之前懂不懂thrift,我先直接给出一个基于thrift实现的一个简单RPC服务,我想这样对了解thrift会更直观一些。


我使用的开发环境如下:

eclipse

jdk1.6

libthrift-0.8.0.jar

我工程的目录结构如下图所示:


Thrfit服务定义是基于IDL(interface definition language),定义如下的thrift文件:

namespace java com.yujie.thrift.test//查询BooK请求struct QueryBookRequest {    /**书号*/1: required i32 bookId;    /**价格*/2: optional i32 price;    /**书名*/3: required string bookName;     /**是否可借阅*/4: required bool status;}//查询BooK请求相应struct QueryBookResponse{    /**图书拥有者*/1: required i32 ownerId;    /**图书拥有者年龄*/2: required i32 ownerAge;    /**图书拥有者姓名*/3: required string ownerName;}service ThriftTestService {/*** 查询图书信息*/QueryBookResponse getBookInfo(/**查询请求*/1:QueryBookRequest request;);}

执行如下的命令生成客户端和服务端的stub代码:

thrift -r --gen java --out . api.thrift
之后我们就会看到生成了QueryBookRequest、QueryBookResponse、ThriftTestService三个类,先不管这三个类的具体内容,我们继续往下写代码,依次实现服务端骨架代码、服务端逻辑代码、客户端代码。

import org.apache.thrift.TProcessor;import org.apache.thrift.protocol.TCompactProtocol;import org.apache.thrift.server.TNonblockingServer;import org.apache.thrift.server.TServer;import org.apache.thrift.transport.TNonblockingServerSocket;import com.yujie.thrift.service.ThriftTestServiceImpl;import com.yujie.thrift.test.ThriftTestService;import com.yujie.thrift.test.ThriftTestService.Iface;/** * thrift服务端代码 * @author yujie.wang * */public class ServerTest {public static void main(String[] args) {// TODO Auto-generated method stub TNonblockingServerSocket socket;          try {          //使用非阻塞服务端模型 监听端口6300            socket = new TNonblockingServerSocket(6300);              TNonblockingServer.Args options = new TNonblockingServer.Args(socket);              //服务端处理代码            TProcessor processor = new ThriftTestService.Processor<Iface>(new ThriftTestServiceImpl());              options.processor(processor);              options.protocolFactory(new TCompactProtocol.Factory());              TServer server = new TNonblockingServer(options);              System.out.println("Server start at 6300 port");              server.serve();                  } catch (Exception e) {              throw new RuntimeException(e);          }  }}

import org.apache.thrift.TException;import com.yujie.thrift.test.QueryBookRequest;import com.yujie.thrift.test.QueryBookResponse;import com.yujie.thrift.test.ThriftTestService;/** * 服务端具体逻辑代码 * 服务实现ThriftTestService.Iface 同步接口 * @author yujie.wang * */public class ThriftTestServiceImpl implements ThriftTestService.Iface{@Overridepublic QueryBookResponse getBookInfo(QueryBookRequest request)throws TException {// TODO Auto-generated method stubQueryBookResponse response = new QueryBookResponse();response.setOwnerAge(20);response.setOwnerId(20171005);response.setOwnerName("yujie.wang");return response;}}

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 com.yujie.thrift.test.QueryBookRequest;import com.yujie.thrift.test.QueryBookResponse;import com.yujie.thrift.test.ThriftTestService;/** * thrift服务客户端 * @author yujie.wang * */public class ClientTest {public static void main(String[] args)  {// TODO Auto-generated method stubtry {TSocket socket = new TSocket("127.0.0.1", 6300);          socket.setTimeout(3000);          //传输层        TTransport transport = new TFramedTransport(socket);          //采用TCompactProtocol协议层编码数据        TProtocol protocol = new TCompactProtocol(transport);          //连接服务端        transport.open();          System.out.println("try to Connected to Server");          //设置客户端stub桩代码        ThriftTestService.Client client = new ThriftTestService.Client.Factory()                  .getClient(protocol);          //构造客户端请求参数        QueryBookRequest request = new QueryBookRequest();        request.setBookId(100);        request.setPrice(199);        request.setStatus(true);        request.setBookName("thinking in java");        //调用接口        QueryBookResponse response = client.getBookInfo(request);        if(response != null){        System.out.println("age: "+response.getOwnerAge() + " name: "+ response.getOwnerName()+ " id: "+ response.getOwnerId());        } else {        System.out.println("response == null");        }} catch (Exception e) {// TODO: handle exceptionSystem.out.println("exception: "+e);}}}

运行服务端代码和客户端代码依次输出如下结果:





有了thrift最直观的初体验,接下来我们开始慢慢深入thrift,了解以上这个过程发生了什么。

原创粉丝点击