nodeJS Быстрый веб-сервер на javascript движке V8

10Янв/120

Модули, о которых следует знать: dnode

Об авторе: Питер Круминс использует node.js больше двух лет, и построил на ней свой проект Browserling. Оригинальные статьи серии можно найти в его блоге.

В этой серии мы пройдемся по нескольким десяткам модулей для node.js, с примерами и объяснениями для чего какой модуль лучше применять.

Первый модуль в серии - dnode. Dnode это библиотека для удаленных вызовов в свободном стиле, она написана Джеймсом Хэллидэем (SubStack) - одним из основателей Browserling и Testling.

Вот что это такое. Это server.js:

var dnode = require('dnode');
 
var server = dnode({
    mul : function (n, m, cb) { cb(n * m) }
});
server.listen(5050);

А это client.js:

var dnode = require('dnode');
 
dnode.connect(5050, function (remote) {
    remote.mul(10, 20, function (n) {
        console.log('10 * 20 = ' + n);
    });
});

Теперь при запуске client.js Вы получите вывод:

$ node client.js
200


Видите что получилось? Клиент вызвал функцию mul на сервере и передал ей аргументы 10 и 20. Они были перемножены на стороне сервера и результат был отправлен обратно к клиенту через callback.

Важно пояснить, что код никуда не передавался, всё сделано исключительно вызовами. Вы можете увидеть пример реализации протокола dnode в репозитории dnode-protocol на Github.

Вот более сложный пример, где клиент вызывает сервер, который вызывает клиент, возвращающий промежуточный результат серверу, который потом передает клиенту окончательный результат.

server.js:

var dnode = require('dnode');
 
var server = dnode(function (client) {
    this.calculate = function (n, m, cb) {
        client.div(n*m, function (res) {
            cb(res+1)
        });
    }
});
server.listen(5050);

client.js:

var dnode = require('dnode');
 
var client = dnode({
    div : function (n, cb) {
       cb(n/5);
    }
});
 
client.connect(5050, function (remote) {
    remote.calculate(10, 20, function (n) {
        console.log('the result is ' + n);
    });
});

При запуске клиента Вы получите результат 41. Вот что при этом происходит. Сначала клиент подключается к серверу dnode по порту 5050. После подключения, dnode вызывает функцию calculate на стороне сервера и передаёт ей аргументы 10 и 20 и функцию-обработчик, выводящую результат. Теперь когда сервер получает аргументы 10 и 20, он перемножает их и вызывает функцию div на клиенте, которая делит результат на 5. Полученный результат возвращается на сервер, к нему добавляется единица и вызывается изначальный обработчик, выводящий окончательный результат.

В Browserling мы везде используем dnode. Каждый сервис это сервер dnode и все они связаны между собой. Например, сервис аутентификации это сервер dnode. Мы может остановить его для обновления, не останавливая при этом весь сайт. Очень здорово.

Установить dnode можно через npm:

npm install dnode

И так как у dnode есть четко определённый протокол, его можно реализовать на любом языке! Вот, к примеру, реализации на Perl, Ruby, PHP и Java.

Комментарии (0) Пинги (1)

Оставить комментарий