Прежде чем перейти к практическому аспекту разработки, обратимся к теоретическому понятию микросервисов.

Что такое микросервисы?

Мое любимое и самое простое определение:

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

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

Разработка микросервиса

В ходе демонстрации я буду использовать Windows. Весь код — в конце статьи. 

Предварительные условия

Базовое понимание Nodejs, маршрутизации, ExpressJS, HTTP-запросов

Установки:

  1. NodeJS.
  2. Docker Desktop для Windows.

Проверка установки Docker и NodeJS

Зайдите в командную строку в Windows и введите следующие команды:

node -v

docker -v

Установка прошла успешно.

Структура папок для проекта

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

Шаг 1. Создайте файл package.json, откройте папку, предназначенную для настройки проекта. Если вы используете VS Code, откройте терминал (ctrl+`) и введите команду npm init или npm init -y, чтобы пропустить интерактивный процесс.

Образец пакета.json

Шаг 2. Установите express через npm

npm install express

Шаг 3: Создайте 2 папки: “Databases” и “Services”.

Шаг 4: В папке “Databases” создайте файл fruits.json — здесь будете хранить информацию о фруктах. Можете создать фиктивный массив или использовать приведенные ниже данные.

fruits.json

Шаг 5. В папке “Services” создайте файл fruits.js. Можете назвать его по своему усмотрению и скопировать следующее содержимое. Здесь вы создадите базовые маршруты, которые будут отображать информацию о фруктах, импортированных из файла базы данных.

fruits.js

Шаг 6: Создайте app.js в корневом каталоге — здесь вы будете импортировать “Services” и слушать запросы через PORT 3000.

const {app}=require('./services/fruits')
app.listen(3000,()=>{
console.log("Server is running on PORT 3000")
})

Шаг 7. Перейдите в папку проекта через командную строку или, если используете VS Code, нажмите ctrl+` и введите node app.js

Шаг 8. Перейдите в localhost:3000 в браузере — и все готово. Поздравляю! 🎉 Мы уже на полпути к цели.

Не волнуйтесь, если не получили стилизованный вывод, я использую это расширение

Теперь осталось контейнеризировать приложение.

Контейнеризация приложения

Предварительные условия

Базовые представления об образе, контейнере, а также основных docker-командах.

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

“Образы, по сути, являются кодовой базой для контейнеров; они содержат такие данные, как сам код, библиотеки, зависимости, команды для запуска приложения. Они похожи на шаблоны, только предназначенные для чтения, содержащие набор инструкций по созданию контейнера, который может работать на платформе Docker”.

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

“Контейнеры — фактическая среда выполнения приложений. Это готовые приложения, созданные из Docker-образов. Можно сказать, что они запускают экземпляры образов”.

Первым шагом к контейнеризации является создание образа. Есть 2 способа создать образ:

  1. Из контейнера
  2. Из файла Dockerfile.

Мы выберем второй — наиболее простой — вариант.

Что такое Dockerfile?

Dockerfile — это простой текстовый документ, содержащий все команды, которые пользователь может вызвать в командной строке для сборки образа. Dockerfile используется для автоматизации процесса создания образа.

Теперь создайте файл с именем Dockerfile (без расширений типа .txt) в корневом каталоге вашего проекта и скопируйте следующий код:

Dockerfile

Объяснение команд из Dockerfile

FROM node:12

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

WORKDIR /app

Эта команда предписывает Docker использовать указанный путь в качестве местоположения по умолчанию для всех последующих команд.

COPY package.json /app

Команда COPY используется для помещения package.json в рабочий каталог образа (/app). Эта команда имеет два параметра: первый сообщает Docker, какой файл вы хотите скопировать в образ, второй указывает Docker, куда нужно скопировать этот файл. После команды COPY файл package.json будет скопирован в рабочий каталог — /app.

RUN npm install

Как только файл package.json окажется внутри образа, команду RUN можно использовать для выполнения команды npm install. Это работает так же, как запуск npm install локально на компьютере, только модули node будут установлены в каталог node_modules внутри образа.

COPY . /app

Благодаря COPY все файлы, находящиеся в текущем каталоге, скопируются в каталог app в образе.

EXPOSE 3000

Команда EXPOSE сообщает Docker, что контейнер прослушивает указанные сетевые порты во время выполнения. Используйте тот же номер порта, который вы использовали в файле app.js.

CMD [“node”,”app.js”]

CMD указывает Docker, какую команду нужно выполнить, когда образ будет запущен внутри контейнера. Поскольку app.js запускает сервер, нужно выполнить его первым.

Многослойное представление docker-образа

Как уже говорилось выше, вы можете создать образ из файла Dockerfile, который теперь уже готов.

Создание образа

Чтобы создать образ, просто используйте приведенную ниже команду в корневом каталоге:

docker image build -t fruits-service:latest .

Флаг -t задает имя fruits-service с тегом latest.

.” в конце команды docker build указывает, что Docker должен искать Dockerfile в текущем каталоге. После выполнения приведенной выше команды из Dockerfile будет сгенерирован новый образ.

Вывод сборки docker-образа

Как видите, новый образ построен с именем fruits-service и тегом latest

Запуск контейнера

Вместо создания и запуска контейнера, мы можем запустить контейнер напрямую:

docker run = docker create + docker start + docker attach

Примечание: docker attach прикрепляет терминал к контейнеру, чтобы сделать его интерактивным. Выше уже говорилось, что контейнер действует как среда времени выполнения. В нем есть все элементы реальной среды приложения.

Чтобы запустить контейнер, выполните следующую команду:

docker container run -d --name fruitsmicroservice --publish 3000:3000 fruits-service:latest
Вывод docker-контейнера

-d указывает контейнеру запуститься в отсоединенном режиме — здесь мы не выполняем никаких команд в терминале, поэтому просто отсоединяем его.

 — name дает имя fruitsmicroservice контейнеру вместо случайной строки.

 — publish раскрывает порт созданного приложения — выше мы упомянули 3000 в Dockefile, поэтому нам нужно раскрыть его.

Вам следует понять концепцию отображения портов в docker: первый 3000 в — publish 3000:3000 указывает порт хоста, второй 3000 — порт контейнера. Если у вас уже что-то запущено на порту хоста 3000, можете использовать 3001:3000.

Проверьте состояние контейнера с помощью команды:

docker ps
Вывод docker ps

Откройте localhost:3000 в браузере и — ✨ ваше приложение запущено! Теперь можете попробовать все маршруты.

Не забудьте остановить контейнер после завершения работы. Используйте docker ps и получите ID контейнера. Выполните следующую команду для остановки контейнера:

docker container stop <container-id>

Итак, мы рассмотрели все шаги по созданию микросервиса на JavaScript и контейнеризации с помощью docker.

Приведенный выше код можно найти по ссылке: https://github.com/Deepakmukka1/microservice-fruits.

Спасибо, что дошли до конца 🙌. Надеюсь, вам понравилось.

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Deepak Mukka: Write Your First Microservice in JavaScript

Предыдущая статьяПрактикум по созданию сценариев командной строки
Следующая статья5 инструментов Chrome DevTools, упрощающих разработку