До января этого года я работал в Нетологии, потому что уверен — хорошие программисты начинаются с обучения. Сейчас многие обучают новичков до состояния «могу пойти работать», но что делать дальше говорят очень немногие. Поэтому, в качестве эксперимента, я запускаю вебинары для уже практикующих специалистов.
Никаких Hello-MVC примеров, реальные задачи, реальные решения. Я не буду рассказывать о синтаксисе языков, о базовых правилах создания программ, за этим можно почитать книжки из списка маст-ридов. На вебинарах я буду делиться взглядом на разработку качественных приложений, опытом создания разных сервисов (и факапами тоже, кстати).
Никаких Hello-MVC примеров, реальные задачи, реальные решения. Я не буду рассказывать о синтаксисе языков, о базовых правилах создания программ, за этим можно почитать книжки из списка маст-ридов. На вебинарах я буду делиться взглядом на разработку качественных приложений, опытом создания разных сервисов (и факапами тоже, кстати).
Книга, которая сильнее других сказалась на моем профессиональном росте — Domain-Driven Design. #ddd перевернуло мой взгляд на разработку программ, на ценности которые они несут.
Я хочу, чтобы больше программистов следовало этой методологии, поэтому первый вебинар — «DDD в Node.js».
Три часа будем вместе делать небольшой сервис на Node.js, отвечу на вопросы. Всех участников добавлю в специальный чат, где можно будет продолжить обсуждение.
Вебинар пройдёт 18 апреля 2020 в 14.00 МСК.
До 4 апреля его можно купить за 1200 рублей, потом — за 1500.
Я хочу, чтобы больше программистов следовало этой методологии, поэтому первый вебинар — «DDD в Node.js».
Три часа будем вместе делать небольшой сервис на Node.js, отвечу на вопросы. Всех участников добавлю в специальный чат, где можно будет продолжить обсуждение.
Вебинар пройдёт 18 апреля 2020 в 14.00 МСК.
До 4 апреля его можно купить за 1200 рублей, потом — за 1500.
kamyshev.code pinned «Книга, которая сильнее других сказалась на моем профессиональном росте — Domain-Driven Design. #ddd перевернуло мой взгляд на разработку программ, на ценности которые они несут. Я хочу, чтобы больше программистов следовало этой методологии, поэтому первый…»
Тестирование
Юнит-тестов нужно много, они должны иметь техническую, а не бизнесовую направленность. Для каждого сервиса нужно писать тесты его поведения, их нужно меньше, они должны быть ориентированными на бизнес-требования. E2e тесты очень важны, но они сложные и дорогие.
Для не-сквозных тестов нужно как-то заменять реальные вызовы других компонентов системы — можно делать имитацию работы (моки), а можно просто возвращать одно и тоже значение (стабы). Есть и другие разновидности заглушек. Крутое решения для генерации таких тестовых дублеров — Mountebank.
#микросервисы
Юнит-тестов нужно много, они должны иметь техническую, а не бизнесовую направленность. Для каждого сервиса нужно писать тесты его поведения, их нужно меньше, они должны быть ориентированными на бизнес-требования. E2e тесты очень важны, но они сложные и дорогие.
Для не-сквозных тестов нужно как-то заменять реальные вызовы других компонентов системы — можно делать имитацию работы (моки), а можно просто возвращать одно и тоже значение (стабы). Есть и другие разновидности заглушек. Крутое решения для генерации таких тестовых дублеров — Mountebank.
#микросервисы
Тестирование
Сквозные (e2e) тесты хороши. Их нужно запускать на самом последнем этапе CI, потому что они медленные и не дают понимания, что именно сломалось. Иногда их можно заменит на CDC (контракты определяемые потребителем сервиса).
Юнит-тесты и тесты сервисов пишут владельцы конкретного сервиса. Сквозные же тесты должны разрабатываться совместно всеми командами (чтобы избежать дублирования).
Любые тесты должны быть повторяемыми. То есть при повторных запускать показывать одинаковые результаты.
После запуска сервиса в продакшн над ним нужно провести смоук-тесты, которые проверят общую работоспособном системы.
#микросервисы
Сквозные (e2e) тесты хороши. Их нужно запускать на самом последнем этапе CI, потому что они медленные и не дают понимания, что именно сломалось. Иногда их можно заменит на CDC (контракты определяемые потребителем сервиса).
Юнит-тесты и тесты сервисов пишут владельцы конкретного сервиса. Сквозные же тесты должны разрабатываться совместно всеми командами (чтобы избежать дублирования).
Любые тесты должны быть повторяемыми. То есть при повторных запускать показывать одинаковые результаты.
После запуска сервиса в продакшн над ним нужно провести смоук-тесты, которые проверят общую работоспособном системы.
#микросервисы
Тестирование и релиз
Иногда примеряется сине-зелёное развёртывание: рядом с боевой версией сервиса поднимается ещё одна — новая. Над ней выполняется большой набор автоматизированных и ручных тестов и потом переключается трафик. Так можно убедиться в корректной работе на продакшн-стенде.
Канареечные релизы (часто путают с сине-зелёными релизами) — это способ мягко перевода пользователей на новую версию. Нужно определить набор метрик для сервиса (например, время ответа, ответы с определённым статусом или какие-нибудь бизнес-метрики). После поднимается вторая версия сервиса, на неё отправляется небольшое количество трафика. Если метрики не упали, то подаётся больше трафика. Так продолжается, пока старая версия сервиса не станет ненужной.
#микросервисы
Иногда примеряется сине-зелёное развёртывание: рядом с боевой версией сервиса поднимается ещё одна — новая. Над ней выполняется большой набор автоматизированных и ручных тестов и потом переключается трафик. Так можно убедиться в корректной работе на продакшн-стенде.
Канареечные релизы (часто путают с сине-зелёными релизами) — это способ мягко перевода пользователей на новую версию. Нужно определить набор метрик для сервиса (например, время ответа, ответы с определённым статусом или какие-нибудь бизнес-метрики). После поднимается вторая версия сервиса, на неё отправляется небольшое количество трафика. Если метрики не упали, то подаётся больше трафика. Так продолжается, пока старая версия сервиса не станет ненужной.
#микросервисы
Напоминаю, что 18 апреля я проведу абсолютно эмейзинг вебинар «DDD в Node.js». Никаких Hello-MVC примеров, реальные задачи, реальные решения. Мы вместе напишем небольшой сервис на Node.js, обсудим преимущества подхода, я отвечу на все вопросы.
Сейчас вебинар стоит 1200 рублей, после 4 апреля цена вырастет до 1500.
Сейчас вебинар стоит 1200 рублей, после 4 апреля цена вырастет до 1500.
Ой, Робокасса немножко прилегла. Если вы хотите купить вебинар, но у вас не получается из-за ошибки на странице оплаты, напишите мне, пожалуйста — @igorkamyshev
Что-нибудь придумаем ☺️
Что-нибудь придумаем ☺️
Мониторинг
Для микросервисной архитектуры критически важен мониторинг.
Во-первых, необходимо отслеживать состояние хостов, на которых работают сервисы. Потребление памяти, нагрузка на процессор и объём свободного места на дисках.
Во-вторых, нужно следить на сервисом. Сервисы должны сообщать о своей состоянии через логи, которые нужно собирать (например, logstash) в единое место (например, Kibana) и там анализировать.
Кроме отслеживание чисто технических параметров (время отклика, коды ответов) стоит ещё подумать о сборе бизнес-метрик. Это поможет понять, влияют ли как-то технические показатели на бизнес.
Для спокойной жизни лучше настроить алерты: если сервис стал потреблять слишком много ресурсов или просели ключевые бизнес-метрики отправлять уведомление ответственным.
Все логи должны быть привязаны к конкретному изначальному запросу через идентификатор взаимосвязности. Это нужно, чтобы можно было провести трассировку вызовов внутри разных сервисов.
#микросервисы
Для микросервисной архитектуры критически важен мониторинг.
Во-первых, необходимо отслеживать состояние хостов, на которых работают сервисы. Потребление памяти, нагрузка на процессор и объём свободного места на дисках.
Во-вторых, нужно следить на сервисом. Сервисы должны сообщать о своей состоянии через логи, которые нужно собирать (например, logstash) в единое место (например, Kibana) и там анализировать.
Кроме отслеживание чисто технических параметров (время отклика, коды ответов) стоит ещё подумать о сборе бизнес-метрик. Это поможет понять, влияют ли как-то технические показатели на бизнес.
Для спокойной жизни лучше настроить алерты: если сервис стал потреблять слишком много ресурсов или просели ключевые бизнес-метрики отправлять уведомление ответственным.
Все логи должны быть привязаны к конкретному изначальному запросу через идентификатор взаимосвязности. Это нужно, чтобы можно было провести трассировку вызовов внутри разных сервисов.
#микросервисы
Безопасность
Касательно работы с пользователями все просто. Аутентификация — процесс определения, что некто является тем, кем он заявил. Авторизация — проверка, может ли совершающий действие его совершать. Нужно обеспечить единую точку аутентификации пользователей. Но решение о разрешении или запрете действия пользователю должны принимать сервис, в которых происходит это действие.
#микросервисы
Касательно работы с пользователями все просто. Аутентификация — процесс определения, что некто является тем, кем он заявил. Авторизация — проверка, может ли совершающий действие его совершать. Нужно обеспечить единую точку аутентификации пользователей. Но решение о разрешении или запрете действия пользователю должны принимать сервис, в которых происходит это действие.
#микросервисы
Безопасность при общении сервисов
Когда речь заходит о работе сервисов с сервисами, появляются варианты:
1. Любой сервис может совершить любой вызов внутри системы. Это вполне приемлемый вариант для систем, которые не работают с каким-то супер-важными данными. Нужно учесть, что если злоумышленник попадет внутрь сети — он получит доступ до всего, чего захочет.
2. Сервисы отправляют друг другу запросы через HTTP(S) Basic Auth. Во-первых, нельзя использовать это без HTTPS, а это вынуждает заниматься управлением SSL-сертификатами. Во-вторых, это дублирующая система (клиенты то не будут приходить с Basic Auth).
3. Заведение обычных учетных записей для сервисов. Заводить и управлять аккаунтами запарно, зато удобно — везде единая система авторизации, никакого дублирования, все безопасно.
4. Клиентские сертификаты. Очень сложно, непонятно зачем нужно.
5. Проверки подлинности сообщений на основе хеш-функции (HMAC). Тело сообщения кешируется, подписывается ключом, принимающая сторона проверяет корректность подписи. Можно использовать готовые протоколы (например JWT) или реализовать свой. В некоторых случая имеет смысл применить асимметричное шифрование — подписывающий знает приватный ключ, а читающий только публичный.
6. API-ключи. Рассматриваем все сервисы, как сторонние, которые умеют выдавать API-ключи. Удобно, но нужно управлять ключами для каждого сервиса, это накладно.
#микросервисы
Когда речь заходит о работе сервисов с сервисами, появляются варианты:
1. Любой сервис может совершить любой вызов внутри системы. Это вполне приемлемый вариант для систем, которые не работают с каким-то супер-важными данными. Нужно учесть, что если злоумышленник попадет внутрь сети — он получит доступ до всего, чего захочет.
2. Сервисы отправляют друг другу запросы через HTTP(S) Basic Auth. Во-первых, нельзя использовать это без HTTPS, а это вынуждает заниматься управлением SSL-сертификатами. Во-вторых, это дублирующая система (клиенты то не будут приходить с Basic Auth).
3. Заведение обычных учетных записей для сервисов. Заводить и управлять аккаунтами запарно, зато удобно — везде единая система авторизации, никакого дублирования, все безопасно.
4. Клиентские сертификаты. Очень сложно, непонятно зачем нужно.
5. Проверки подлинности сообщений на основе хеш-функции (HMAC). Тело сообщения кешируется, подписывается ключом, принимающая сторона проверяет корректность подписи. Можно использовать готовые протоколы (например JWT) или реализовать свой. В некоторых случая имеет смысл применить асимметричное шифрование — подписывающий знает приватный ключ, а читающий только публичный.
6. API-ключи. Рассматриваем все сервисы, как сторонние, которые умеют выдавать API-ключи. Удобно, но нужно управлять ключами для каждого сервиса, это накладно.
#микросервисы
Пришло время дайджеста 🧉
+ Может, нам слегка успокоиться с JavaScript? — история о плачевном положении современного веба, многие сайты даже для простых вещей используют много кода и это можно легко исправить;
+ Как написать аккуратный код? Часть первая: зацепление — краткая памятка о зацеплении в коде, примеры на Python;
+ Стоит ли хранить Google Fonts на своём сервере? — крутой разбор механизмов работы Google Fonts;
+ Принцип подстановки Лисков — разобор одного из самых важных принципов проектирования программ;
+ Как написать аккуратный код? Часть вторая: связность — небольшая заметка про связность внутри модулей;
#дайджест
+ Может, нам слегка успокоиться с JavaScript? — история о плачевном положении современного веба, многие сайты даже для простых вещей используют много кода и это можно легко исправить;
+ Как написать аккуратный код? Часть первая: зацепление — краткая памятка о зацеплении в коде, примеры на Python;
+ Стоит ли хранить Google Fonts на своём сервере? — крутой разбор механизмов работы Google Fonts;
+ Принцип подстановки Лисков — разобор одного из самых важных принципов проектирования программ;
+ Как написать аккуратный код? Часть вторая: связность — небольшая заметка про связность внутри модулей;
#дайджест
Общие рекомендации по безопасности
Нужно шифровать всё что можно. Микросервисы можно разделять в разные сети, чтобы изолировать из друг от друга и явно разрешать общение между ними.
Приложение должно хранить как можно меньше пользовательский данных. Например, зачастую вместо IP-адреса можно сохранить только хеш от него. Это защитит от кражи данных злоумышленниками.
Чаще всего проблемы безопасности связаны с человеческим фактором. Важно разработать политики, которые будут управлять доступами внутри компании.
#микросервисы
Нужно шифровать всё что можно. Микросервисы можно разделять в разные сети, чтобы изолировать из друг от друга и явно разрешать общение между ними.
Приложение должно хранить как можно меньше пользовательский данных. Например, зачастую вместо IP-адреса можно сохранить только хеш от него. Это защитит от кражи данных злоумышленниками.
Чаще всего проблемы безопасности связаны с человеческим фактором. Важно разработать политики, которые будут управлять доступами внутри компании.
#микросервисы
Закон Конвея и проектирование систем
«Организации, проектирующие системы, неизбежно производят конструкцию, чья структура является копией структуры взаимодействия внутри самой организации»
Обычно, если каждым сервисом владеет конкретная команда, система в целом получается лучше, а её развитие происходит быстрее.
#микросервисы
«Организации, проектирующие системы, неизбежно производят конструкцию, чья структура является копией структуры взаимодействия внутри самой организации»
Обычно, если каждым сервисом владеет конкретная команда, система в целом получается лучше, а её развитие происходит быстрее.
#микросервисы
Смотрите, какое доброе дело сделали в Breadhead.
Особенно круто, что сделали всего за неделю. Кайф!
Особенно круто, что сделали всего за неделю. Кайф!
Forwarded from Хлебголова
Сделали за неделю вместе с Фондом профилактики рака
Forwarded from Хлебголова
Надежность
Сбои происходят повсюду — диски выходят из строя, сеть ненадёжна, в дата-центре могут выключить электричество. Нужно быть готовым к сбоям, потому что на большом количестве сервисов они точно произойдут.
Следует определить такие параметры системы: живучесть данных, доступность сервисов, пропускная способность и приемлемое время отклика сервисов. И разрабатывать масштабируемость системы исходя из этих параметров. Например, для системы генерации отчетов простой в пару часов ничего не значит, а для системы распознавания лиц в супермаркете будет фатальным.
При падении отдельных сервисов система в целом должна продолжать работать как можно дольше — деградировать изящно (graceful degradation).
#микросервисы
Сбои происходят повсюду — диски выходят из строя, сеть ненадёжна, в дата-центре могут выключить электричество. Нужно быть готовым к сбоям, потому что на большом количестве сервисов они точно произойдут.
Следует определить такие параметры системы: живучесть данных, доступность сервисов, пропускная способность и приемлемое время отклика сервисов. И разрабатывать масштабируемость системы исходя из этих параметров. Например, для системы генерации отчетов простой в пару часов ничего не значит, а для системы распознавания лиц в супермаркете будет фатальным.
При падении отдельных сервисов система в целом должна продолжать работать как можно дольше — деградировать изящно (graceful degradation).
#микросервисы