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,了解以上这个过程发生了什么。
阅读全文
0 0
- thrift(1)------基于thrift通信组件的简单RPC服务
- thrift系列 - harpc 基于thrift的轻量级rpc框架
- RPC-Thrift简单应用
- Thrift 个人实战--RPC服务的发布订阅实现(基于Zookeeper服务)
- Thrift使用入门-RPC服务
- 简单学习rpc -- thrift demos
- Thrift RPC
- Python thrift rpc TProcessPoolServer 原生的多进程服务模式
- VIP_OSP--基于Thrift的RPC框架的基本原理
- 基于Thrift的高可用RPC开源项目
- Apache Thrift基于RPC的远程调用 c++
- RPC框架-Thrift的使用
- hbase的thrift服务
- Hive的thrift服务
- Hive 的Thrift服务
- Thrift交流(一)简单的Thrift
- Thrift交流(一)简单的Thrift
- Thrift交流(一)简单的Thrift
- Python笔记6
- 剑指offer之丑数
- Java 多线程(PART IX) synchronized(II) 对对象进行加锁
- 【JZOJ 5395】【NOIP2017提高A组模拟10.6】Count
- struts2的原理和工作机制
- thrift(1)------基于thrift通信组件的简单RPC服务
- 二维数组中的查找
- CentOS7的网络配置
- 课后习题page101.pp3.4
- 请详细说下你对vue生命周期的理解?
- Homebrew包管理器的安装与使用
- [高级软件工程实验]内部模块化的命令行菜单小程序V2.0
- C 语言的浮点型问题
- Python Basics: Working with Strings