SlideShare a Scribd company logo
1 of 75
Download to read offline
HolyJS / SPb / June 5 2016
Инфраструктура
распределенных
приложений на Node.js
Stanislav Gumeniuk,
SEMrush
HolyJS / SPb / June 5 2016
Инфраструктура распределенных приложений
1. Инструменты для запуска, мониторинга, etc;
2. Архитектурные решения: от монолита к микросервисам;
3. Инкапсуляция микросервисов;
4. Связывание микросервисов и сервисов;
2
HolyJS / SPb / June 5 2016
HelloWorld / Node.js
"use strict";
var Koa = require('koa');
const app = new Koa();
app.use(ctx => {
ctx.body = 'Hello Koa@2';
});
app.listen(3000);
3
HolyJS / SPb / June 5 2016
Что мы хотим?
1. Разделение логов на потоки,
управление потоками логов;
2. Мониторинг состояния приложения
( загрузка CPU, память, статус, etc.. );
3. Автоматический перезапуск при падении.
4
HolyJS / SPb / June 5 2016
Запускаем HelloWorld
Базовый инструмент
$ node app.js
5
HolyJS / SPb / June 5 2016
Запускаем HelloWorld
Базовый инструмент
$ node app.js
Умный инструмент
$ nodemon app.js
6
HolyJS / SPb / June 5 2016
Запускаем HelloWorld
Базовый инструмент
$ node app.js
Умный инструмент
$ nodemon app.js
Продвинутый инструмент
$ pm2 start app.js
7
HolyJS / SPb / June 5 2016
8
HolyJS / SPb / June 5 2016
pm2 start app.js
$ pm2 start app.js
9
HolyJS / SPb / June 5 2016
HelloWorld / Node.js / 2
var Koa = require('koa');
const app = new Koa();
app.use(ctx => {
console.log('send responce');
ctx.body = 'Hello Koa@2';
});
console.error('fake error');
app.listen(5000);
10
HolyJS / SPb / June 5 2016
pm2 start app.js / pm2 logs app
$ pm2 logs app
[PM2] Tailing last 20 lines for [app] process
app-14 (err): fake error
app-14 (out): send responce
app-14 (out): send responce
[PM2] Streaming realtime logs for [app] process
11
HolyJS / SPb / June 5 2016
pm2 info <app_name>
12
HolyJS / SPb / June 5 2016
Ещё возможности pm2
- Запуск несколько приложений одной командой;
- Deploy одной командой;
- Встроенная кластеризация(!)
13
HolyJS / SPb / June 5 2016
ecosystem.json
{
"apps": [
{
"name": "app",
"script": "app.js",
"env": {
"NODE_ENV": "production"
}
}
]
}
14
HolyJS / SPb / June 5 2016
pm2 startOrRestart ecosystem.json
$ pm2 startOrRestart ecosystem.json
15
HolyJS / SPb / June 5 2016
ecosystem.json
{
"apps": [
{
"name": "app",
"script": "app.js",
"env": {
"NODE_ENV": "production"
},
"instances": "2"
}
]
}
16
HolyJS / SPb / June 5 2016
pm2 startOrRestart ecosystem.json
$ pm2 startOrRestart ecosystem.json
17
HolyJS / SPb / June 5 2016
pm2 cluster
pm2
app
app
api
18
HolyJS / SPb / June 5 2016
Инфраструктура с гипервизором
app.js
pm2
app2.js
logs
19
HolyJS / SPb / June 5 2016
pm2:
1. Логи: разбиты по потокам и пишутся в
файлы
2. Мониторинг: memory, restarts, etc..
3. Перезапуск при падении
4. Кластеризация из коробки
5. Deploy
20
HolyJS / SPb / June 5 2016
Архитектура
от монолита к микросервисам
HolyJS / SPb / June 5 2016
От монолита к микросервисам
1. Падение монолита - падение всей системы;
2. Падение микросервиса - падение элемента системы, при сохранении
рабочей системы;
3. Распределение нагрузок;
4. Проще внедрять и заменять новые элементы в систему;
5. Мониторинг состояний каждого элемента системы.
22
HolyJS / SPb / June 5 2016
Взаимодействие с внешним миром
app
23
HolyJS / SPb / June 5 2016
Взаимодействие с внешним миром
nginx app
24
HolyJS / SPb / June 5 2016
Взаимодействие с внешним миром
app
app
nginx
front / SPA
front
app / api
25
HolyJS / SPb / June 5 2016
Взаимодействие с внешним миром
app
app
nginx
front / SPA
front
app / api
app / api
26
HolyJS / SPb / June 5 2016
Взаимодействие с внешним миром
nginx
front / SPA
front
app / api
app / api
nginx
27
HolyJS / SPb / June 5 2016
Архитектура
app
28
HolyJS / SPb / June 5 2016
Архитектура
api
29
HolyJS / SPb / June 5 2016
Архитектура
api
DB
30
HolyJS / SPb / June 5 2016
Архитектура
api
DB
worker
31
HolyJS / SPb / June 5 2016
Архитектура
api
DB
worker
?
?
32
HolyJS / SPb / June 5 2016
Архитектура
api
DB
worker
33
HolyJS / SPb / June 5 2016
Архитектура
api
DB
worker 2
worker
34
HolyJS / SPb / June 5 2016
Архитектура
api
DB
worker 2
worker
front
35
HolyJS / SPb / June 5 2016
Архитектура API
nginx
app
app
api
36
HolyJS / SPb / June 5 2016
Архитектура API
nginx app
app
api
nginx
37
HolyJS / SPb / June 5 2016
HolyJS / SPb / June 5 2016
Инкапсуляция микросервисов - Docker
1. Все зависимости внутри;
2. Единое хранилище образов приложений;
3. Быстрая поставка приложения.
39
HolyJS / SPb / June 5 2016
Docker lifeline : Dockerfile
App: Dockerfile
FROM node:4.2.3
ADD . /code
WORKDIR /code
RUN npm i
CMD node app.js
EXPOSE 5000
40
HolyJS / SPb / June 5 2016
Docker lifeline : docker build img
App: Dockerfile
App: Docker image
docker build -t foo/app .
docker build -t foo/app:1.0 .
41
HolyJS / SPb / June 5 2016
Docker lifeline : push image
App: Dockerfile
App: Docker image
Docker registry
app:img
docker push foo/app
42
HolyJS / SPb / June 5 2016
Docker lifeline
App: Dockerfile
App: Docker image
Docker registry
app:img
app
docker pull foo/app
docker run foo/app
43
HolyJS / SPb / June 5 2016
Docker lifeline
App: Dockerfile
App: Docker image
Docker registry
app:img db:img
app app app db
44
HolyJS / SPb / June 5 2016
Dockerfile
FROM node:4.2.3
ADD . /code
WORKDIR /code
RUN npm i
CMD node app.js
EXPOSE 5000
45
HolyJS / SPb / June 5 2016
Dockerfile
FROM node:4.2.3
ADD . /code
WORKDIR /code
RUN npm i
CMD node app.js
EXPOSE 5000
46
HolyJS / SPb / June 5 2016
Dockerfile
FROM node:4.2.3
ADD . /code
WORKDIR /code
RUN npm i
CMD node app.js
EXPOSE 5000
47
HolyJS / SPb / June 5 2016
Dockerfile
FROM node:4.2.3
ADD . /code
WORKDIR /code
RUN npm i
CMD node app.js
EXPOSE 5000
48
HolyJS / SPb / June 5 2016
Dockerfile
FROM node:4.2.3
ADD . /code
WORKDIR /code
RUN npm i
CMD node app.js
EXPOSE 5000
49
HolyJS / SPb / June 5 2016
Dockerfile + pm2
FROM node:4.2.3
ADD . /code
WORKDIR /code
RUN npm i && npm i -g pm2
CMD pm2 startOrRestart ecosystem.json --env docker --no-daemon
EXPOSE 5000
50
HolyJS / SPb / June 5 2016
Что мы получаем от Docker
- Удобная поставка приложения:
- запуск приложения одной командой;
- возможность запуска множества копий приложения;
- экономия времени системных администраторов;
- Инкапсуляция зависимостей:
- все зависимости внутри
- отсутствие конфликтов версионирования зависимостей
- не оставляет лишних следов в хостовой системе
- Docker + pm2 = стабильность при “случайных” падениях приложения
51
HolyJS / SPb / June 5 2016
Consul
Связывание микросервисов
HolyJS / SPb / June 5 2016
Решение проблем с помощью Consul
1. Мониторинг статуса сервисов;
2. Реестр всех запущенных сервисов;
3. Поиск сервисов;
4. Доставка конфигов “налету”;
53
HolyJS / SPb / June 5 2016
Consul
Consul
localhost:8300 - server rpc
localhost:8301 - serf lan
localhost:8302 - serf wan
localhost:8400 - cli rpc
localhost:8500 - http api
localhost:8600 - dns
54
HolyJS / SPb / June 5 2016
Consul
Consul
Consul
Consul
55
HolyJS / SPb / June 5 2016
Consul : Key-Value
Consul
Consul
Consuln1:v1
56
HolyJS / SPb / June 5 2016
Consul : Key-Value
Consul
Consul
Consuln1:v1
n1:v1
n1:v1
57
HolyJS / SPb / June 5 2016
Consul : Service Discovery
app DB
database: ‘localhost:3306’
host
58
HolyJS / SPb / June 5 2016
Consul : Service Discovery
app DB
database: ‘host2:3306’
host1 host2
59
HolyJS / SPb / June 5 2016
Consul : Service Discovery
app DB
database: ‘???:3306’
host1 virtual host
60
HolyJS / SPb / June 5 2016
Consul : Service Discovery
api
api: ‘???:???’
hostX/Docker hostY/Docker
worker
61
HolyJS / SPb / June 5 2016
Consul : Service Discovery
app DB
database: ‘db.service.sd:3306’
host1 virtual host
62
HolyJS / SPb / June 5 2016
Consul : Service Discovery
api
curl http://sd/service/api
{
host: ‘api.service.sd’,
port: ‘8888’
}hostX/Docker hostY/Docker
worker
63
HolyJS / SPb / June 5 2016
Установка Consul
1. Установить на каждый сервер
64
HolyJS / SPb / June 5 2016
Установка Consul
1. Установить на каждый сервер
2. Использовать Docker!
65
HolyJS / SPb / June 5 2016
Установка Consul
1. Установить на каждый сервер
2. Использовать Docker!
$ docker run --name consul -h $HOSTNAME 
-p 10.0.1.1:8300:8300 
-p 10.0.1.1:8301:8301 
-p 10.0.1.1:8301:8301/udp 
-p 10.0.1.1:8302:8302 
-p 10.0.1.1:8302:8302/udp 
-p 10.0.1.1:8400:8400 
-p 10.0.1.1:8500:8500 
-p 172.17.42.1:53:53/udp 
-d -v /mnt:/data 
progrium/consul -server -advertise 10.0.1.1 -join 10.0.1.2
66
HolyJS / SPb / June 5 2016
$ pm2 install pm2-consul
Добавляем поддержку Consul для pm2
67
HolyJS / SPb / June 5 2016
$ pm2 install pm2-consul
Добавляем поддержку Consul для pm2
68
HolyJS / SPb / June 5 2016
Добавляем поддержку Consul для pm2
69
HolyJS / SPb / June 5 2016
$ docker pull gliderlabs/registrator:latest
$ docker run -d 
--name=registrator 
--net=host 
--volume=/var/run/docker.sock:/tmp/docker.sock 
gliderlabs/registrator:latest 
consul://localhost:8500
Добавляем поддержку Consul в Docker
70
HolyJS / SPb / June 5 2016
- Dnsmasq 53->8600
- docker run … -dns $HOSTNAME
Добавляем поддержку Consul в Docker
71
HolyJS / SPb / June 5 2016
Что мы получаем от Consul?
- Распределенное key-value хранилище
- Service Discovery
- Monitoring
- Полное понимание статуса сервисов
- Доступность сервисов
- Легкое управление конфигами и
быстрая доставка конфигов сервисам
72
HolyJS / SPb / June 5 2016
app
api
DB
worker 2
worker
front
external
app
Consul
73
HolyJS / SPb / June 5 2016
Спасибо!
74
HolyJS / SPb / June 5 2016
Ссылки и контакты
Stanislav Gumeniuk
https://gumeniuk.com/
mailto: i@vigo.su
@vigo5190
https://hub.docker.com/r/progrium/consul/
https://www.npmjs.com/package/pm2-consul
75

More Related Content

What's hot

Maven как средство сборки проекта
Maven как средство сборки проектаMaven как средство сборки проекта
Maven как средство сборки проектаYova Stoika
 
Артём Ерошенко «Рецепт приготовления облачных тестингов»
Артём Ерошенко «Рецепт приготовления облачных тестингов»Артём Ерошенко «Рецепт приготовления облачных тестингов»
Артём Ерошенко «Рецепт приготовления облачных тестингов»WrikeTechClub
 
Процесс разработки и тестирования с Docker + gitlab ci
Процесс разработки и тестирования с  Docker + gitlab ciПроцесс разработки и тестирования с  Docker + gitlab ci
Процесс разработки и тестирования с Docker + gitlab ciАлександр Сигачев
 
Внедрение Docker в процесс разработки демонов. Доклад Константина Карпова на ...
Внедрение Docker в процесс разработки демонов. Доклад Константина Карпова на ...Внедрение Docker в процесс разработки демонов. Доклад Константина Карпова на ...
Внедрение Docker в процесс разработки демонов. Доклад Константина Карпова на ...Badoo Development
 
Первые шаги с RabbitMQ
Первые шаги с RabbitMQПервые шаги с RabbitMQ
Первые шаги с RabbitMQAlexander Svetkin
 
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...Ontico
 
Михаил Боднарчук "Docker для PHP разработчиков"
Михаил Боднарчук "Docker для PHP разработчиков" Михаил Боднарчук "Docker для PHP разработчиков"
Михаил Боднарчук "Docker для PHP разработчиков" Fwdays
 
Обзор Linux Control Groups
Обзор Linux Control GroupsОбзор Linux Control Groups
Обзор Linux Control GroupsOSLL
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Ontico
 
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)Ontico
 
Ansible in the enterprise
Ansible in the enterpriseAnsible in the enterprise
Ansible in the enterpriseAlex Chistyakov
 
Олег Бартунов и Иван Панченко
Олег Бартунов и Иван ПанченкоОлег Бартунов и Иван Панченко
Олег Бартунов и Иван ПанченкоCodeFest
 
Dump-IT Загрузка и инициализация JavaScript
Dump-IT Загрузка и инициализация JavaScriptDump-IT Загрузка и инициализация JavaScript
Dump-IT Загрузка и инициализация JavaScriptMikhail Davydov
 
My talk on Docker from Moscow Django Meetup #25
My talk on Docker from Moscow Django Meetup #25My talk on Docker from Moscow Django Meetup #25
My talk on Docker from Moscow Django Meetup #25Alex Chistyakov
 
Доклад "Docker в Badoo: от восторгов к внедрению" на DevOps Meetup
Доклад "Docker в Badoo: от восторгов к внедрению" на DevOps MeetupДоклад "Docker в Badoo: от восторгов к внедрению" на DevOps Meetup
Доклад "Docker в Badoo: от восторгов к внедрению" на DevOps MeetupBadoo Development
 
Docker integration into Badoo
Docker integration into BadooDocker integration into Badoo
Docker integration into BadooAnton Turetsky
 
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проектаКолёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проектаITCrowd Almaty
 
Разработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервисаРазработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервисаendeveit
 
ASP.Net Core
ASP.Net CoreASP.Net Core
ASP.Net CoreArturDr
 

What's hot (20)

Maven как средство сборки проекта
Maven как средство сборки проектаMaven как средство сборки проекта
Maven как средство сборки проекта
 
Артём Ерошенко «Рецепт приготовления облачных тестингов»
Артём Ерошенко «Рецепт приготовления облачных тестингов»Артём Ерошенко «Рецепт приготовления облачных тестингов»
Артём Ерошенко «Рецепт приготовления облачных тестингов»
 
Процесс разработки и тестирования с Docker + gitlab ci
Процесс разработки и тестирования с  Docker + gitlab ciПроцесс разработки и тестирования с  Docker + gitlab ci
Процесс разработки и тестирования с Docker + gitlab ci
 
Внедрение Docker в процесс разработки демонов. Доклад Константина Карпова на ...
Внедрение Docker в процесс разработки демонов. Доклад Константина Карпова на ...Внедрение Docker в процесс разработки демонов. Доклад Константина Карпова на ...
Внедрение Docker в процесс разработки демонов. Доклад Константина Карпова на ...
 
Первые шаги с RabbitMQ
Первые шаги с RabbitMQПервые шаги с RabbitMQ
Первые шаги с RabbitMQ
 
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...Автоматизация тестирования клиентской производительности / Николай Лавлинский...
Автоматизация тестирования клиентской производительности / Николай Лавлинский...
 
Михаил Боднарчук "Docker для PHP разработчиков"
Михаил Боднарчук "Docker для PHP разработчиков" Михаил Боднарчук "Docker для PHP разработчиков"
Михаил Боднарчук "Docker для PHP разработчиков"
 
Обзор Linux Control Groups
Обзор Linux Control GroupsОбзор Linux Control Groups
Обзор Linux Control Groups
 
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)Движение по хрупкому дну / Сергей Караткевич (servers.ru)
Движение по хрупкому дну / Сергей Караткевич (servers.ru)
 
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)
Кит на службе у человека microPaaS Deis / Алексей Медведчиков (2ГИС)
 
Ansible in the enterprise
Ansible in the enterpriseAnsible in the enterprise
Ansible in the enterprise
 
Применяем Ansible
Применяем AnsibleПрименяем Ansible
Применяем Ansible
 
Олег Бартунов и Иван Панченко
Олег Бартунов и Иван ПанченкоОлег Бартунов и Иван Панченко
Олег Бартунов и Иван Панченко
 
Dump-IT Загрузка и инициализация JavaScript
Dump-IT Загрузка и инициализация JavaScriptDump-IT Загрузка и инициализация JavaScript
Dump-IT Загрузка и инициализация JavaScript
 
My talk on Docker from Moscow Django Meetup #25
My talk on Docker from Moscow Django Meetup #25My talk on Docker from Moscow Django Meetup #25
My talk on Docker from Moscow Django Meetup #25
 
Доклад "Docker в Badoo: от восторгов к внедрению" на DevOps Meetup
Доклад "Docker в Badoo: от восторгов к внедрению" на DevOps MeetupДоклад "Docker в Badoo: от восторгов к внедрению" на DevOps Meetup
Доклад "Docker в Badoo: от восторгов к внедрению" на DevOps Meetup
 
Docker integration into Badoo
Docker integration into BadooDocker integration into Badoo
Docker integration into Badoo
 
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проектаКолёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
Колёса: Раньше и сейчас. Как поменять архитектуру высоконагруженного проекта
 
Разработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервисаРазработка API для большого, нагруженного сервиса
Разработка API для большого, нагруженного сервиса
 
ASP.Net Core
ASP.Net CoreASP.Net Core
ASP.Net Core
 

Viewers also liked

AllcountJS VTB24 loan сonveyor POC
AllcountJS VTB24 loan сonveyor POCAllcountJS VTB24 loan сonveyor POC
AllcountJS VTB24 loan сonveyor POCPavel Tiunov
 
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012Dmytro Mindra
 
Moscow js node.js enterprise development
Moscow js node.js enterprise developmentMoscow js node.js enterprise development
Moscow js node.js enterprise developmentPavel Tiunov
 
Learn Developing REST API in Node.js using LoopBack Framework
Learn Developing REST API  in Node.js using LoopBack FrameworkLearn Developing REST API  in Node.js using LoopBack Framework
Learn Developing REST API in Node.js using LoopBack FrameworkMarudi Subakti
 
Use Node.js to create a REST API
Use Node.js to create a REST APIUse Node.js to create a REST API
Use Node.js to create a REST APIFabien Vauchelles
 
ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS Pavel Tsukanov
 
Introduction to REST API with Node.js
Introduction to REST API with Node.jsIntroduction to REST API with Node.js
Introduction to REST API with Node.jsYoann Gotthilf
 
Архитектура программных систем на Node.js
Архитектура программных систем на Node.jsАрхитектура программных систем на Node.js
Архитектура программных систем на Node.jsTimur Shemsedinov
 
Асинхронность и параллелизм в Node.js
Асинхронность и параллелизм в Node.jsАсинхронность и параллелизм в Node.js
Асинхронность и параллелизм в Node.jsGeeksLab Odessa
 
Developing and Testing a MongoDB and Node.js REST API
Developing and Testing a MongoDB and Node.js REST APIDeveloping and Testing a MongoDB and Node.js REST API
Developing and Testing a MongoDB and Node.js REST APIAll Things Open
 
Anatomy of a Modern Node.js Application Architecture
Anatomy of a Modern Node.js Application Architecture Anatomy of a Modern Node.js Application Architecture
Anatomy of a Modern Node.js Application Architecture AppDynamics
 
2009_AdvMater_Nanopatterning via pressure-induced instabilities in thin polym...
2009_AdvMater_Nanopatterning via pressure-induced instabilities in thin polym...2009_AdvMater_Nanopatterning via pressure-induced instabilities in thin polym...
2009_AdvMater_Nanopatterning via pressure-induced instabilities in thin polym...Ximin He
 
Intro presentation for prezi
Intro presentation for preziIntro presentation for prezi
Intro presentation for preziElizabeth McGlone
 
App builder svco-productdeck-basilarackal
App builder svco-productdeck-basilarackalApp builder svco-productdeck-basilarackal
App builder svco-productdeck-basilarackalNihal Ismail
 

Viewers also liked (17)

AllcountJS VTB24 loan сonveyor POC
AllcountJS VTB24 loan сonveyor POCAllcountJS VTB24 loan сonveyor POC
AllcountJS VTB24 loan сonveyor POC
 
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012
Web В РЕАЛЬНОМ ВРЕМЕНИ С Node.js - AgileBaseCamp - 2012
 
Moscow js node.js enterprise development
Moscow js node.js enterprise developmentMoscow js node.js enterprise development
Moscow js node.js enterprise development
 
Learn Developing REST API in Node.js using LoopBack Framework
Learn Developing REST API  in Node.js using LoopBack FrameworkLearn Developing REST API  in Node.js using LoopBack Framework
Learn Developing REST API in Node.js using LoopBack Framework
 
Use Node.js to create a REST API
Use Node.js to create a REST APIUse Node.js to create a REST API
Use Node.js to create a REST API
 
ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS
 
Introduction to REST API with Node.js
Introduction to REST API with Node.jsIntroduction to REST API with Node.js
Introduction to REST API with Node.js
 
Архитектура программных систем на Node.js
Архитектура программных систем на Node.jsАрхитектура программных систем на Node.js
Архитектура программных систем на Node.js
 
Асинхронность и параллелизм в Node.js
Асинхронность и параллелизм в Node.jsАсинхронность и параллелизм в Node.js
Асинхронность и параллелизм в Node.js
 
Developing and Testing a MongoDB and Node.js REST API
Developing and Testing a MongoDB and Node.js REST APIDeveloping and Testing a MongoDB and Node.js REST API
Developing and Testing a MongoDB and Node.js REST API
 
Anatomy of a Modern Node.js Application Architecture
Anatomy of a Modern Node.js Application Architecture Anatomy of a Modern Node.js Application Architecture
Anatomy of a Modern Node.js Application Architecture
 
Pp for fr 2-2
Pp for fr 2-2Pp for fr 2-2
Pp for fr 2-2
 
Veronica Roth
Veronica RothVeronica Roth
Veronica Roth
 
2009_AdvMater_Nanopatterning via pressure-induced instabilities in thin polym...
2009_AdvMater_Nanopatterning via pressure-induced instabilities in thin polym...2009_AdvMater_Nanopatterning via pressure-induced instabilities in thin polym...
2009_AdvMater_Nanopatterning via pressure-induced instabilities in thin polym...
 
Intro presentation for prezi
Intro presentation for preziIntro presentation for prezi
Intro presentation for prezi
 
App builder svco-productdeck-basilarackal
App builder svco-productdeck-basilarackalApp builder svco-productdeck-basilarackal
App builder svco-productdeck-basilarackal
 
W_Magazine_Winter16
W_Magazine_Winter16W_Magazine_Winter16
W_Magazine_Winter16
 

Similar to Инфраструктура распределенных приложений на Node.js

Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambl...
Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambl...Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambl...
Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambl...Ontico
 
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемыMoscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемыOleg Nenashev
 
Практические примеры использования API в инфраструктурных продуктах Cisco для...
Практические примеры использования API в инфраструктурных продуктах Cisco для...Практические примеры использования API в инфраструктурных продуктах Cisco для...
Практические примеры использования API в инфраструктурных продуктах Cisco для...Cisco Russia
 
Cocaine: погружение в облака — Евгений Сафронов
Cocaine: погружение в облака — Евгений СафроновCocaine: погружение в облака — Евгений Сафронов
Cocaine: погружение в облака — Евгений СафроновYandex
 
Backend as a service Scorocode for mobile, web and desktop apps
Backend as a service Scorocode for mobile, web and desktop appsBackend as a service Scorocode for mobile, web and desktop apps
Backend as a service Scorocode for mobile, web and desktop appsMichael Epikhin
 
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Александр Егурцов
 
Денис Паясь
Денис ПаясьДенис Паясь
Денис ПаясьCodeFest
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPITimur Shemsedinov
 
Доставка данных в реальном времени.
Доставка данных в реальном времени. Доставка данных в реальном времени.
Доставка данных в реальном времени. beshkenadze
 
Jenkins 2.0: Организуем тестирование в составе Continuous Delivery
Jenkins 2.0: Организуем тестирование в составе Continuous DeliveryJenkins 2.0: Организуем тестирование в составе Continuous Delivery
Jenkins 2.0: Организуем тестирование в составе Continuous DeliverySQALab
 
Сравнение ТОП 5 SIEM РФ
Сравнение ТОП 5 SIEM РФСравнение ТОП 5 SIEM РФ
Сравнение ТОП 5 SIEM РФPete Kuzeev
 
AgileDays 2016. Внедрение Agile в Банке
AgileDays 2016. Внедрение Agile в БанкеAgileDays 2016. Внедрение Agile в Банке
AgileDays 2016. Внедрение Agile в БанкеМихаил Кононов
 
Владимир Еремин. Extending Openstack. PyCon Belarus 2015
Владимир Еремин. Extending Openstack. PyCon Belarus 2015Владимир Еремин. Extending Openstack. PyCon Belarus 2015
Владимир Еремин. Extending Openstack. PyCon Belarus 2015Alina Dolgikh
 
Денис Измайлов, JavaScript сегодня: React, Redux и новая реальность
Денис Измайлов, JavaScript сегодня: React, Redux и новая реальностьДенис Измайлов, JavaScript сегодня: React, Redux и новая реальность
Денис Измайлов, JavaScript сегодня: React, Redux и новая реальностьScrumTrek
 
JavaScript сегодня: React, Redux и новая реальность
JavaScript сегодня: React, Redux и новая реальностьJavaScript сегодня: React, Redux и новая реальность
JavaScript сегодня: React, Redux и новая реальностьDenis Izmaylov
 
Sencha Complete: Kharkiv JS #1
Sencha Complete: Kharkiv JS #1Sencha Complete: Kharkiv JS #1
Sencha Complete: Kharkiv JS #1Illya Klymov
 
Кроссплатформенная разработка на aspnet
Кроссплатформенная разработка на aspnet Кроссплатформенная разработка на aspnet
Кроссплатформенная разработка на aspnet Eugene Agafonov
 
Кросплатформенная разработка на ASP.NET vNext
Кросплатформенная разработка на ASP.NET vNextКросплатформенная разработка на ASP.NET vNext
Кросплатформенная разработка на ASP.NET vNextGoSharp
 
Роман Бусыгин "Автосборки iOS-проектов в Яндексе"
Роман Бусыгин "Автосборки iOS-проектов в Яндексе"Роман Бусыгин "Автосборки iOS-проектов в Яндексе"
Роман Бусыгин "Автосборки iOS-проектов в Яндексе"Yandex
 

Similar to Инфраструктура распределенных приложений на Node.js (20)

Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambl...
Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambl...Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambl...
Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambl...
 
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемыMoscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
Moscow Jenkins Meetup #1. Pipeline для инженеров. Обзор экосистемы
 
Практические примеры использования API в инфраструктурных продуктах Cisco для...
Практические примеры использования API в инфраструктурных продуктах Cisco для...Практические примеры использования API в инфраструктурных продуктах Cisco для...
Практические примеры использования API в инфраструктурных продуктах Cisco для...
 
Cocaine: погружение в облака — Евгений Сафронов
Cocaine: погружение в облака — Евгений СафроновCocaine: погружение в облака — Евгений Сафронов
Cocaine: погружение в облака — Евгений Сафронов
 
Backend as a service Scorocode for mobile, web and desktop apps
Backend as a service Scorocode for mobile, web and desktop appsBackend as a service Scorocode for mobile, web and desktop apps
Backend as a service Scorocode for mobile, web and desktop apps
 
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)Устройство фреймворка symfony 2 (http://frontend-dev.ru)
Устройство фреймворка symfony 2 (http://frontend-dev.ru)
 
Крыша 2.0
Крыша 2.0Крыша 2.0
Крыша 2.0
 
Денис Паясь
Денис ПаясьДенис Паясь
Денис Паясь
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
Доставка данных в реальном времени.
Доставка данных в реальном времени. Доставка данных в реальном времени.
Доставка данных в реальном времени.
 
Jenkins 2.0: Организуем тестирование в составе Continuous Delivery
Jenkins 2.0: Организуем тестирование в составе Continuous DeliveryJenkins 2.0: Организуем тестирование в составе Continuous Delivery
Jenkins 2.0: Организуем тестирование в составе Continuous Delivery
 
Сравнение ТОП 5 SIEM РФ
Сравнение ТОП 5 SIEM РФСравнение ТОП 5 SIEM РФ
Сравнение ТОП 5 SIEM РФ
 
AgileDays 2016. Внедрение Agile в Банке
AgileDays 2016. Внедрение Agile в БанкеAgileDays 2016. Внедрение Agile в Банке
AgileDays 2016. Внедрение Agile в Банке
 
Владимир Еремин. Extending Openstack. PyCon Belarus 2015
Владимир Еремин. Extending Openstack. PyCon Belarus 2015Владимир Еремин. Extending Openstack. PyCon Belarus 2015
Владимир Еремин. Extending Openstack. PyCon Belarus 2015
 
Денис Измайлов, JavaScript сегодня: React, Redux и новая реальность
Денис Измайлов, JavaScript сегодня: React, Redux и новая реальностьДенис Измайлов, JavaScript сегодня: React, Redux и новая реальность
Денис Измайлов, JavaScript сегодня: React, Redux и новая реальность
 
JavaScript сегодня: React, Redux и новая реальность
JavaScript сегодня: React, Redux и новая реальностьJavaScript сегодня: React, Redux и новая реальность
JavaScript сегодня: React, Redux и новая реальность
 
Sencha Complete: Kharkiv JS #1
Sencha Complete: Kharkiv JS #1Sencha Complete: Kharkiv JS #1
Sencha Complete: Kharkiv JS #1
 
Кроссплатформенная разработка на aspnet
Кроссплатформенная разработка на aspnet Кроссплатформенная разработка на aspnet
Кроссплатформенная разработка на aspnet
 
Кросплатформенная разработка на ASP.NET vNext
Кросплатформенная разработка на ASP.NET vNextКросплатформенная разработка на ASP.NET vNext
Кросплатформенная разработка на ASP.NET vNext
 
Роман Бусыгин "Автосборки iOS-проектов в Яндексе"
Роман Бусыгин "Автосборки iOS-проектов в Яндексе"Роман Бусыгин "Автосборки iOS-проектов в Яндексе"
Роман Бусыгин "Автосборки iOS-проектов в Яндексе"
 

Инфраструктура распределенных приложений на Node.js

  • 1. HolyJS / SPb / June 5 2016 Инфраструктура распределенных приложений на Node.js Stanislav Gumeniuk, SEMrush
  • 2. HolyJS / SPb / June 5 2016 Инфраструктура распределенных приложений 1. Инструменты для запуска, мониторинга, etc; 2. Архитектурные решения: от монолита к микросервисам; 3. Инкапсуляция микросервисов; 4. Связывание микросервисов и сервисов; 2
  • 3. HolyJS / SPb / June 5 2016 HelloWorld / Node.js "use strict"; var Koa = require('koa'); const app = new Koa(); app.use(ctx => { ctx.body = 'Hello Koa@2'; }); app.listen(3000); 3
  • 4. HolyJS / SPb / June 5 2016 Что мы хотим? 1. Разделение логов на потоки, управление потоками логов; 2. Мониторинг состояния приложения ( загрузка CPU, память, статус, etc.. ); 3. Автоматический перезапуск при падении. 4
  • 5. HolyJS / SPb / June 5 2016 Запускаем HelloWorld Базовый инструмент $ node app.js 5
  • 6. HolyJS / SPb / June 5 2016 Запускаем HelloWorld Базовый инструмент $ node app.js Умный инструмент $ nodemon app.js 6
  • 7. HolyJS / SPb / June 5 2016 Запускаем HelloWorld Базовый инструмент $ node app.js Умный инструмент $ nodemon app.js Продвинутый инструмент $ pm2 start app.js 7
  • 8. HolyJS / SPb / June 5 2016 8
  • 9. HolyJS / SPb / June 5 2016 pm2 start app.js $ pm2 start app.js 9
  • 10. HolyJS / SPb / June 5 2016 HelloWorld / Node.js / 2 var Koa = require('koa'); const app = new Koa(); app.use(ctx => { console.log('send responce'); ctx.body = 'Hello Koa@2'; }); console.error('fake error'); app.listen(5000); 10
  • 11. HolyJS / SPb / June 5 2016 pm2 start app.js / pm2 logs app $ pm2 logs app [PM2] Tailing last 20 lines for [app] process app-14 (err): fake error app-14 (out): send responce app-14 (out): send responce [PM2] Streaming realtime logs for [app] process 11
  • 12. HolyJS / SPb / June 5 2016 pm2 info <app_name> 12
  • 13. HolyJS / SPb / June 5 2016 Ещё возможности pm2 - Запуск несколько приложений одной командой; - Deploy одной командой; - Встроенная кластеризация(!) 13
  • 14. HolyJS / SPb / June 5 2016 ecosystem.json { "apps": [ { "name": "app", "script": "app.js", "env": { "NODE_ENV": "production" } } ] } 14
  • 15. HolyJS / SPb / June 5 2016 pm2 startOrRestart ecosystem.json $ pm2 startOrRestart ecosystem.json 15
  • 16. HolyJS / SPb / June 5 2016 ecosystem.json { "apps": [ { "name": "app", "script": "app.js", "env": { "NODE_ENV": "production" }, "instances": "2" } ] } 16
  • 17. HolyJS / SPb / June 5 2016 pm2 startOrRestart ecosystem.json $ pm2 startOrRestart ecosystem.json 17
  • 18. HolyJS / SPb / June 5 2016 pm2 cluster pm2 app app api 18
  • 19. HolyJS / SPb / June 5 2016 Инфраструктура с гипервизором app.js pm2 app2.js logs 19
  • 20. HolyJS / SPb / June 5 2016 pm2: 1. Логи: разбиты по потокам и пишутся в файлы 2. Мониторинг: memory, restarts, etc.. 3. Перезапуск при падении 4. Кластеризация из коробки 5. Deploy 20
  • 21. HolyJS / SPb / June 5 2016 Архитектура от монолита к микросервисам
  • 22. HolyJS / SPb / June 5 2016 От монолита к микросервисам 1. Падение монолита - падение всей системы; 2. Падение микросервиса - падение элемента системы, при сохранении рабочей системы; 3. Распределение нагрузок; 4. Проще внедрять и заменять новые элементы в систему; 5. Мониторинг состояний каждого элемента системы. 22
  • 23. HolyJS / SPb / June 5 2016 Взаимодействие с внешним миром app 23
  • 24. HolyJS / SPb / June 5 2016 Взаимодействие с внешним миром nginx app 24
  • 25. HolyJS / SPb / June 5 2016 Взаимодействие с внешним миром app app nginx front / SPA front app / api 25
  • 26. HolyJS / SPb / June 5 2016 Взаимодействие с внешним миром app app nginx front / SPA front app / api app / api 26
  • 27. HolyJS / SPb / June 5 2016 Взаимодействие с внешним миром nginx front / SPA front app / api app / api nginx 27
  • 28. HolyJS / SPb / June 5 2016 Архитектура app 28
  • 29. HolyJS / SPb / June 5 2016 Архитектура api 29
  • 30. HolyJS / SPb / June 5 2016 Архитектура api DB 30
  • 31. HolyJS / SPb / June 5 2016 Архитектура api DB worker 31
  • 32. HolyJS / SPb / June 5 2016 Архитектура api DB worker ? ? 32
  • 33. HolyJS / SPb / June 5 2016 Архитектура api DB worker 33
  • 34. HolyJS / SPb / June 5 2016 Архитектура api DB worker 2 worker 34
  • 35. HolyJS / SPb / June 5 2016 Архитектура api DB worker 2 worker front 35
  • 36. HolyJS / SPb / June 5 2016 Архитектура API nginx app app api 36
  • 37. HolyJS / SPb / June 5 2016 Архитектура API nginx app app api nginx 37
  • 38. HolyJS / SPb / June 5 2016
  • 39. HolyJS / SPb / June 5 2016 Инкапсуляция микросервисов - Docker 1. Все зависимости внутри; 2. Единое хранилище образов приложений; 3. Быстрая поставка приложения. 39
  • 40. HolyJS / SPb / June 5 2016 Docker lifeline : Dockerfile App: Dockerfile FROM node:4.2.3 ADD . /code WORKDIR /code RUN npm i CMD node app.js EXPOSE 5000 40
  • 41. HolyJS / SPb / June 5 2016 Docker lifeline : docker build img App: Dockerfile App: Docker image docker build -t foo/app . docker build -t foo/app:1.0 . 41
  • 42. HolyJS / SPb / June 5 2016 Docker lifeline : push image App: Dockerfile App: Docker image Docker registry app:img docker push foo/app 42
  • 43. HolyJS / SPb / June 5 2016 Docker lifeline App: Dockerfile App: Docker image Docker registry app:img app docker pull foo/app docker run foo/app 43
  • 44. HolyJS / SPb / June 5 2016 Docker lifeline App: Dockerfile App: Docker image Docker registry app:img db:img app app app db 44
  • 45. HolyJS / SPb / June 5 2016 Dockerfile FROM node:4.2.3 ADD . /code WORKDIR /code RUN npm i CMD node app.js EXPOSE 5000 45
  • 46. HolyJS / SPb / June 5 2016 Dockerfile FROM node:4.2.3 ADD . /code WORKDIR /code RUN npm i CMD node app.js EXPOSE 5000 46
  • 47. HolyJS / SPb / June 5 2016 Dockerfile FROM node:4.2.3 ADD . /code WORKDIR /code RUN npm i CMD node app.js EXPOSE 5000 47
  • 48. HolyJS / SPb / June 5 2016 Dockerfile FROM node:4.2.3 ADD . /code WORKDIR /code RUN npm i CMD node app.js EXPOSE 5000 48
  • 49. HolyJS / SPb / June 5 2016 Dockerfile FROM node:4.2.3 ADD . /code WORKDIR /code RUN npm i CMD node app.js EXPOSE 5000 49
  • 50. HolyJS / SPb / June 5 2016 Dockerfile + pm2 FROM node:4.2.3 ADD . /code WORKDIR /code RUN npm i && npm i -g pm2 CMD pm2 startOrRestart ecosystem.json --env docker --no-daemon EXPOSE 5000 50
  • 51. HolyJS / SPb / June 5 2016 Что мы получаем от Docker - Удобная поставка приложения: - запуск приложения одной командой; - возможность запуска множества копий приложения; - экономия времени системных администраторов; - Инкапсуляция зависимостей: - все зависимости внутри - отсутствие конфликтов версионирования зависимостей - не оставляет лишних следов в хостовой системе - Docker + pm2 = стабильность при “случайных” падениях приложения 51
  • 52. HolyJS / SPb / June 5 2016 Consul Связывание микросервисов
  • 53. HolyJS / SPb / June 5 2016 Решение проблем с помощью Consul 1. Мониторинг статуса сервисов; 2. Реестр всех запущенных сервисов; 3. Поиск сервисов; 4. Доставка конфигов “налету”; 53
  • 54. HolyJS / SPb / June 5 2016 Consul Consul localhost:8300 - server rpc localhost:8301 - serf lan localhost:8302 - serf wan localhost:8400 - cli rpc localhost:8500 - http api localhost:8600 - dns 54
  • 55. HolyJS / SPb / June 5 2016 Consul Consul Consul Consul 55
  • 56. HolyJS / SPb / June 5 2016 Consul : Key-Value Consul Consul Consuln1:v1 56
  • 57. HolyJS / SPb / June 5 2016 Consul : Key-Value Consul Consul Consuln1:v1 n1:v1 n1:v1 57
  • 58. HolyJS / SPb / June 5 2016 Consul : Service Discovery app DB database: ‘localhost:3306’ host 58
  • 59. HolyJS / SPb / June 5 2016 Consul : Service Discovery app DB database: ‘host2:3306’ host1 host2 59
  • 60. HolyJS / SPb / June 5 2016 Consul : Service Discovery app DB database: ‘???:3306’ host1 virtual host 60
  • 61. HolyJS / SPb / June 5 2016 Consul : Service Discovery api api: ‘???:???’ hostX/Docker hostY/Docker worker 61
  • 62. HolyJS / SPb / June 5 2016 Consul : Service Discovery app DB database: ‘db.service.sd:3306’ host1 virtual host 62
  • 63. HolyJS / SPb / June 5 2016 Consul : Service Discovery api curl http://sd/service/api { host: ‘api.service.sd’, port: ‘8888’ }hostX/Docker hostY/Docker worker 63
  • 64. HolyJS / SPb / June 5 2016 Установка Consul 1. Установить на каждый сервер 64
  • 65. HolyJS / SPb / June 5 2016 Установка Consul 1. Установить на каждый сервер 2. Использовать Docker! 65
  • 66. HolyJS / SPb / June 5 2016 Установка Consul 1. Установить на каждый сервер 2. Использовать Docker! $ docker run --name consul -h $HOSTNAME -p 10.0.1.1:8300:8300 -p 10.0.1.1:8301:8301 -p 10.0.1.1:8301:8301/udp -p 10.0.1.1:8302:8302 -p 10.0.1.1:8302:8302/udp -p 10.0.1.1:8400:8400 -p 10.0.1.1:8500:8500 -p 172.17.42.1:53:53/udp -d -v /mnt:/data progrium/consul -server -advertise 10.0.1.1 -join 10.0.1.2 66
  • 67. HolyJS / SPb / June 5 2016 $ pm2 install pm2-consul Добавляем поддержку Consul для pm2 67
  • 68. HolyJS / SPb / June 5 2016 $ pm2 install pm2-consul Добавляем поддержку Consul для pm2 68
  • 69. HolyJS / SPb / June 5 2016 Добавляем поддержку Consul для pm2 69
  • 70. HolyJS / SPb / June 5 2016 $ docker pull gliderlabs/registrator:latest $ docker run -d --name=registrator --net=host --volume=/var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator:latest consul://localhost:8500 Добавляем поддержку Consul в Docker 70
  • 71. HolyJS / SPb / June 5 2016 - Dnsmasq 53->8600 - docker run … -dns $HOSTNAME Добавляем поддержку Consul в Docker 71
  • 72. HolyJS / SPb / June 5 2016 Что мы получаем от Consul? - Распределенное key-value хранилище - Service Discovery - Monitoring - Полное понимание статуса сервисов - Доступность сервисов - Легкое управление конфигами и быстрая доставка конфигов сервисам 72
  • 73. HolyJS / SPb / June 5 2016 app api DB worker 2 worker front external app Consul 73
  • 74. HolyJS / SPb / June 5 2016 Спасибо! 74
  • 75. HolyJS / SPb / June 5 2016 Ссылки и контакты Stanislav Gumeniuk https://gumeniuk.com/ mailto: i@vigo.su @vigo5190 https://hub.docker.com/r/progrium/consul/ https://www.npmjs.com/package/pm2-consul 75