thrift(1)------基于thrift通信组件的简单RPC服务
2017-10-06 22:08
951 查看
Thrift是facebook于2007年提交Apache基金会的一个开源项目,对于当时的facebook来说创造thrift是为了解决facebook系统中各系统间大数据量的传输通信以及系统之间语言环境不同需要跨平台的特性。
我想我把thrift的概念描述的再清楚,很多同学可能还是不知道thrift在实际中是干什么的以及怎么用的。
那么接下来不管你之前懂不懂thrift,我先直接给出一个基于thrift实现的一个简单RPC服务,我想这样对了解thrift会更直观一些。
我使用的开发环境如下:
eclipse
jdk1.6
libthrift-0.8.0.jar
我工程的目录结构如下图所示:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/21/7fa73fea19cbcf539333ec988981b18b)
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);
}
}
}
运行服务端代码和客户端代码依次输出如下结果:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/21/46bef8c22aff6a0913983ddba7f83f1f)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202009/21/96f5f927522d47189f45c96acf0c87e5)
有了thrift最直观的初体验,接下来我们开始慢慢深入thrift,了解以上这个过程发生了什么。
我想我把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{ @Override public QueryBookResponse getBookInfo(QueryBookRequest request) throws TException { // TODO Auto-generated method stub QueryBookResponse 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 stub try { 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 exception System.out.println("exception: "+e); } } }
运行服务端代码和客户端代码依次输出如下结果:
有了thrift最直观的初体验,接下来我们开始慢慢深入thrift,了解以上这个过程发生了什么。
相关文章推荐
- 远程调用服务(RPC)和基于消息的通信(Message Queue)对比
- Thrift 个人实战--RPC服务的发布订阅实现(基于Zookeeper服务)
- 基于TCP的RPC服务的简单开发
- 基于thrift的node.js rpc服务
- 基于Thrift搭建跨语言RPC服务
- 简单RPC框架-基于Consul的服务注册与发现
- 简单RPC框架-基于Consul的服务注册与发现
- Thrift 个人实战--RPC服务的发布订阅实现(基于Zookeeper服务)
- 简单RPC框架-基于Consul的服务注册与发现
- 基于Thrift(C++)的hBase通信接口开发文档整理
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- 构建简单的 C++ 服务组件,第 2 部分: 通过服务组件体系结构使用 Python、Ruby 和 Web 服务
- Android四大组件之Service(观第一行代码2随记)二.活动与服务间通信相关
- 基于thrift的微服务框架
- 架构设计:系统间通信(11)——RPC实例Apache Thrift 上篇
- C++基于TCP/IP简单的客户端、服务器通信程序实例
- 【远程调用框架】如何实现一个简单的RPC框架(四)优化二:改变底层通信框架
- 尝试的基于 Windows Server 2003 计算机上运行 SQL Server 2005 实例上安装 UDDI 服务数据库组件时可能收到错误信息
- 基于HTTP协议的轻量级开源简单队列服务:HTTPSQS
- socket 网络编程高速入门(一)教你编写基于UDP/TCP的服务(client)通信