Seneca — набор инструментов микросервисов для Node.JS. Он предоставляет плагины, которые заботятся об основах вашего приложения.
Это позволяет вам сосредоточиться на реальной бизнес-логике.
Нет необходимости беспокоиться о том, какую базу данных использовать, как структурировать компоненты или как управлять зависимостями.
Просто начните писать код. Вы описываете все как действия.
Действия вызываются всякий раз, когда они соответствуют набору свойств.
Ваш вызывающий код не знает и не заботится о том, какое действие выполняет работу.
Один объект JavaScript входит, а другой выходит асинхронно.
Чем Seneca.js не является
Я люблю конкретные сравнения и, к сожалению, быстро делаю поспешные обобщения, которые могут мне навредить.Чтобы этого избежать, вот список того, чего нет у Сенеки:
- Сенека не является «строгой» структурой.
Seneca не навязывает вам какую-либо архитектуру приложения или подходы.
Хотите разместить все свое приложение в одном действии? Ты можешь.
Хотите выполнить каждое действие всего за 5 строк кода? Вы тоже можете это сделать.
Seneca невероятно надежен и подойдет практически для любого архитектурного решения, которое вы примете.
- Seneca не является генератором приложений для начинающих.
Не существует волшебства «Просто добавь воды», на которое новички могли бы положиться при мгновенном создании приложений.
Только после достаточного изучения использование Сенеки может быть эффективным.
Если вы знаете, что делаете, Сенека невероятно полезен.
Если вы не уверены в том, что делаете, Сенека не решит за вас ваши проблемы.
Это настолько хорошо, насколько хорош программист, который его использует.
- Seneca — это не маленькая служебная библиотека.
Seneca не похожа на библиотеку без зависимостей, такую как lodash, которую вы можете подключить и разбросать по всему приложению.
Seneca довольно массивный и очень привлекательный под капотом.
Seneca занимает позицию между Hapi и Express с точки зрения размера (сравнивая выпуски, сжатые с помощью gzip, и размеры каталогов в node_modules).
Это имеет смысл, учитывая, что Сенеке приходится решать очень сложные задачи, связанные с сопоставлением шаблонов, упорядочиванием действий и взаимодействием между процессами.
Так что же такое Seneca.js?
Теперь, когда вы прочитали эти три пункта, вы, вероятно, сильно запутались в том, что такое Сенека.Описав эту структуру много раз и используя множество различных терминов и фраз, я нашел следующее определение Сенеки наиболее полезным:
Seneca — это инструмент, который делит приложение на небольшие действия.Это определение представляет собой упрощение всего, что дает Сенека, но оно является сутью того, чего достигает Сенека.
Единственным неоднозначным термином в этом определении является слово «действие», которое является базовым элементом приложения Seneca, а также наиболее важной абстракцией, предоставляемой набором инструментов.
Действия
Действие — это функция, идентифицируемая объектом JSON. Действия лежат в основе Seneca, и чтобы использовать Seneca, разработчик должен уметь мыслить в терминах небольших функций, которые можно вызывать из любого места с помощью их идентификаторов JSON. Действия создаются с помощью метода seneca.add:Действия могут иметь любую степень детализации и любой шаблон JSON. Вы можете выполнять действия из {application:'myApp', выполнения:'все'} в { модуле:'дополнение', выполнение:'onePlusOne', потому что:'причины'}.seneca.add({role:'inventory', cmd:'find_item'}, function(args, done) { const itemId = args.id; // find item using any means necessary const item = byAnyMeansNecessary(itemId); done(null, item); });
В соответствии с личным стилем и соглашением, присущим всем плагинам Seneca, я стараюсь хранить свои действия в формате {role: 'namespace', cmd: 'action'}, где «namespace» — это логическая группа нескольких действий и «action».
— это имя конкретного действия, которое я хочу определить.
Вызов действий можно выполнить с помощью метода seneca.act: seneca.act({role:'inventory', cmd:'find_item', id:'a3e42'}, function(err, item) {
if (err) return err;
console.log(item);
// Perform other actions with item
});
Я предпочитаю определять связанные действия в одном файле с одной и той же ролью (например, в файле todo-list.js все задачи будут иметь роль todo_list).
Как правило, я стараюсь, чтобы размер этого файла не превышал 150 строк, и я стараюсь, чтобы каждое определение действия было достаточно маленьким, чтобы его можно было читать без прокрутки.
У других людей могут быть другие предпочтения, но мне этот размер удобен.
Почему действия?
Итак, теперь, когда у вас есть базовое представление об основных элементах Seneca, вы, вероятно, задаетесь вопросом, зачем разбивать систему на определения действий и вызовы действий.Целью здесь является создание приемлемых границ между компонентами вашего приложения, которые заставят вас рассмотреть более модульную архитектуру и избежать стремления объединить все в один основной файл.
Как мы вскоре увидим, после разделения приложения на действия Seneca предоставляет множество инструментов для отображения действий как в форме микросервисов HTTP, так и URL-адресов веб-сервера.
Организация действий
Ранее я упоминал, как храню все связанные действия в одном файле, но не описывал, как я привязал эти действия к экземпляру Seneca в другом файле.
Seneca содержит метод seneca.use, который находит соответствующий файл или модуль и включает его в экземпляр Seneca. Например, если бы у меня было несколько действий, связанных с инвентаризацией, я бы создал Inventory.js и определил там все действия: /* inventory.js */
module.exports = function(options) {
const seneca = this;
seneca.add({role:'inventory', cmd:'find_item', find_item);
seneca.add({role:'inventory', cmd:'create_item', create_item);
//.
other action definitions function find_item(args, done) { const itemId = args.id; // .
perform find done(null, item); } function create_item(args, done) { const itemName = args.name; // .
perform item creation done(null, item); } } /* server.js */ const seneca = require('seneca')(); seneca.use('.
/inventory.js');
seneca.act({role:'inventory', cmd:'create_item', name:'apple'}, function(err, item) {
console.log(item);
}
Обратите внимание, что таким образом мы получаем ссылку на экземпляр seneca в Inventory.js. После добавления действий в экземпляр мы можем вызвать эти действия в server.js. Распространенный формат использования Inventory.js в качестве примера — вызов seneca.add вверху, а затем определение методов.
Это не обязательно, просто некоторые реализованные плагины придерживаются этого соглашения.
Существуют сотни плагинов, которые вы можете использовать для выполнения заранее определенных действий в вашем приложении — от экспресс-интеграции до аутентификации и доступа к базе данных.
Косистема достаточно обширна и позволяет ускорить написание приложений, как только вы поймете, как работать с действиями.
Следующий уровень: несколько процессов
В приведенном выше примере вы уже можете запустить приложение с помощью узла server.js и все произойдет в одном процессе.Однако что делать, если вам нужно запустить несколько процессов, один из которых будет просто обрабатывать действия инвентаризации, а другой — их использовать.
Межпроцессное взаимодействие может быть сложным для приложений NodeJS, но Seneca позволяет добиться такого поведения всего двумя изменениями кода.
Мы оставим Inventory.js без изменений, используя такие действия, как плагин Seneca. Однако мы создадим два новых файла: один — Inventory-service.js, который запустит службу на порту 10101, используя seneca.listen, и другой файл Inventory-client.js, который будет использовать seneca.client для доступа и использования действий службы.
/* inventory-service.js */
const seneca = require('seneca')();
seneca.use('.
/inventory.js');
seneca.listen();
Теперь мы можем запустить узел инвентаризации-service.js в отдельном процессе, и он будет прослушивать порт 10101. В инвентаре-client.js мы можем написать: /* inventory-client.js */
const seneca = require('seneca')();
seneca.client();
seneca.act({role:'inventory', cmd:'create_item', name:'apple'}, function(err, item) {
console.log(item);
}
// …
Запуск узла Inventory-client.js будет делать то же самое, что и server.js в предыдущем примере, только теперь у нас есть возможность горизонтально масштабировать наше приложение для нескольких процессов.
В этом истинное преимущество использования Seneca: поскольку мы разделили наше приложение на небольшие действия, эти действия можно объявлять в разных файлах или даже разных процессах.
С помощью плагинов, доступных для веб-интеграции, действия можно выполнять даже на отдельных хостах.
Судя по переводу Эта статья.
Ссылки
Если есть интерес, готов описать, как все это интегрировать с Express, обернуть в Docker и масштабировать.Теги: #JavaScript #node.js #микросервисы #архитектура #framework #JavaScript #node.js
-
Сравнение Форматов Сериализации
19 Oct, 24 -
Атлантида: Волшебные Смайлы
19 Oct, 24 -
Виртуалдуб 1.9.4
19 Oct, 24 -
Обновите Инструменты Разработчика Firefox
19 Oct, 24