Nodejs与其它语言进行通信(thrift),并使用zookeeper做服务协同
Nodejs与其它语言进行通信(thrift),并使用zookeeper做服务协同
正在消化中。。。
当然可以。以下是一个关于如何在Node.js中使用Apache Thrift进行跨语言通信,并结合ZooKeeper进行服务发现和服务协同的示例。
1. Apache Thrift 简介
Apache Thrift 是一个软件框架,用于简化跨编程语言的服务开发。它定义了一种接口定义语言(IDL)来生成不同编程语言之间的代码,从而实现高效、透明的服务调用。
2. ZooKeeper 简介
Apache ZooKeeper 是一个高可用性的分布式协调服务,用于维护配置信息、命名、提供分布式同步以及提供组服务。它非常适合用于服务发现和负载均衡。
3. 示例代码
3.1 定义Thrift IDL文件
首先,我们需要定义一个Thrift IDL文件,例如 service.thrift
:
namespace js com.example.service
struct User {
1: i32 id,
2: string name
}
service UserService {
User getUser(1: i32 userId)
}
3.2 生成客户端和服务端代码
使用Thrift编译器生成Node.js客户端和服务端代码:
thrift --gen js service.thrift
3.3 服务端实现
接下来,我们实现一个简单的Node.js服务端:
const thrift = require('thrift');
const UserService = require('./gen-nodejs/UserService');
const ttypes = require('./gen-nodejs/UserService_types');
const users = [
{id: 1, name: 'Alice'},
{id: 2, name: 'Bob'}
];
const handler = {
getUser(userId, callback) {
const user = users.find(u => u.id === userId);
if (user) {
callback(null, new ttypes.User(user));
} else {
callback(new Error('User not found'));
}
}
};
const server = thrift.createServer(UserService, handler);
server.listen(9090, () => {
console.log('Server listening on port 9090');
});
3.4 ZooKeeper 集成
为了在服务启动时注册到ZooKeeper,我们可以使用 node-zookeeper-client
库:
const zookeeper = require('node-zookeeper-client');
const Client = zookeeper.Client;
const client = Client.create('localhost:2181');
client.once('connected', () => {
client.create('/services/user-service/instance-1', Buffer.from('http://localhost:9090'), (err) => {
if (err) {
console.error('Failed to register service:', err);
} else {
console.log('Service registered successfully');
}
});
});
client.connect();
3.5 客户端实现
最后,我们实现一个简单的Node.js客户端:
const thrift = require('thrift');
const UserService = require('./gen-nodejs/UserService');
const ttypes = require('./gen-nodejs/UserService_types');
const transport = thrift.TBufferedTransport;
const protocol = thrift.TBinaryProtocol;
const client = thrift.createClient(
UserService,
'localhost',
9090,
{transport, protocol}
);
client.getUser(1, (err, response) => {
if (err) {
console.error('Error:', err);
} else {
console.log(`User found: ${response.name}`);
}
});
4. 总结
通过上述步骤,我们可以在Node.js中使用Thrift进行跨语言通信,并利用ZooKeeper进行服务发现和协同。这种方式非常适合构建分布式系统中的微服务架构。
1楼有基情啊
能不能分享一下你对两种不同接口(thrift和http)在业务或者是架构上是怎么做出划分的?
thrift生成的代码在传递参数时有编码问题,导致传中文会出现乱码,需要手动更改生成的代码或者对参数进行编解码。
为啥我刚下载node-zookeeper,然后 node-gyp configure build编译后没有生成realease目录, 直接这样了 make: Nothing to be done for `all’. ,你们安装node-zookeeper是怎样装的呀?
直接npm的,zookeeper客户端会下载然后编译安装,过程有点慢,你机器上原来有zookeeper嘛?
我也碰到了,请问下具体怎么解决呢?
挖个坟… 支持下
最近在接触zookeeper,rpc用的是hprose,我看了node-zookeeper 跟 node-zookeeper-client 两个模块,貌似都是调用创建节点的方式,注册服务在哪?引用的 ./zk 是哪的
才发现用的hprose,是没有服务发现与治理的,没办法用zk,可是thrift跟hprose是一类的,是怎么结合zk使用的??