Вадим Мадисон "Опыт разработки через...

60
«Опыт разработки через микросервисы»

Upload: tanya-denisyuk

Post on 09-Jan-2017

178 views

Category:

Education


3 download

TRANSCRIPT

Page 1: Вадим Мадисон "Опыт разработки через микросервисы"

«Опыт разработки через микросервисы»

Page 2: Вадим Мадисон "Опыт разработки через микросервисы"

• Услуги системной интеграции, начиная от разработки технологических решений и заканчивая доставкой видео-сигнала до конечного пользователя

• Интернет-видеоплатформа для каналов МатчТВ и НТВ-ПЛЮС

• 300 000 одновременных пользователей

• > 1 000 000 уникальных посетителей в сутки

• Отдаем контента до 300 Тб/час

Page 3: Вадим Мадисон "Опыт разработки через микросервисы"

Кривая Гартнера

Появление технологии

Page 4: Вадим Мадисон "Опыт разработки через микросервисы"

Кривая Гартнера

Появление технологии

Ажиотаж (завышенные ожидания)

Page 5: Вадим Мадисон "Опыт разработки через микросервисы"

Кривая Гартнера

Появление технологии

Ажиотаж (завышенные ожидания)

Разочарование

Page 6: Вадим Мадисон "Опыт разработки через микросервисы"

Кривая Гартнера

Появление технологии

Ажиотаж (завышенные ожидания)

Разочарование

Осмысление

Page 7: Вадим Мадисон "Опыт разработки через микросервисы"

Кривая Гартнера

Появление технологии

Ажиотаж (завышенные ожидания)

Разочарование

ОсмыслениеРазвитие

Page 8: Вадим Мадисон "Опыт разработки через микросервисы"

Минусы микросервисов• Распределенные коммуникации, дополнительное API, больше точек отказа и логики их обработки

• Оверхед: сетевой, сериализация/десериализация

• Обнаружение сервисов

• Инструментарий!

Page 9: Вадим Мадисон "Опыт разработки через микросервисы"

А чем они тогда

привлекают?

Page 10: Вадим Мадисон "Опыт разработки через микросервисы"

Плюсы микросервисов• Независимая разработка

• Лучший контроль технического и технологического долга

• Скорость тестирования, доставки, запуска

• Упрощение масштабирования

Page 11: Вадим Мадисон "Опыт разработки через микросервисы"

Когда микросервисы не нужны / вредны?• Небольшой проект

• Сжатые сроки разработки

• Короткий цикл поддержки

• Отсутствие CI / CD

• Нет команды, отвечающей за инфраструктуру

• Высокие требования к эффективности

Page 12: Вадим Мадисон "Опыт разработки через микросервисы"

Когда микросервисы “must have”?• Большой проект

• Высокие нагрузки

• Долгий цикл разработки

• Длительный период жизни и поддержки

• Высокие требования к использованию оптимальных технологий

• Готовы к исследованиям, оптимизациям и новым технологиям

Page 13: Вадим Мадисон "Опыт разработки через микросервисы"

Когда размер имеет значение…

Page 14: Вадим Мадисон "Опыт разработки через микросервисы"

Сервис должен быть независимым!

Page 15: Вадим Мадисон "Опыт разработки через микросервисы"

Сервис независим если…• Возможно описать бизнес-задачу сервиса одним простым предложением

• У сервиса больше одного потребителя

• Деплой сервиса не приводит к деплою других сервисов

Page 16: Вадим Мадисон "Опыт разработки через микросервисы"

Сервис независим если…• Возможно описать бизнес-задачу сервиса одним простым предложением

• У сервиса больше одного потребителя

• Деплой сервиса не приводит к деплою других сервисов

Page 17: Вадим Мадисон "Опыт разработки через микросервисы"

Сервис независим если…• Возможно описать бизнес-задачу сервиса одним простым предложением

• У сервиса больше одного потребителя

• Деплой сервиса не приводит к деплою других сервисов

Page 18: Вадим Мадисон "Опыт разработки через микросервисы"

Общие рекомендации

Page 19: Вадим Мадисон "Опыт разработки через микросервисы"

Общие рекомендации• Не использовать фреймворки

• Собирать проект из шаблона

• Не бояться “copy-paste”

• Обратить внимание на манифест “12-факторное приложение”

Page 20: Вадим Мадисон "Опыт разработки через микросервисы"

Общие рекомендации• Не использовать фреймворки

• Собирать проект из шаблона

• Не бояться “copy-paste”

• Обратить внимание на манифест “12-факторное приложение”

Page 21: Вадим Мадисон "Опыт разработки через микросервисы"

Общие рекомендации• Не использовать фреймворки

• Собирать проект из шаблона

• Не бояться “copy-paste”

• Обратить внимание на манифест “12-факторное приложение”

Page 22: Вадим Мадисон "Опыт разработки через микросервисы"

Общие рекомендации• Не использовать фреймворки

• Собирать проект из шаблона

• Не бояться “copy-paste”

• Обратить внимание на манифест “12-факторное приложение”

https://12factor.net/ru/

Page 23: Вадим Мадисон "Опыт разработки через микросервисы"

Конфигурация

Page 24: Вадим Мадисон "Опыт разработки через микросервисы"

КонфигурацияЧто пробовали?

• файлы конфигурации при деплое разливать по всем целевым машинам

• файлы конфигурации класть в контейнер

• выставлять переменные окружения

• при сборке контейнера (ENV DB=…)

• при запуске контейнера

Page 25: Вадим Мадисон "Опыт разработки через микросервисы"

КонфигурацияЧто пробовали?

• файлы конфигурации при деплое разливать по всем целевым машинам

• файлы конфигурации класть в контейнер

• выставлять переменные окружения

• при сборке контейнера (ENV DB=…)

• при запуске контейнера

Page 26: Вадим Мадисон "Опыт разработки через микросервисы"

КонфигурацияЧто пробовали?

• файлы конфигурации при деплое разливать по всем целевым машинам

• файлы конфигурации класть в контейнер

• выставлять переменные окружения

• при сборке контейнера (ENV DB=…)

• при запуске контейнера

Page 27: Вадим Мадисон "Опыт разработки через микросервисы"

Конфигурация! Единая точка конфигурирования

" Но не единая точка отказа!

! Проверенные решения…

Page 28: Вадим Мадисон "Опыт разработки через микросервисы"

Конфигурация

https://www.consul.io/ https://coreos.com/etcd/

Page 29: Вадим Мадисон "Опыт разработки через микросервисы"

<СЕРВИС>/ (/conf/ms/recorder/)

<СЕРВИС>/<ВЕРСИЯ>/ (/conf/ms/recorder/0.12)

<СЕРВИС>/<СРЕДА>/ (dev, stage, production)

Кофигурация к KV

Page 30: Вадим Мадисон "Опыт разработки через микросервисы"

<СЕРВИС>/ (/conf/ms/recorder/)

<СЕРВИС>/<ВЕРСИЯ>/ (/conf/ms/recorder/0.12)

<СЕРВИС>/<СРЕДА>/ (dev, stage, production)

/conf/ms/recorder/production/db : "recorder"

/conf/ms/recorder/production/server : "10.0.102.2"

Кофигурация к KV

Page 31: Вадим Мадисон "Опыт разработки через микросервисы"

<СЕРВИС>/ (/conf/ms/recorder/)

<СЕРВИС>/<ВЕРСИЯ>/ (/conf/ms/recorder/0.12)

<СЕРВИС>/<СРЕДА>/ (dev, stage, production)

/conf/ms/recorder/0.12/production/db : "recorder"

/conf/ms/recorder/0.12/production/server : "10.0.0.12"

Кофигурация к KV

Page 32: Вадим Мадисон "Опыт разработки через микросервисы"

Конфигурация1. git2consul

• не используем отдельные проекты/бранчи в git для основных параметров

• загружаем конфигурацию при деплое

• стартовый путь: /conf/ms/<ИМЯ СЕРВИСА>/<BUILD NO>/

2. Vaultвсе секретное храним в отдельных проектах

Page 33: Вадим Мадисон "Опыт разработки через микросервисы"

Журналирование• Единый формат логов, сведение в общее хранилище

Page 34: Вадим Мадисон "Опыт разработки через микросервисы"

Журналирование

Page 35: Вадим Мадисон "Опыт разработки через микросервисы"

Health-check! HTTP / HTTPS

! 2 основных метода/ready/health

! 1 опциональный/info

Page 36: Вадим Мадисон "Опыт разработки через микросервисы"

Health-check

Page 37: Вадим Мадисон "Опыт разработки через микросервисы"

Тестирование

Page 38: Вадим Мадисон "Опыт разработки через микросервисы"

В чем сложность?• Корректность взаимодействия с другими сервисами

• Сервис назначения доступен, но:

• Отвечает очень медленно

• Отвечает эпизодически

• Отвечает некорректно

Page 39: Вадим Мадисон "Опыт разработки через микросервисы"

В чем сложность?• Корректность взаимодействия с другими сервисами

• Сервис назначения доступен, но:

• Отвечает очень медленно

• Отвечает эпизодически

• Отвечает некорректно

Page 40: Вадим Мадисон "Опыт разработки через микросервисы"

В чем сложность?• Корректность взаимодействия с другими сервисами

• Сервис назначения доступен, но:

• Отвечает очень медленно

• Отвечает эпизодически

• Отвечает некорректно

Circuit Breaker![Hystrix, Netflix]

Page 41: Вадим Мадисон "Опыт разработки через микросервисы"

В чем сложность?• Корректность взаимодействия с другими сервисами

• Сервис назначения доступен, но:

• Отвечает очень медленно

• Отвечает эпизодически

• Отвечает некорректно

Circuit Breaker![Hystrix, Netflix]

Page 42: Вадим Мадисон "Опыт разработки через микросервисы"

Тестовыйкластер

Raspberry Pi 3 - 6шт

Page 43: Вадим Мадисон "Опыт разработки через микросервисы"

Хранение

Page 44: Вадим Мадисон "Опыт разработки через микросервисы"

Что пробовали?• Проброс файловой системы в контейнер

Page 45: Вадим Мадисон "Опыт разработки через микросервисы"

Что пробовали?• Проброс файловой системы в контейнер

• «Собирающие контейнеры»

Page 46: Вадим Мадисон "Опыт разработки через микросервисы"

Что пробовали?• Проброс файловой системы в контейнер

• «Собирающие контейнеры»

• Shared data volume

Page 47: Вадим Мадисон "Опыт разработки через микросервисы"

Что пробовали?• Проброс файловой системы в контейнер

• «Собирающие контейнеры»

• Shared data volume

• Flocker

Page 48: Вадим Мадисон "Опыт разработки через микросервисы"

Для файлового храненияРаспределенная файловая система: CEPH (http://ceph.com/)

Page 49: Вадим Мадисон "Опыт разработки через микросервисы"

Для БД• Выделенные сервера

• Особая конфигурация машин

• Расширенная сеть

Page 50: Вадим Мадисон "Опыт разработки через микросервисы"

Оркестрация

Page 51: Вадим Мадисон "Опыт разработки через микросервисы"

Оркестрация

Page 52: Вадим Мадисон "Опыт разработки через микросервисы"

Оркестрация

Page 53: Вадим Мадисон "Опыт разработки через микросервисы"

Оркестрация

Page 54: Вадим Мадисон "Опыт разработки через микросервисы"

Consul Template{{range services}}{{ if in .Tags "demo" }}{{if .Tags | join "," | regexMatch "urlprefix-"}}upstream {{.Name}} {

least_conn;{{range service .Name}}server {{.Address}}:{{.Port}} max_fails=3 fail_timeout=30 weight=1;{{end}}

}{{end}}{{end}}{{end}}

server {listen 80 default_server;

location /health {add_header Content-Type text/plain;return 200 'OK';

}

{{range services}}{{ if in .Tags "demo" }}{{if .Tags | join "," | regexMatch "urlprefix-"}}{{range .Tags}}{{ if . | contains "urlprefix-" }}location {{. | replaceAll "urlprefix-" ""}} { {{end}}{{end}}

proxy_pass http://{{.Name}}/; # / в конце означает обрезку проксируемого путиproxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;

}{{end}}{{end}}{{end}}

}

Page 55: Вадим Мадисон "Опыт разработки через микросервисы"

Consul Template{{range services}}

{{ if in .Tags "demo" }}{{if .Tags | join "," | regexMatch “urlprefix-“}} #urlprefix-/playlist

upstream {{.Name}} {least_conn;

{{range service .Name}}server {{.Address}}:{{.Port}} max_fails=3 fail_timeout=30 weight=1;{{end}}

}{{end}}

{{end}}{{end}}

в списке только прошедшие

health-check!

Page 56: Вадим Мадисон "Опыт разработки через микросервисы"

Consul Template{{range services}}

{{ if in .Tags "demo" }}{{if .Tags | join "," | regexMatch "urlprefix-"}}

{{range .Tags}}{{ if . | contains "urlprefix-" }}# Tag: urlprefix-/playlistlocation {{. | replaceAll "urlprefix-" ""}} { {{end}}{{end}}proxy_pass http://{{.Name}}/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;

}{{end}}{{end}}{{end}}

Page 57: Вадим Мадисон "Опыт разработки через микросервисы"

Consul Templateupstream playlistapi {

least_conn;server 10.1.1.2:5100 max_fails=3 fail_timeout=30 weight=1;

}

...

location /playlist { proxy_pass http://playlistapi/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;

}

Page 58: Вадим Мадисон "Опыт разработки через микросервисы"

http://bit.ly/1TE1KdMИсходные коды примера

Page 59: Вадим Мадисон "Опыт разработки через микросервисы"

Чек-листКак конфигурировать?

Как мониторить и считать метрики?

Как сервисы будут находить друг друга?

Как сервис будет взаимодействовать с остальными частями проекта?

Как тестировать сервис и систему целиком?

Как обрабатывать сбои связанных сервисов?

Как переезжать на новую версию?

Как масштабировать под нагрузкой?

Page 60: Вадим Мадисон "Опыт разработки через микросервисы"

Спасибо!Вадим Мадисон

М-Тех

[email protected]

[email protected]