Thrift–实现NodeJS和Java间通信
Apache Thrift 是 Facebook 实现的一种高效的、支持多种编程语言的远程服务调用的框架。
它采用接口描述语言定义并创建服务,支持可扩展的跨语言服务开发,所包含的代码生成引擎可以在多种语言中,如 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk 等创建高效的、无缝的服务,其传输数据采用二进制格式,相对 XML 和 JSON 体积更小,对于高并发、大数据量和多语言的环境更有优势。
安装
nodejs(ver5.6.0)安装npm install thrift --save
Java(ver1.8.0)需要根据操作系统下载编译,window可直接下载使用:http://thrift.apache.org/download
使用
1.定义接口
声明RPC接口
namespace java service.demo
service Hello{
string helloString(1:string para)
}
通过thrift生成底层通信实现
#在当前目录下生成gen-java目录,里面有Hello.java
thrift -r -gen java Hello.thrift
#在当前目录下生成gen-nodejs目录,里面有Hello.js、Hello_types.js
thrift --gen js:node Hello.thrift
2.NodeJS实现
NodeJS服务端
var thrift = require("thrift");
var Hello = require('./Hello.js');
//RPC接口的实现
var helloImpl = {
helloString: function(result) {
console.log("receive: "+result);
return "receive: "+result;
}
}
//启动服务器,默认只支持TBufferedTransport和TBinaryProtocol
var server = thrift.createServer(Hello, helloImpl);
server.listen(9898);
NodeJS客户端
var thrift = require('thrift');
var Hello = require('./Hello.js');
var transport = thrift.TBufferedTransport;
var protocol = thrift.TBinaryProtocol;
var connection = thrift.createConnection("localhost", 9898, {
transport : transport,
protocol : protocol
});
//创建客户端
client = thrift.createClient(Hello, connection);
//处理异常
connection.on('error', function(err) {
console.error(err);
});
//这里的函数调用返回的是Promise,需要进一步处理
client.helloString('tomdog')
.then(log)
.catch(log);
function log(msg){
console.log(msg);
}
3.Java实现
Java引入thrift
<dependency>
<groupId>org.apache.thrift</groupId>
<artifactId>libthrift</artifactId>
<version>0.11.0</version>
</dependency>
RPC实现类
package thrift;
import org.apache.thrift.TException;
public class HelloServiceImpl implements Hello.Iface {
public String helloString(String para) throws TException {
System.out.println("receive: "+para);
return "result:"+para;
}
}
Java服务端
package thrift;
import org.apache.thrift.TProcessor;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;
public class HelloServiceServer {
public static void main(String[] args) {
try {
System.out.println("服务端开启....");
TProcessor tprocessor = new Hello.Processor<Hello.Iface>(new HelloServiceImpl());
TServerSocket serverTransport = new TServerSocket(9898);
TServer.Args tArgs = new TServer.Args(serverTransport);
tArgs.processor(tprocessor);
tArgs.protocolFactory(new TBinaryProtocol.Factory());
TServer server = new TSimpleServer(tArgs);
server.serve();
}catch (TTransportException e) {
e.printStackTrace();
}
}
}
Java客户端
package thrift;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;
public class HelloServiceClient {
public static void main(String[] args) {
System.out.println("客户端启动....");
TTransport transport = null;
try {
transport = new TSocket("localhost", 9898, 30000);
TProtocol protocol = new TBinaryProtocol(transport);
Hello.Client client = new Hello.Client(protocol);
transport.open();
String result = client.helloString("haha");
System.out.println(result);
transport.close();
} catch (TTransportException e) {
e.printStackTrace();
} catch (TException e) {
e.printStackTrace();
}
}
}
4.运行
Java和NodeJS能互通,但注意Java客户端能连上服务端(Java或NodeJS),接收结果后线程就会结束,而NodeJS 客户端能连上服务端,接收结果后线程仍在运行。

Apache Thrift是一个跨语言的服务开发框架,用于高效地进行多语言通信。本文详细介绍了如何在NodeJS和Java之间建立通信,包括安装Thrift、定义接口、在NodeJS和Java中实现服务端和客户端,并成功运行实现两者互通。

1067

被折叠的 条评论
为什么被折叠?



