Опасения по поводу разделения внешнего и внутреннего интерфейса с помощью сервера пользовательского интерфейса NodeJS

В течение последних месяцев мы на работе искали решение следующей проблемы: разработчики внешнего интерфейса не могут легко изменить внешний вид веб-сайта без помощи разработчиков внутреннего интерфейса.

Наша культура как команды в основном основана на фреймворках с полным стеком, таких как Symfony 2 и Ruby on Rails. Мы используем шаблонизаторы, но шаблоны в основном пишутся бэкенд-разработчиками по разметке дизайнеров.

Шаг, который мы собираемся сделать, — это разделить эту монолитную архитектуру на API-интерфейс бэкенда и сервер NodeJS в качестве «сервера пользовательского интерфейса». Сервер NodeJS будет обрабатывать запрос клиента, использовать внутренний API и возвращать обработанный шаблон. Четко указав API и обслуживаемые JSON, разработчики внешнего и внутреннего интерфейса могут работать параллельно с меньшими проблемами. Подробнее здесь: http://www.nczonline.net/blog/2013/10/07/node-js-and-the-new-web-front-end/

Дело в том, что мы твердо верим в то, что это разделение — хорошая вещь с точки зрения архитектуры, но мы опасаемся недостатков. Мы подозреваем, что это усложнит ситуацию. Никто из нас в команде никогда не работал с такими архитектурами, поэтому любой совет или опыт по этому поводу будут очень ценны.

Стоит ли оно того? Когда? Почему?


person carles    schedule 26.05.2014    source источник
comment
Используете ли вы какие-либо фреймворки MVVM, такие как angularjs (angularjs.org) или backbone? Angularjs действительно хорош для разделения бэкэнда и фронтенда, а также простой в освоении фреймворк. Он поддерживает шаблон интерфейса и директиву. Я рекомендую вам посмотреть на него.   -  person Nikolay Lukyanchuk    schedule 26.05.2014
comment
@NikolayLukyanchuk спасибо за ваш комментарий. Да, мы рассматривали такие варианты, как angular или ember.js, но окончательно отказались от клиентского приложения. Мы предпочитаем многостраничные приложения одностраничным, и есть другие обходные пути, такие как сканирование Google, с которыми мы не хотим иметь дело.   -  person carles    schedule 26.05.2014


Ответы (1)


Что вам нужно сделать, так это иметь четкую линию, которая отделяет ваш интерфейс от бэкэнда. Затем все, что нужно фронтенду от бэкенд-команды, будет всесторонне задокументировано.

Скажем, то, что у вас сейчас есть, выглядит примерно так:

app.get('/', function (req, res) {
    database.query('select * from user', function (err, result) {
        res.render(result);
    });
});

Но тогда вы хотите сделать это так:

на сервере пользовательского интерфейса:

app.get('/', function (req, res) {
    request('apiServer/user', function (err, result) {
        res.render(result);
    });
});

на сервере API:

app.get('/user', function (req, res) {
    database.query('select * from user', function (err, result) {
        res.send(result);
    });
});

Это хорошо. Это позволит разделить интерфейс и сервер, но не только логически, но и физически, находясь на разных серверах.

Я считаю, что если они находятся на одном сервере, все будет в порядке. Вместо вышеперечисленного просто разместите их в разных файлах:

в user.js:

exports.getAll = function (cb) {
    database.query('select * from user', cb);
};

в server.js:

var user = require('./user');
app.get('/', function (req, res) {
    user.getAll(function (err, result) {
        res.render(result);
    });
});

Почему это лучше, чем ваше решение? Потому что он разделяет касание базы данных и рендеринг данных, а также у него нет дополнительного HTTP-путешествия туда и обратно.

Следуя шаблону MVC, вы помещаете файлы, подобные user.js, в каталог моделей, вы помещаете файлы, подобные server.js, в каталог контроллера. Вы убедитесь, что оба документа задокументированы для разработчиков интерфейса.

Теперь, если ваши фронтенд-разработчики просто собираются внести изменения в пользовательский интерфейс, они просто коснутся файлов HTML. Если они захотят добавить раздел с данными, они прочитают внутреннюю документацию, добавят еще один вызов модели, чтобы получить данные в соответствующем контроллере, который отображает HTML.

Просто убедитесь, что вы все стандартизируете, поэтому, когда появляется что-то новое, программисты в вашей команде могут каким-то образом предсказать, каким будет интерфейс, используйте хороший ORM для тяжелой работы по вызову базы данных. Если использование ORM не является вашим выбором, сделайте хорошие абстракции.

Таким образом, ваше приложение в слоях может быть таким:

Database --> ORM --> Models --> Controllers --> Views(HTML files)

Теперь фронтенд-разработчики работают над правой стороной диаграммы выше. Им нужно знать задокументированный API своей левой стороны только в том случае, если он хорошо абстрагирован, но им не нужно знать, как он работает. Любой, кто работает с контроллерами, должен знать только документированный API их левой стороны, то есть Модели. Вы можете продолжить его до базы данных слева.

Затем на каждом уровне вы можете иметь модульные тесты и интеграционные тесты вплоть до самого начала, чтобы убедиться, что интерфейсы непротиворечивы.

И если у вас большая команда с большой базой кода, убедитесь, что вы всегда сохраняете обратную совместимость в своих интерфейсах, но с предупреждениями в журналах для устаревших вещей. Никогда не пытайтесь что-либо сломать.

person Farid Nouri Neshat    schedule 26.05.2014
comment
Таким образом, ваша архитектура должна быть настроена так, чтобы у вас было 2 разные серверные системы. 1. Сервер API и 2. Внутренний веб-сервер, который обращается к серверу API, а затем передает данные во внешний интерфейс? Это точно? Есть ли у вас какие-либо ссылки на соответствующие статьи по этой конкретной теме? Поиск по этой теме дает мне кучу информации о том, как создать REST API с использованием результатов Node.js. - person Jake Wilson; 01.09.2017
comment
Можно сказать, что это будет упрощенная микросервисная архитектура. Вы можете поискать это. Здесь вы можете найти полезную информацию об этом, но архитектура действительно зависит от требований и вашего командные навыки. - person Farid Nouri Neshat; 01.09.2017