По мере того как организации переходят от монолитных приложений к небольшим автономным микросервисам, распределенные системы становятся все более детализированными. Второе дополненное издание предлагает целостный взгляд на самые актуальные темы, в которых необходимо разбираться при создании и масштабировании архитектуры микросервисов, а также управлении ею.
Вы познакомитесь с современными решениями для моделирования, интеграции, тестирования, развертывания и мониторинга собственных автономных сервисов. Примеры из реальной жизни показывают, как получить максимальную отдачу от этих архитектур. Книга будет полезна всем — от архитекторов и разработчиков до тестировщиков и специалистов по эксплуатации.
Author(s): Сэм Ньюмен
Series: Бестселлеры O’Reilly
Edition: 1
Publisher: Питер
Year: 2023
Language: Russian
Commentary: Publisher's PDF
Pages: 624
City: СПб.
Tags: Monitoring; Logging; Microservices; Scalability; Deployment; GraphQL; Best Practices; User Interface; Software Architecture; Team Management; Organizational Behavior; Resilience; Monolithic Architecture; Evolutionary Architecture; Architecture Patterns; REST API; Workflows; Distributed Tracing; Observability; Robustness; Chaos Engineering; ACID; Testing
Предисловие
Кому стоит прочитать эту книгу
Почему я написал эту книгу
Что изменилось с момента выхода первого издания
Навигация по книге
Часть I. Основы
Часть II. Реализация
Часть III. Люди
Условные обозначения
Благодарности
От издательства
Часть I. Основы
Глава 1. Что такое микросервисы
Первый взгляд на микросервисы
Ключевые понятия микросервисов
Независимое развертывание
Моделирование вокруг предмета бизнеса
Контроль над ситуацией
Размер
Гибкость
Согласование архитектуры и организации
Монолит
Монолит единственного процесса
Модульный монолит
Распределенный монолит
Монолиты и конфликт доставки
Преимущества монолитов
Технологии, обеспечивающие развитие
Агрегирование логов и распределенная трассировка
Контейнеры и Kubernetes
Потоковая передача данных
Общедоступное облако и бессерверный подход
Преимущества микросервисов
Технологическая неоднородность
Надежность
Масштабирование
Простота развертывания
Организационная согласованность
Компонуемость
Болевые точки микросервиса
Опыт разработчика
Технологическая перегрузка
Стоимость
Отчетность
Мониторинг и устранение неполадок
Безопасность
Тестирование
Время ожидания
Согласованность данных
Стоит ли мне использовать микросервисы?
Кому микросервисы не подойдут
Где микросервисы хорошо работают
Резюме
Глава 2. Как моделировать микросервисы
Представляем MusicCorp
Что делает границу микросервиса качественной?
Скрытие информации
Согласованность
Связанность
Взаимодействие связанности и согласованности
Типы связанности
Предметная связанность
Сквозная связанность
Общая связанность
Связанность по содержимому
Немного предметно-ориентированного проектирования
Единый язык
Совокупность
Ограниченный контекст
Сопоставление совокупностей и ограниченных контекстов с микросервисами
Метод Event storming
Аргументы в пользу предметно-ориентированного проектирования микросервисов
Альтернативы границам предметной области бизнеса
Волатильность
Данные
Технологии
Организационный подход
Смешивание моделей и исключений
Резюме
Глава 3. Разделение монолита на части
Осознайте цель
Постепенный переход
Монолит редко бывает врагом
Опасность преждевременной декомпозиции
Что отделить в первую очередь
Декомпозиция по слоям
Сначала код
Сначала данные
Полезные шаблоны декомпозиции
Параллельное выполнение
Шаблон переключаемых функций
Проблемы декомпозиции данных
Производительность
Целостность данных
Транзакции
Инструментарий
База данных отчетов
Резюме
Глава 4. Стили взаимодействия микросервисов
От внутрипроцессного к межпроцессному
Производительность
Изменение интерфейсов
Обработка ошибок
Технология межпроцессного взаимодействия: так много вариантов выбора
Стили взаимодействия микросервисов
Смешивание и сочетание
Шаблон: синхронная блокировка
Преимущества
Недостатки
Где использовать
Шаблон: асинхронная неблокирующая связь
Преимущества
Недостатки
Где использовать
Шаблон: связь через общие данные
Реализация
Преимущества
Недостатки
Где использовать
Шаблон: связь «запрос-ответ»
Реализация: синхронная или асинхронная
Где использовать
Шаблон: событийное взаимодействие
Реализация
Что входит в событие
Где использовать
Действуйте с осторожностью
Резюме
Часть II. Реализация
Глава 5. Реализация коммуникации микросервисов
В поисках идеальной технологии
Упростите обратную совместимость
Сделайте свой интерфейс явным
Следите за тем, чтобы ваши API не зависели от технологий
Сделайте свой сервис простым для потребителей
Скройте детали внутренней реализации
Выбор технологий
Удаленные вызовы процедур
REST
GraphQL
Брокеры сообщений
Форматы сериализации
Текстовые форматы
Двоичные форматы
Схемы
Структурные и семантические разрывы контрактов
Стоит ли использовать схемы?
Обработка изменений между микросервисами
Избегание критических изменений
Наращивание изменений
Терпимое считывание
Правильные технологии
Явный интерфейс
Своевременно выявляйте случайные критические изменения
Управление критическими изменениями
Поэтапное развертывание
Сосуществование несовместимых версий микросервиса
Эмулируйте старый интерфейс
Какой подход предпочтителен?
Общественный договор
Отслеживание использования
Крайние меры
DRY и опасности повторного использования кода в мире микросервисов
Совместное использование кода через библиотеки
Обнаружение сервиса
Система доменных имен (DNS)
Динамические реестры сервисов
Не забывайте о людях!
Сервисные сети и API-шлюзы
API-шлюзы
Сервисные сети
А как насчет других протоколов?
Документирование сервисов
Явные схемы
Самоописывающаяся система
Резюме
Глава 6. Рабочий поток
Транзакции базы данных
Транзакции ACID
Все еще ACID, но с недостаточной атомарностью?
Распределенные транзакции — двухфазная фиксация
Просто скажите «нет» распределенным транзакциям
Саги
Режимы сбоя саги
Реализация саг
Саги против распределенных транзакций
Резюме
Глава 7. Сборка
Краткое введение в непрерывную интеграцию
Вы действительно занимаетесь CI?
Ветвящиеся модели
Построение конвейеров и непрерывная доставка
Инструментарий
Компромиссы и среды
Создание артефакта
Сопоставление исходного кода и сборок с микросервисами
Один гигантский репозиторий, одна гигантская сборка
Шаблон: один репозиторий на один микросервис (то есть мультирепозиторий)
Шаблон: монорепозиторий
Какой подход я бы использовал?
Резюме
Глава 8. Развертывание
От логического к физическому
Несколько экземпляров
База данных
Среды
Принципы развертывания микросервисов
Изолированное выполнение
Сосредоточьтесь на автоматизации
Инфраструктура как код
Управление желаемым состоянием
Варианты развертывания
Физическая машина
Виртуальные машины
Контейнеры
Контейнеры приложений
Платформа как услуга (PaaS)
Функция как сервис (FaaS)
Какой вариант развертывания подходит именно вам?
Kubernetes и оркестровка контейнеров
Пример для контейнерной оркестровки
Упрощенный взгляд на концепции Kubernetes
Мультитенантность и федерация
Федерация нативных облачных вычислений
Платформы и мобильность
Helm, Operator и CRD
Knative
Будущее
Стоит ли вам это использовать?
Прогрессивная доставка
Разница между развертыванием и релизом
Переходим к прогрессивной доставке
Переключатели функций
Канареечный релиз
Параллельное выполнение
Резюме
Глава 9. Тестирование
Типы тестов
Охват тестирования
Модульное тестирование
Сервисные тесты
Сквозное тестирование
Компромиссы
Внедрение сервисных тестов
Макетирование или заглушки
Более самостоятельная сервис-заглушка
Внедрение (этих хитрых) сквозных тестов
Уязвимые и flaky-тесты
Кто пишет эти сквозные тесты?
Как долго должны выполняться сквозные тесты?
Великое нагромождение
Метаверсия
Отсутствие возможности независимого тестирования
Следует ли избегать сквозных тестов?
Контрактное тестирование
Заключительное слово
Опыт разработчика
От предварительного тестирования к эксплуатационному
Виды эксплуатационных тестов
Среднее время восстановления превышает среднее время между отказами?
Кросс-функциональное тестирование
Тесты производительности
Тесты надежности
Резюме
Глава 10. От мониторинга
к наблюдаемости
Сбой, паника и замешательство
Один микросервис, один сервер
Один микросервис, несколько серверов
Несколько микросервисов, несколько серверов
Наблюдаемость и мониторинг
Столпы наблюдаемости? Не так быстро
Строительные блоки для наблюдаемости
Агрегация логов
Агрегация метрики
Распределенная трассировка
Все ли у нас в порядке?
Оповещение
Семантический мониторинг
Тестирование в эксплуатации
Стандартизация
Выбор инструментов
Демократичность
Простота интеграции
Обеспечение контекста
Своевременность
Подходит для вашего масштаба
Эксперт в машине
Приступая к работе
Резюме
Глава 11. Безопасность
Основные принципы
Принцип наименьших привилегий
Глубокая оборона
Автоматизация
Встраивание безопасности в процесс доставки
Пять функций кибербезопасности
Выявление
Защита
Определение
Реакция
Восстановление
Основы безопасности приложений
Учетные данные
Исправление
Резервное копирование (бэкап)
Повторная сборка (ребилд)
Неявное или нулевое доверие
Неявное доверие
Нулевое доверие
Защита данных
Данные в процессе передачи
Данные в состоянии покоя
Аутентификация и авторизация
Аутентификация между сервисами
Аутентификация человека
Распространенные реализации единого входа
SSO-шлюз
Детализированная авторизация
Проблема иерархии полномочий
Централизованная, восходящая авторизация
Детализация авторизации
Веб-токены JSON
Резюме
Глава 12. Отказоустойчивость
Что такое отказоустойчивость
Надежность
Восстановление
Изящная расширяемость
Устойчивая адаптивность
И микросервисная архитектура
Неудачи повсюду
Слишком много — это сколько?
Снижение функциональности
Шаблоны стабильности
Тайм-ауты
Повторные попытки
Переборки
Автоматические выключатели
Изоляция
Резервирование
Промежуточное ПО
Идемпотентность
Распределение рисков
CAP-теорема
Жертвуя согласованностью
Жертвуя доступностью
Жертвуя устойчивостью к разделению
AP или CP?
Это не «все или ничего»
А теперь реальный мир
Хаос-инжиниринг
Игровые дни
Эксперименты в эксплуатационной среде
От надежности к запредельному
Поиск виновных
Резюме
Глава 13. Масштабирование
Четыре оси масштабирования
Горизонтальное дублирование
Разделение данных
Функциональная декомпозиция
Сочетание моделей
Начните с малого
Кэширование
Для производительности
Для масштабирования
Для надежности
Где кэшировать
Аннулирование
Свежесть в сравнении с оптимизацией
Отравление кэша: поучительная история
Автоматическое масштабирование
Начинаем все сначала
Резюме
Часть III. Люди
Глава 14. Пользовательские
интерфейсы
К цифровым технологиям
Модели владения
Драйверы для специализированных фронтенд-команд
На пути к потоковым командам
Обмен специалистами
Обеспечение согласованности
Решение технических проблем
Шаблон: монолитный интерфейс
Когда использовать
Шаблон: микроинтерфейсы
Реализация
Когда использовать
Шаблон: декомпозиция на основе страниц
Где использовать
Шаблон: декомпозиция на основе виджетов
Реализация
Когда использовать
Ограничения
Шаблон: центральный объединяющий шлюз
Владение
Различные типы пользовательских интерфейсов
Многочисленные проблемы
Когда использовать
Шаблон: бэкенд для фронтенда (BFF)
Сколько должно быть BFF?
Повторное использование и BFF
BFF для настольных веб-сайтов и за их пределами
Когда использовать
GraphQL
Гибридный подход
Резюме
Глава 15. Организационные
структуры
Слабо связанные организации
Закон Конвея
Подтверждение
Размер команды
Понимание закона Конвея
Маленькие команды, большая организация
Об автономии
Сильное или коллективное владение
Сильное владение
Коллективное владение
Уровень команд или уровень организации
Балансирующие модели
Команды поддержки
Профессиональные сообщества
Платформа
Общие микросервисы
Слишком трудно разделить
Сквозные изменения
Узкие места в доставке
Внутренний открытый исходный код
Роль основных коммиттеров
Зрелость
Инструментарий
Подключаемые модульные микросервисы
Обзоры изменений
Осиротевший сервис
Тематическое исследование: realestate.com.au
Географическое распределение
Закон Конвея наоборот
Люди
Резюме
Глава 16. Эволюционная архитектура
Что в имени твоем?
Что такое архитектура ПО
Делая изменения возможными
Эволюционное видение для архитектора
Определение границ системы
Социальная конструкция
Обитаемость
Принципиальный подход
Стратегические цели
Принципы
Методы
Сочетание принципов и методов
Пример из жизни
Руководство эволюционной архитектурой
Архитектура в потоковой организации
Создание команды
Требуемый стандарт
Мониторинг
Интерфейсы
Архитектурная безопасность
Управление и мощеная дорога
Образцы
Адаптированный шаблон микросервиса
Мощеная дорога при масштабировании
Технический долг
Обработка исключений
Резюме
Послесловие: соберем все вместе
Что такое микросервисы
Переход к микросервисам
Стили коммуникации
Рабочий поток
Сборка
Развертывание
Тестирование
Мониторинг и наблюдаемость
Безопасность
Отказоустойчивость
Масштабирование
Пользовательские интерфейсы
Организация
Архитектура
Дополнительная литература
Взгляд в будущее
Заключительные слова
Библиография
Глоссарий
Об авторе
Иллюстрация на обложке