Создайте свой первый микросервис Node.js

Node.js Микросервисы JavaScript
Создайте свой первый микросервис Node.js

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

micro— это небольшой (около 100 строк кода) модуль, который делает написание микросервисов на Node.js простым и увлекательным. Он прост в использовании и очень быстр. Независимо от того, использовали ли вы ранее Node.js или нет, после прочтения этой статьи вы сможете писать свои собственные микросервисы!

Начиная

Чтобы начать работу, нужно всего два небольших шага, сначала вам нужно установитьmicro:

npm install -g microскопировать код

Здесь выбрана глобальная установка, чтобы убедиться, что мы можем использоватьmicro Заказ. Если вы знаете, как использовать скрипты npm, не стесняйтесь их использовать.

Второй шаг — создать новый файл для хранения микросервиса.index.js:

touch index.jsскопировать код

первые шаги

это index.jsФайл должен экспортировать функцию,microпередаст ему запрос на соединение и объекты ответа:

module.exports = function (request, response) {  // 微服务逻辑代码}скопировать код

мы используемmicroОсновным методом являетсяsend, который можно использовать для отправки ответа клиенту. мы первыеrequireего и отправить простое «Hello World» независимо от запроса:

const { send } = require('micro')module.exports = function (request, response) {  send(response, 200, 'Hello World! 👋')}скопировать код

sendПервый параметр — это ответ для отправки, второй параметр — это код состояния HTTP, а третий параметр — это содержимое ответа (может быть JOSN).

Для запуска микросервиса требуется всего одна команда:

$ micro index.js Ready! Listening on http://0.0.0.0:3000скопировать код

Откройте эту страницу в своем браузере, и вы увидите:

Создайте свой первый микросервис Node.js

сделать что-нибудь полезное

Предыдущая работа немного скучновата, давайте сделаем что-нибудь полезное! Мы хотим создать микросервис, который записывает, сколько раз запрашивается заданный путь. то есть, когда/fooПри первом запросе вернуть1, который возвращается при повторном запросе2,так далее.

Сначала нам нужно узнать URL-адрес запросаpathname. отrequest.urlПолучите URL-адрес и используйте базовую библиотеку Node.js.urlмодуль (без необходимости устанавливать его отдельно), чтобы решить эту проблему.

представлятьurlмодуль и используйте его, чтобы получить его из анализа URLpathname:

const { send } = require('micro')const url = require('url')module.exports = function (request, response) {  const { pathname } = url.parse(request.url)  console.log(pathname)  send(response, 200, 'Hello World! 👋')}скопировать код

Перезапустите микросервис (нажмитеCTRL+C, затем введите сноваmicro index.js) попробуй. проситьlocalhost:3000/fooвыведет на консоль/foo,проситьlocalhost:3000/barвыход/bar.

С pathname последний шаг — сохранить количество запросов этого пути. Создать глобальный объектvisits, который используется для сохранения всех записей доступа:

const { send } = require('micro')const url = require('url')const visits = {}module.exports = function (request, response) {  const { pathname } = url.parse(request.url)  send(response, 200, 'Hello World! 👋')}скопировать код

Проверять каждый раз, когда приходит запросvisits[pathname]он существует. Если он существует, увеличьте количество посещений и верните результат клиенту. В противном случае установите его на1и вернуть его клиенту.

const { send } = require('micro')const url = require('url')const visits = {}module.exports = function (request, response) {  const { pathname } = url.parse(request.url)  if (visits[pathname]) {    visits[pathname] = visits[pathname] + 1  } else {    visits[pathname] = 1  }  send(response, 200, `This page has ${visits[pathname]} visits!`)}скопировать код

Снова перезапустите службу и откройте ее в браузере.localhost:3000/fooи обновить несколько раз. ты увидишь:

рекордные посещения

Это в основном то, что я построил за несколько часовmicro-analyticsМетоды. Основная концепция та же, только несколько дополнительных функций. Как только вы поймете, что делаете, код для реализации станет довольно простым.

постоянные данные

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

мы будем использоватьlevelПостоянные данные, которые представляют собой хранилище ключей и значений на основе файлов. microвстроенная параasync/await, что делает асинхронный код более элегантным. Проблема в, levelоснован на функциях обратного вызова вместо промисов. 😕

по-прежнему,npmВот нужные нам модули. Разработано Forbes Lindesaythen-levelupЭто позволяет нам использовать обещаниеlevel. Если вы этого не понимаете, не волнуйтесь, вы сразу поймете, что это такое!

Сначала установите эти модули:

npm install level then-levelupскопировать код

Для того, чтобы создать базу данных, мы сначала вводимlevel, а затем укажите место хранения базы данных, а содержимое хранилища — в формате JSON. мы используем then-levelupметод экспортаpromisifyОберните эту базу данных, затем экспортируйтеasyncвместо обычной функции, так что вы можете использоватьawaitКлючевые слова:

const { send } = require('micro')const url = require('url')const level = require('level')const promisify = require('then-levelup')const db = promisify(level('visits.db', {  valueEncoding: 'json'}))module.exports = async function (request, response) {  /* ... */}скопировать код

Два метода, которые нам нужны для базы данных,db.put(key, value)Используется для сохранения данных (эквивалентноvisits[pathname] = x),db.get(key)используется для получения данных (эквивалентноconst x = visits[pathname]).

Во-первых, мы хотим знать, есть ли запись доступа для этого пути в базе данных. пройти через db.get(pathname)достичь и использоватьawaitКлючевое слово для ожидания завершения:

module.exports = async function (request, response) {  const { pathname } = url.parse(request.url)  const currentVisits = await db.get(pathname)}скопировать код

Если не добавитьawait,currentVisitsназначается как Promise, функция будет продолжать выполняться, и мы не получим значение, возвращаемое базой данных — это не тот результат, который нам нужен!

В отличие от предыдущего, если в настоящее время нет доступа к записям,db.getвызовет исключение «NotFoundError». мы будем использоватьtry/catchблок для захвата и использованияdb.putУстановите начальное значение на1:

/* ... */module.exports = async function (request, response) {  const { pathname } = url.parse(request.url)  try {    const currentVisits = await db.get(pathname)  } catch (error) {    if (error.notFound) await db.put(pathname, 1)  }}скопировать код

Продолжайте и закончите, если запись доступа уже есть, нам нужно увеличить счетчик доступа и отправить ответ:

/* ... */module.exports = async function (request, response) {  const { pathname } = url.parse(request.url)  try {    const currentVisits = await db.get(pathname)    await db.put(pathname, currentVisits + 1)  } catch (error) {    if (error.notFound) await db.put(pathname, 1)  }  send(response, 200, `This page has ${await db.get(pathname)} visits!`)}скопировать код

Это все, что нам нужно сделать! Теперь запись доступа к странице сохраненаvists.dbВ файле перезапуск службы не повлияет. Попробуйте перезапустить службу, откройте ее несколько разlocalhost:3000/foo, затем перезапустите службу и снова посетите ту же страницу. Вы обнаружите, что предыдущее количество посещений все еще там, даже если служба была перезапущена.

Поздравляем, вы создали счетчик страниц менее чем за 10 минут! 🎉

В этом сила небольших централизованных модулей в Node.js. Не нужно возиться с базовыми компонентами, мы просто сосредоточимся на разработке приложений.