实践常见的RPC框架:Thrift
一、Thrift介绍
维基百科上对Thrift的介绍如下:
Thrift是一种接口描述语言和二进制通讯协议,[1]它被用来定义和创建跨语言的服务。[2]它被当作一个远程过程调用(RPC)框架来使用,是由Facebook为“大规模跨语言服务开发”而开发的。它通过一个代码生成引擎联合了一个软件栈,来创建不同程度的、无缝的跨平台高效服务,可以使用C#、C++(基于POSIX兼容系统[3])、Cappuccino、[4]Cocoa、Delphi、Erlang、Go、Haskell、Java、Node.js、OCaml、Perl、PHP、Python、Ruby和Smalltalk。[5]虽然它以前是由Facebook开发的,但它现在是Apache软件基金会的开源项目了。该实现被描述在2007年4月的一篇由Facebook发表的技术论文中,该论文现由Apache掌管。[6]
需要安装thrift编译器,将Thrift的接口定义文件编译成对应的技术栈的代码。
二、Thrift使用示例
参考:
2.1 安装Thrift编译器
macbook下:
brew install thrift
可以在IDEA中添加Thrift support插件。
2.2 编写Thrift的IDL文件
参考官方的IDL文件示例:https://git-wip-us.apache.org/repos/asf?p=thrift.git;a=blob_plain;f=test/ThriftTest.thrift;hb=HEAD
myrpc.thrift 内容如下:
namespace java com.hef.demo.thrift.api
struct User {
1: i32 id,
2: string name
}
service UserService {
User findUser(1 : i32 id)
}
struct Order {
1: i32 id,
2: string name,
3: double amount
}
service OrderService {
Order findOrder(1 : i32 id)
}
运行thrift命令编译上面的文件: thrift -r --gen java myrpc.thrift , 之后就产生了四个java文件:User、UserService、Order、OrderService。
2.3 通过Thrift实现RPC功能
action-rpcfx-demo项目中三个模块 : demo-thrift-api 、demo-thrift-client 、demo-thrift-server 。
(1) demo-thrift-api
User、UserService、Order、OrderService 四个java文件都是通过Thirft命令生成的。
thrift -r --gen java myrpc.thrift
(2) demo-thrift-server 服务端代码
public static void main(String[] args) {
try {
TServerSocket tServerSocket = new TServerSocket(ServerConfig.SERVER_PORT);
TMultiplexedProcessor processor = new TMultiplexedProcessor();
processor.registerProcessor("userService", new UserService.Processor<>(new UserServiceImpl()));
processor.registerProcessor("orderService", new OrderService.Processor<>(new OrderServiceImpl()));
TThreadPoolServer.Args tArgs = new TThreadPoolServer.Args(tServerSocket);
tArgs.processor(processor);
tArgs.protocolFactory(new TBinaryProtocol.Factory());
tArgs.transportFactory(new TTransportFactory());
TSimpleServer server = new TSimpleServer(tArgs);
System.out.println("Running Simple server");
server.serve();
} catch (TTransportException e) {
throw new RuntimeException(e);
}
}
(3) demo-thrift-client 客户端代码
public static void main(String[] args) {
TTransport transport = null;
try {
transport = new TSocket(new TConfiguration(), ServerConfig.SERVER_HOST,
ServerConfig.SERVER_PORT, ServerConfig.TIMEOUT);
transport.open();
TBinaryProtocol protocol = new TBinaryProtocol(transport);
UserService.Client userService = new UserService.Client(new TMultiplexedProtocol(protocol, "userService"));
User user = userService.findUser(2);
System.out.println(user);
OrderService.Client orderService = new OrderService.Client(new TMultiplexedProtocol(protocol, "orderService"));
Order order = orderService.findOrder(3);
System.out.println(order);
} catch (TException e) {
throw new RuntimeException(e);
} finally {
if (transport!=null) {
transport.close();
}
}
}
|