HolyJS / SPb / June 5 2016
Инфраструктура распределенных приложений на Node.js
Stanislav Gumeniuk,
SEMrush
Node.js - - PowerPoint PPT Presentation
Node.js Stanislav Gumeniuk, SEMrush HolyJS / SPb / June 5 2016 1.
HolyJS / SPb / June 5 2016
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
Что мы хотим?
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
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
Инфраструктура с гипервизором
logs
19
HolyJS / SPb / June 5 2016
pm2:
20
HolyJS / SPb / June 5 2016
от монолита к микросервисам
HolyJS / SPb / June 5 2016
От монолита к микросервисам
1. Падение монолита - падение всей системы; 2. Падение микросервиса - падение элемента системы, при сохранении рабочей системы; 3. Распределение нагрузок; 4. Проще внедрять и заменять новые элементы в систему; 5. Мониторинг состояний каждого элемента системы.
22
HolyJS / SPb / June 5 2016
Взаимодействие с внешним миром
23
HolyJS / SPb / June 5 2016
Взаимодействие с внешним миром
24
HolyJS / SPb / June 5 2016
Взаимодействие с внешним миром
front
25
HolyJS / SPb / June 5 2016
Взаимодействие с внешним миром
front
26
HolyJS / SPb / June 5 2016
Взаимодействие с внешним миром
front
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
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
51
HolyJS / SPb / June 5 2016
Связывание микросервисов
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 Consul n1:v1
56
HolyJS / SPb / June 5 2016
Consul : Key-Value
Consul Consul Consul n1: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 \
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 \
gliderlabs/registrator:latest \ consul://localhost:8500
Добавляем поддержку Consul в Docker
70
HolyJS / SPb / June 5 2016
Добавляем поддержку Consul в Docker
71
HolyJS / SPb / June 5 2016
Что мы получаем от Consul?
быстрая доставка конфигов сервисам
72
HolyJS / SPb / June 5 2016
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