предисловие
nodejs
Появление фронтенд-индустрии открыло бесконечные возможности для фронтенд-индустрии, и многие студенты, которые отвечали только за разработку на стороне клиента, постепенно начали контактировать и использовать технологии на стороне сервера.
несмотря на то чтоnodejs
Он дает много преимуществ, но также имеет и свои ограничения.По сравнению с такими традиционными старыми языками программирования, какJAVA
,PHP
.nodejs
Это не замена им, и пошатнуть статус тех старых языков программирования в обозримом будущем сложно.
В настоящее времяnodejs
Существуют в основном следующие сценарии применения.
- Фронтенд-инжиниринг, такой как
rollup
,webpack
Изучение направления инженерии -
nodejs
средний слой - Интеграция с клиентом
nodejs
,Напримерelectron
- Некоторые из менее сложных вариантов применения на рынке
nodejs
в качестве внутреннего языка программирования
В этой статье в основном говорится оnodejs
В качестве некоторых практик для среднего уровня посмотрите на диаграмму ниже.
Традиционная модель развития состоит из прямого иServer
Уровни взаимодействуют напрямую, добавление среднего уровня означает, что браузер иServer
Между слоями добавляется дополнительный слой.
Оригинальный клиент напрямуюServer
послать запрос,Server
После того, как слой получает запрос, он возвращает результат в браузер посредством обработки вычислений.
Теперь браузер отправляет запрос наnode层
,node层
После одного цикла обработкиServer层
инициировать запрос.Server层
После обработки вернуть результат ответа вnode层
,node层
Наконец, верните данные в браузер.
потому чтоnode层
внешний вид,Server层
Можно сосредоточиться только на самом бизнесе, не обращая внимания на особые требования фронтенда к полям.
node层
кserver
Уровень данных получает данные, а затем преобразует их в соответствие с внешним интерфейсом посредством расчета и интеграции данных.UI
Требуемый формат данных. Кроме того, если все приложение использует микросервисную архитектуру, тоServer层
Будет много серверов, управляющих отдельными бизнес-модулями,node层
Он хорошо адаптирован к архитектуре микросервисов, может инициировать запросы к нескольким серверам для получения данных из разных модулей, затем интегрировать и преобразовывать их и отправлять на фронтенд.
Далее речь пойдет оnodejs
В рамках практики среднего звена.
переадресация через прокси
Прокси-форвардинг имеет много распространенных применений на практике.Браузер сначала отправляет запрос наnode服务器
, после получения запросаnode服务器
Вы можете выполнить некоторую обработку запроса, например изменить исходный путь, изменить информацию в заголовке запроса, а затем отправить измененный запрос на удаленный реальный сервер.
Удаленный сервер вычисляет ответ и возвращает егоnode服务器
,node服务器
Ответ по-прежнему может быть выборочно обработан и возвращен в браузер.
Переадресация прокси-сервера может решить междоменные проблемы, часто возникающие при ежедневной разработке внешнего интерфейса.Кроме того, она также скрывает детали удаленных реальных серверов, позволяяnode服务器
Общение Ниже приведены простые практики.
const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');
const app = express();//创建应用
app.use("/api",createProxyMiddleware( //设置代理转发
{
target: 'http://www.xxx.com', //举例随便写的地址
changeOrigin: true,
pathRewrite: function (path) {
return path.replace('/api', '/server/api');
}
})
);
app.use("*",(req,res)=>{ //不是以'/api'开头的路由全部返回"hello world"
res.send("hello world");
})
app.listen(3000);
http-proxy-middleware
Это сторонний пакет зависимостей, который может быть очень удобен для настройки прокси-форвардинга, который необходимо передать черезnpm
Установить.
Если текущий доступный путь/api
начинается, то запрос будетhttp-proxy-middleware
перехватить наблюдатьhttp-proxy-middleware
настроенные в нем параметры.
-
target
Представляет адрес удаленного реального сервера. -
changeOrigin
Установить какtrue
, указывающее, что запрос переадресован наtarget
По адресу. -
pathRewrite
Это процесс для пути запроса,/api
Перевести в/server/api
.
Смысл приведенного выше случая очевиден, если текущий браузер обращаетсяhttp://localhost:3000/api/list
.потому что этот путь начинается с/api
В начале он будет перехвачен, что приведет к срабатываниюpathRewrite
Функция изменяет путь доступа. Конечный путь доступа становитсяhttp://www.xxx.com/server/api/list
, а затем будет сделан запрос по этому пути, и ответ будет возвращен в браузер.
агрегация интерфейсов
Описанный выше интерфейсный форвардинг на практике редко используется сам по себе, если просто для форвардинга данных, то лучше использовать его напрямую.nginx
Настройте его, и переадресация будет выполнена.
Если требуется как агрегация интерфейса, так и переадресация интерфейса, это предпочтительный способ решить эту проблему на уровне кода.
Что означает агрегация интерфейсов? Предположим, что у компании теперь есть две системы продаж, одна — онлайн-платформа электронной коммерции, а другая — офлайн-магазины.Ими управляют разные команды и поддерживаются разные системы данных.
Если текущий запрос хочет только запросить информацию об определенном продукте на платформе электронной коммерции, вам нужно только перенаправить интерфейс в систему платформы электронной коммерции. физическое хранилище в определенный день, вы можете напрямую перенаправить запрос. Запросите автономную систему данных, а затем верните данные ответа. Плагин, описанный вышеhttp-proxy-middleware
Поддерживает настройку нескольких путей прокси, и вы можете запросить подробную информацию в документации.
Сейчас есть такой спрос, цель - запросить сравнение данных онлайн и оффлайн продаж определенного товара на этой неделе, тогда в это время необходимоnode层
Отправьте запросы на два удаленных сервера для получения данных о продажах в Интернете и данных о продажах в автономном режиме соответственно, объедините эти две части данных, а затем верните их во внешний интерфейс.Простая практика заключается в следующем.
const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');
const app = express();//创建应用
//伪代码
app.get("/getSaleInfo",async (req,res)=>{
const online_data = await getOnline(); //获取线上数据
const offline_data = await getOffline(); //获取线下数据
res.send(dataHanlder(online_data,offline_data)); //对数据处理后返回给前端
})
proxyHanlder(app);//伪代码,将代理转发的逻辑封装起来
app.use("*",(req,res)=>{
res.send("hello world");
})
app.listen(3000);
/getSaleInfo
Представляет настраиваемый маршрут, объединяющий два данных. Если данных требуется много, эта логика должна быть инкапсулирована отдельно в модуле маршрутизации для управления и должна быть прописана перед переадресацией прокси-сервера.
Это гарантирует, что интерфейс, который необходимо перенаправить, будет передан логике пересылки для обработки, а интерфейс, который должен персонализировать обработку данных, должен отдельно записывать данные операции маршрутизации.
кеш данных
Кэширование играет незначительную роль в повышении производительности системы и снижении нагрузки на базу данных.redis
, которую можно понимать как базу данных, в которой данные хранятся в памяти.Поскольку данные хранятся в памяти, скорость чтения и записи очень высока, и она может очень быстро реагировать на запросы пользователя.
существуетnode层
развертыватьredis
Управление кэшированными данными может повысить общую производительность приложения, но не все данные рекомендуется хранить вredis
, кэшировать следует только те данные, которые изменяются нечасто.
Например, информационные данные о товаре, браузер инициирует запрос о товаре и хочет просмотреть детали о товаре.Запрос поступает впервыеnode
Пол,redis
в данный момент пусто, тогдаnode
начать запросserver
Слой получает результат ответа, в это время перед возвратом результата ответа в браузер в качестве пути доступа используется путь доступа запроса.key
значение, результат ответа такойvalue
хранить вredis
В. Таким образом, когда тот же запрос отправляется позже, сначала проверьте егоredis
Кешируются ли запрошенные данные, если кешируются, возвращают данные напрямую, если кеша нет, переходим к запросуserver
слой и повторите вышеописанный процесс.
redis
Вы также можете установить время истечения срока действия и очистить кэшированные данные, которые можно использовать в соответствии с конкретными бизнес-операциями.Простая практика заключается в следующем.
const express = require('express');
const app = express();//创建应用
//伪代码
app.use("*",(req,res,next)=>{
const path = req.originalUrl; //获取访问路径
if(redisClient.getItem(path)){ //查看redis中有没有缓存该条接口的数据
res.send(redisClient.getItem(path)); // 返回缓存数据
}else{
next(); //不执行任何操作,直接放行
}
})
aggregate(app); //伪代码,将接口聚合的逻辑封装起来
proxyHanlder(app);//伪代码,将代理转发的逻辑封装起来
app.use("*",(req,res)=>{
res.send("hello world");
})
app.listen(3000);
Ограничение тока интерфейса
node
В качестве среднего уровня может быть ограничен неконтролируемый доступ к интерфейсу, например, некоторые вредоносные скрипты зацикливают доступ к интерфейсу, и доступ с частотой в десятки раз в секунду увеличивает нагрузку на сервер.
redis
Это может помочь нам реализовать эту функцию.При первом доступе пользователя разберите запрос.ip
адрес, будетip
так какkey
стоимость,value
установлен в0
сохранитьredis
середина.
Второй визит пользователя, вывезтиip
оказатьсяredis
соответствующийvalue
, а затем увеличить1
, Если один и тот же человек повторяет большое количество посещений,value
Он сам увеличился до большого числа за короткий промежуток времени.Мы можем каждый раз получать, превышает ли это число установленный ожидаемый стандарт, и отклонять запрос, если оно превышает.Простая практика заключается в следующем.
const express = require('express');
const app = express();//创建应用
//伪代码
app.use("*",(req,res,next)=>{
const ip = req.ip;
let num = 0;
if(redisClient.getItem(ip)){ //是否缓存了当前的ip字段
num = redisClient.incr(ip); //每访问一下,计数加1
}else{
redisClient.setItem(ip,0);
redisClient.setExpireTime(5); //设置过期时间为5秒,5秒后再获取该ip为空
}
if(num > 20){
res.send("非法访问");
}else{
next();//放行
}
})
cacheData(app)//伪代码.缓存接口数据
aggregate(app); //伪代码,将接口聚合的逻辑封装起来
proxyHanlder(app);//伪代码,将代理转发的逻辑封装起来
app.use("*",(req,res)=>{
res.send("hello world");
})
app.listen(3000);
Настройте слой промежуточного программного обеспечения, ограничивающего ток, перед приложением и определите, кэшировался ли терминал перед каждым доступом.ip
Соответствующее значение устанавливается0
и добавьте время истечения как5
секунд. В следующий раз, когда тот же пользователь получит доступvalue
автоматическое приращение1
.
Окончательный эффект достигнут5
Количество вызовов по интерфейсу в секундах20
Доступ запрещен.
журнал операций
В системе нет журналов, что эквивалентно людям без глаз.Журналы могут помочь нам обнаруживать и анализировать ошибки в онлайн-системе.Кроме того, с помощью данных журналов можно выполнять статистические расчеты, чтобы делать определенные выводы и тенденции.
node
Уровень журнала может взять на себя функцию управления журналами.В качестве примера возьмем журнал доступа к интерфейсу.Создайте новую папку журнала в системе, и каждый раз, когда есть запрос на доступ, путь запроса, текущее время доступа, и переносимые параметры и информация о данных терминала сначала анализируются. Затем создается журнал в папке журнала.txt
Файл сохраняется в журнале дня, а вышеуказанные данные и результат ответа на запрос объединяются в одну запись и вставляются.txt
В файле. Следующее посещение продолжается с описанным выше процессом дляtxt
Журнал доступа к файлу.http-proxy-middleware
Поддержите настройку того, как вернуть результат ответа, затем в соответствующем хуке функции события вы можете получить запрос и ответ одновременно, и с этими двумя частями данных вы можете сохранить их в журнале.
Существует также множество стратегий настройки: вы можете выбрать один текст журнала в день или один текст журнала в час, если трафик огромен, в зависимости от реальной ситуации.
Кроме того, с увеличением времени файловое содержимое папки журнала будет становиться все больше и больше, для этого требуется записьlinux
Операционная система планирует задачи по миграции и резервному копированию этих данных журнала.
Простая практика работы с журналом заключается в следующем.
//伪代码
app.use("/getList",async (req,res)=>{
const list = await getProductList(); //获取商品数据
const { 访问时间,访问路径,参数 } = req;
logger.log('info',`${访问时间}-${访问路径和参数}:${list}`);//将数据存储到日志文件中
res.send(list);//将结果返回给客户端
})
конец
Средний уровень также может делать много других вещей, таких как мониторинг, аутентификация и рендеринг на стороне сервера (ssr).Эта часть может быть разделена на главы из-за большого объема контента.Также есть много статей о том, как практика в интернете, которую можно поискать и изучить.
Фактически, все функции, упомянутые выше, могут выполняться другими языками программирования, что также стало проблемой для многих людей, задающихся вопросом, нужно ли им добавлять дополнительный уровень в архитектуру.
Добавить кnodejs
Средний слой, безусловно, является хорошей новостью для фронтенд-студентов, потому что он позволяет фронтенду выполнять больше задач и увеличивает долю фронтенд-бизнеса. бизнес с этого момента, а интерфейс продолжает делать то, что у него хорошо получается. Это может повысить эффективность разработки в целом.
Однако с макро точки зрения добавление дополнительного слоя в архитектуру неизбежно приведет к потере производительности всего приложения, кроме того, возрастут затраты на эксплуатацию и обслуживание на уровнях развертывания и тестирования.
В настоящее время разделение фронтенда и бекенда стало основным режимом разработки.Многие типы приложений требуют поддержки seo и скорости загрузки первого экрана, поэтому рендеринг на стороне сервера незаменим.Большинство фронтенд-проектов в настоящее время используютreact
илиvue
Разработка фреймворка, если используетсяnodejs
Если вы берете на себя задачу рендеринга на стороне сервера, вы можете гарантировать, что набор кода может выполнять рендеринг как на стороне клиента, так и на стороне сервера, и эти задачи могут выполняться независимо программистами переднего плана. очень важно, и один будет открыт позже Разделы объясняются отдельно.
Подводить итоги,nodejs
Наиболее ценными функциями среднего уровня являются рендеринг на стороне сервера и агрегация данных интерфейса.Если количество корпоративных приложений невелико, а бизнес простой и еще не масштабируется, не рекомендуется добавлять средний уровень, что сделает простые вещи сложные.