Как на Node.js пройти путь от примитивного приложения «Hello world» до распределённого решения, состоящего из микросервисов?
Мы пройдём жизненный цикл продукта, начав с простого приложения на Node.js. Научимся его правильно запускать и будем постепенно добавлять элементы, убирая при этом ненужные. Так, к нашему приложению присоединится гипервизор, а само оно будет разделено на части, где каждая сущность будет управлять своей частью приложения.
Построив, таким образом, архитектуру на чистом Node.js, мы займёмся развитием приложения, добавим современные технологии и применим новые подходы к организации инфраструктуры. В частности, научимся доставлять окружение и приложения при помощи Ansible, запакуем приложение в Docker, попутно обсудим, зачем он нужен и что может дать при разработке фронтенда. И, наконец, решим проблему поиска запущенных сервисов и отслеживания их статусов, используя Consul.
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
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
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