Nodejs利用thrift与其他语言通信
Nodejs利用thrift与其他语言通信
哈,我们线上用的模块涵盖了java/php/python/node.js,中间通信都是使用thrift的
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+ 小心…
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 服务和客户端。