Микросервис — это автономная независимая единица, которая вместе с другими микросервисами образует большое приложение. Разделив приложение на небольшие блоки, каждый блок можно развертывать и масштабировать независимо, разрабатывать разные команды на разных языках программирования и тестировать независимо.
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
скопировать код
Откройте эту страницу в своем браузере, и вы увидите:
сделать что-нибудь полезное
Предыдущая работа немного скучновата, давайте сделаем что-нибудь полезное! Мы хотим создать микросервис, который записывает, сколько раз запрашивается заданный путь. то есть, когда/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. Не нужно возиться с базовыми компонентами, мы просто сосредоточимся на разработке приложений.