Говоря о среднем слое nodejs

Node.js

предисловие

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Наиболее ценными функциями среднего уровня являются рендеринг на стороне сервера и агрегация данных интерфейса.Если количество корпоративных приложений невелико, а бизнес простой и еще не масштабируется, не рекомендуется добавлять средний уровень, что сделает простые вещи сложные.