Nodejs利用thrift与其他语言通信

Nodejs利用thrift与其他语言通信

哈,我们线上用的模块涵盖了java/php/python/node.js,中间通信都是使用thrift的

14 回复

Nodejs利用Thrift与其他语言通信

引言

在微服务架构中,服务之间需要进行高效且可靠的通信。Apache Thrift 是一个强大的跨语言服务框架,可以实现多种编程语言之间的高效通信。本文将介绍如何在Node.js中使用Thrift与Java、PHP、Python等其他语言的服务进行通信。

安装Thrift

首先,你需要安装Thrift库。可以通过npm来安装Node.js版本的Thrift库:

npm install thrift

定义Thrift接口

为了确保不同语言的服务能够互相通信,需要定义一个Thrift IDL(Interface Definition Language)文件。例如,定义一个简单的Thrift文件 service.thrift:

namespace java com.example.service
namespace py example.service
namespace js example.service

struct User {
    1: required string name,
    2: required i32 age
}

service UserService {
    User getUser(1:i32 userId)
}

生成客户端和服务端代码

使用Thrift编译器生成不同语言的客户端和服务端代码:

thrift --gen js service.thrift
thrift --gen java service.thrift
thrift --gen py service.thrift

创建Node.js服务端

创建一个Node.js服务端,监听请求并处理来自客户端的调用:

const thrift = require('thrift');
const { UserService, UserServiceService } = require('./gen-nodejs/UserService');

const handler = {
    getUser(userId, callback) {
        const user = { name: 'John Doe', age: 30 };
        callback(null, user);
    }
};

const server = thrift.createServer(UserService, handler);

server.listen(9090, () => {
    console.log('Server listening on port 9090');
});

创建Node.js客户端

创建一个Node.js客户端,发送请求到服务端并接收响应:

const thrift = require('thrift');
const { UserService, UserServiceService } = require('./gen-nodejs/UserService');

const connection = thrift.createConnection('localhost', 9090, {
    transport: thrift.TBufferedTransport,
    protocol: thrift.TBinaryProtocol
});

connection.on('error', (err) => {
    console.error(err);
});

const client = thrift.createClient(UserServiceService, connection);

client.getUser(1, (err, response) => {
    if (err) {
        console.error(err);
    } else {
        console.log(`User: ${response.name}, Age: ${response.age}`);
    }
});

总结

通过上述步骤,你可以看到Node.js是如何使用Thrift与其它语言如Java、Python、PHP等进行通信的。这种方式不仅提供了跨语言通信的能力,还保证了高性能和可靠性。希望本文对你有所帮助!


呵呵,,挺多的,我们这边也都是以java/C++/golang为主,php/python 作为前端显示,nodejs他们好像都并不感兴趣,感觉有些公司员工思想还是有些陈旧,另外装了个git和gitlab直接无视,后面还在默默用svn up…

年纪大了没热情没兴趣了

markdown 这东西貌似正好现在就有用,谢谢分享

不错,基本在公司内部,跨团队的调用,都会有一套统一的rpc实现。nodejs作为后来者,必须实现现有的协议。thrift是不错的选择。

内容不错,楼主编辑下内容吧。

顶!thrift对nodejs的支持已经很成熟了,我们目前的产品以后或许也要用到thrift和后端的java进行通信……

需要在Java端编译API为Nodejs,命令 thrift --gen js:node thrift_file 这句怎么实现呢?

俺也正有此意

为何让我想起swift…

brew install thrift

boost 包 400MB+ 小心…

我测了下 grpc / thrift

1w次简单调用, grpc消耗时间 会是 thrift 的两倍

Nodejs 利用 Thrift 与其它语言通信是一种高效且类型安全的方式。Thrift 是由 Apache 开发的一种轻量级、跨语言的服务开发框架。通过它,你可以定义服务接口,并生成不同编程语言下的客户端和服务器端代码。

示例代码

1. 定义 .thrift 文件

首先,你需要定义一个 .thrift 文件来描述你的服务接口和数据结构。例如:

namespace js ThriftExample
namespace py thrift_example
namespace java com.example.thrift

struct User {
    1: i32 id,
    2: string name,
}

service UserService {
    User getUser(1:i32 userId)
}

2. 生成代码

使用 Thrift 编译器将 .thrift 文件编译为 Node.js 可以使用的代码。假设你已经安装了 thrift 包:

thrift -r --gen js path/to/yourfile.thrift

这会生成一些文件,包括 UserService.js 和其他必要的 JavaScript 文件。

3. 在 Node.js 中实现服务

接下来,你需要实现一个 Thrift 服务:

const thrift = require('thrift');
const { UserService, User } = require('./gen-nodejs/UserService');
const ttypes = require('./gen-nodejs/UserTtypes');

class UserServiceHandler {
    getUser(userId, callback) {
        // 实现获取用户逻辑
        const user = new ttypes.User({ id: userId, name: "John Doe" });
        callback(null, user);
    }
}

const handler = new UserServiceHandler();
const server = thrift.createServer(UserService, handler);

server.listen(9090);
console.log("Server running on port 9090");

4. 在 Node.js 中作为客户端调用

现在,你可以从另一个 Node.js 进程中调用这个服务:

const thrift = require('thrift');
const { UserService, User } = require('./gen-nodejs/UserService');
const connection = thrift.createConnection('localhost', 9090, {transport: thrift.TBufferedTransport});
connection.on('error', (err) => {
    console.error(err);
});

connection.on('close', () => {
    console.log('Connection closed');
});

const client = thrift.createClient(UserService, connection);

client.getUser(1, (err, response) => {
    if (err) {
        console.error(err);
    } else {
        console.log(response);
    }
});

总结

使用 Thrift 可以让你轻松地在不同的语言之间进行通信。以上代码展示了如何定义 .thrift 文件,生成代码,并实现一个简单的 Thrift 服务和客户端。

回到顶部