Thrift--实现NodeJS和Java间通信

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

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 - 可伸缩的跨语言服务开发框架

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值