Nodejs与其它语言进行通信(thrift),并使用zookeeper做服务协同

Nodejs与其它语言进行通信(thrift),并使用zookeeper做服务协同

正在消化中。。。

11 回复

当然可以。以下是一个关于如何在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嘛?

我也碰到了,请问下具体怎么解决呢?

挖个坟… 支持下

untitled1.png最近在接触zookeeper,rpc用的是hprose,我看了node-zookeeper 跟 node-zookeeper-client 两个模块,貌似都是调用创建节点的方式,注册服务在哪?引用的 ./zk 是哪的

才发现用的hprose,是没有服务发现与治理的,没办法用zk,可是thrift跟hprose是一类的,是怎么结合zk使用的??

要在Node.js中实现与其它语言(例如Java)进行通信,并使用Thrift进行RPC调用以及ZooKeeper进行服务协同,你需要完成以下几个步骤:

  1. 安装Thrift库:首先需要安装Thrift库,这允许Node.js与其他语言进行通信。你可以通过npm来安装Thrift。

    npm install thrift
    
  2. 定义Thrift IDL文件:创建一个IDL(接口描述语言)文件,描述你的服务接口。例如,service.thrift 文件可能包含:

    namespace js myservice
    
    service Calculator {
      i32 add(1:i32 num1, 2:i32 num2)
    }
    
  3. 生成客户端和服务端代码:使用Thrift编译器从IDL文件生成相应的客户端和服务端代码。

    thrift --gen js service.thrift
    
  4. 启动Thrift服务端:编写Node.js服务端代码来暴露定义的服务。

    const thrift = require('thrift');
    const Calculator = require('./gen-nodejs/Calculator');
    const ttypes = require('./gen-nodejs/types');
    
    const handler = {
      add(num1, num2, success, fail) {
        success(num1 + num2);
      }
    };
    
    const server = thrift.createServer(Calculator, handler);
    
    server.listen(() => {
      console.log('Thrift server is running...');
    });
    
  5. 使用Thrift客户端进行调用:编写客户端代码来连接到Thrift服务。

    const thrift = require('thrift');
    const Calculator = require('./gen-nodejs/Calculator');
    const ttypes = require('./gen-nodejs/types');
    
    const connection = thrift.createConnection('localhost', 9090, {
      transport: thrift.TBufferedTransport,
      protocol: thrift.TBinaryProtocol
    });
    
    const client = thrift.createClient(Calculator, connection);
    
    client.add(1, 2, (err, result) => {
      if (err) {
        console.error(err);
      } else {
        console.log(`Result: ${result}`); // 应输出 "Result: 3"
      }
    });
    
  6. ZooKeeper集成:为了服务发现,可以使用node-zookeeper-client库来管理服务实例注册和发现。

    npm install node-zookeeper-client
    
  7. 编写ZooKeeper脚本:设置ZooKeeper客户端,监听服务变化。

    const zookeeper = require('node-zookeeper-client');
    const Client = zookeeper.Client;
    
    const client = Client.create('localhost:2181');
    
    client.once('connected', () => {
      console.log('Connected to ZooKeeper');
      client.create('/myservice/server-01', Buffer.from(''), {}, (error) => {
        if (error && error.code !== zookeeper.ZNONODE) throw error;
      });
    });
    
    client.connect();
    
  8. 动态发现服务:通过ZooKeeper动态地发现其他语言实现的服务。

    client.getChildren('/', (error, children) => {
      if (error) throw error;
      console.log(children); // 输出服务实例列表
    });
    

以上就是基本的流程,结合Thrift和ZooKeeper,可以实现Node.js与其它语言之间的高效通信和服务协同。

回到顶部