
Фундаментальная книга о разработке и реализации API (программных интерфейсов приложений). Разобраны базовые вопросы обмена информацией в микросервисной архитектуре, обработка запросов на сайтах и в веб-приложениях (парадигма REST). Показано, как поступательно развивать имеющиеся API, не переписывая их, а также как создать API любой сложности с нуля с учётом возможностей и ограничений конкретной системы. Книга поможет реализовать на предприятии архитектуру сервисной сети и подготовить ресурсы компании к миграции в облако.
Для архитекторов программного обеспечения
Сегодня такое внимание уделяется контейнерам и микросервисам, что зачастую забываются фундаментальные вопросы, касающиеся базовой коммуникации сервисов. Данная книга заполняет именно этот пробел и подробно рассказывает, как правильно структурировать и развивать ваши API.
Сэм Ньюмен, автор книги «От монолита к микросервисам»
Книга отлично написана, полна советов, подсказок и практических примеров
Стефания Чаплин, GitLab&DevStefOps
Как правильно проектировать, развивать и эксплуатировать API
В этой прикладной книге изложены стратегии создания REST API, рассказано, как на уровне шлюзов API сочетать самые разные функции, компонуя их в виде микросервисов. Авторы книги описывают, как небольшая корректировка инфраструктуры помогает перевести весь сайт или ресурс в облако и заново связать внутренние сервисы при помощи таких инновационных технологий как сервисная сеть.
• Изучите основы работы с API и архитектурные паттерны, позволяющие собрать API и платформу с нуля
• На практических примерах разберите, как проектировать, собирать и тестировать системы на основе API
• Развёртывайте, используйте, конфигурируйте ключевые компоненты API
• Пользуйтесь шлюзами API и сервисными сетями там, где они нужны
• Внедрите в компании ключевые практики обеспечения безопасности и научитесь находить в архитектуре API наиболее распространённые уязвимости
• Защитите данные и API при помощи моделирования угроз, задействовав такие технологии, как OAuth2 и TLS
• Научитесь развивать существующие системы, подготавливая их на уровне API к миграции в облако
Большинству организаций, имеющих сайт или сервис в Интернете, приходится осваивать работу с API – программными интерфейсами приложений. API – это дверь, через которую пользователь находит путь к работе с сервисами и приложениями компании.
Проектирование, выстраивание этих программных компонентов, а также управление ими касается всей организации, от разработчиков и администраторов до совета директоров и владельцев продукта. Но по-настоящему серьёзный вызов для разработчиков и архитекторов решений – это необходимость собирать новый API с нуля.
Книгу “Проектирование архитектуры API: Как правильно проектировать, развивать и эксплуатировать API” можно купить со скидкой в интернет-магазине издательства “БХВ“.
Вступительное слово………………………………………………………………………………. 15
Предисловие…………………………………………………………………………………………… 17
Для чего мы написали эту книгу?…………………………………………………………………………………………….. 17
Почему стоит прочитать эту книгу?………………………………………………………………………………………… 17
Для кого эта книга?……………………………………………………………………………………………………………………. 18
Разработчик…………………………………………………………………………………………………………………….. 18
Случайный архитектор………………………………………………………………………………………………….. 18
Архитектор решений, корпоративный архитектор……………………………………………………… 19
Чему вы научитесь?…………………………………………………………………………………………………………………… 19
О чем не расскажет эта книга?…………………………………………………………………………………………………. 20
Условные обозначения……………………………………………………………………………………………………………… 20
Использование примеров кода…………………………………………………………………………………………………. 21
Платформа онлайн-обучения O’Reilly……………………………………………………………………………………… 22
Как с нами связаться?………………………………………………………………………………………………………………… 22
Благодарности…………………………………………………………………………………………………………………………… 22
Благодарности Джеймса Гофа……………………………………………………………………………………… 23
Благодарности Дэниэла Брайанта……………………………………………………………………………….. 23
Благодарности Мэтью Оберна……………………………………………………………………………………… 23
Введение………………………………………………………………………………………………… 25
Путешествие по архитектуре……………………………………………………………………………………………………. 25
Что же такое API?………………………………………………………………………………………………………………………. 26
Практический пример конференц-системы: запуск………………………………………………………………… 27
Типы API в практическом примере конференции………………………………………………………… 29
Причины изменения конференц-системы……………………………………………………………………… 29
От многоуровневой архитектуры к моделированию API……………………………………………. 30
Практический пример: эволюционный этап………………………………………………………………… 30
Трафик север-юг……………………………………………………………………………………………………… 31
Трафик восток-запад……………………………………………………………………………………………… 32
API-инфраструктура и шаблоны трафика……………………………………………………………………. 32
Дорожная карта для практического примера конференции………………………………………. 32
Использование диаграмм C4…………………………………………………………………………………………………….. 33
Диаграмма контекста C4……………………………………………………………………………………………….. 33
Диаграмма контейнеров C4…………………………………………………………………………………………… 34
Диаграмма компонентов C4………………………………………………………………………………………….. 34
Использование записей архитектурных решений………………………………………………………………….. 34
ADR-запись эволюции участников……………………………………………………………………………….. 35
Осваиваем API: руководства ADR………………………………………………………………………………… 36
Заключение………………………………………………………………………………………………………………………………… 37
Часть I. Проектирование, создание и тестирование API… 39
Глава 1. Проектирование, создание и спецификация API………………………. 41
Практический пример: проектирование API Участник………………………………………………………….. 41
Знакомство с REST…………………………………………………………………………………………………………………….. 42
Знакомство с REST и HTTP на примере……………………………………………………………………….. 42
Модель зрелости Ричардсона……………………………………………………………………………………….. 43
Введение в API удаленного вызова процедур (RPC)………………………………………………………………. 44
Краткое упоминание о языке GraphQL……………………………………………………………………………………. 45
Стандарты и структура REST API…………………………………………………………………………………………… 47
Коллекции и пагинация………………………………………………………………………………………………….. 48
Фильтрация коллекций…………………………………………………………………………………………………… 49
Обработка ошибок…………………………………………………………………………………………………………. 49
Руководство ADR: выбор стандарта API……………………………………………………………………… 50
Определение REST API с помощью OpenAPI………………………………………………………………………….. 51
Практическое применение спецификаций OpenAPI……………………………………………………………….. 51
Генерация кода……………………………………………………………………………………………………………….. 52
Валидация OpenAPI……………………………………………………………………………………………………….. 52
Примеры и создание имитаций……………………………………………………………………………………… 53
Обнаружение изменений………………………………………………………………………………………………… 54
Версионирование API……………………………………………………………………………………………………………….. 54
Семантическое версионирование…………………………………………………………………………………. 55
Спецификация и версионирование OpenAPI………………………………………………………………… 55
Реализация RPC с помощью gRPC……………………………………………………………………………………………. 57
Моделирование обмена данными и выбор формата API………………………………………………………. 59
Сервисы с высоким уровнем трафика…………………………………………………………………………… 59
Большие полезные нагрузки при обмене данными……………………………………………………… 59
Преимущества производительности HTTP/2……………………………………………………………….. 60
Старые форматы…………………………………………………………………………………………………………….. 60
Рекомендация: моделирование обменов………………………………………………………………………………….. 61
Различные спецификации………………………………………………………………………………………………………….. 61
Существует ли «золотая спецификация»?……………………………………………………………………. 61
Проблемы комбинированных спецификаций………………………………………………………………. 63
Заключение………………………………………………………………………………………………………………………………… 63
Глава 2. Тестирование API…………………………………………………………………….. 65
Сценарий конференц-системы для этой главы……………………………………………………………………….. 66
Стратегии тестирования……………………………………………………………………………………………………………. 66
Тестовый квадрант…………………………………………………………………………………………………………. 67
Тестовая пирамида…………………………………………………………………………………………………………. 69
Руководство ADR по стратегиям тестирования…………………………………………………………… 71
Контрактное тестирование……………………………………………………………………………………………………….. 72
Почему часто предпочтительнее проводить контрактное тестирование?……………….. 72
Порядок реализации контракта…………………………………………………………………………………….. 73
Контракты производителя…………………………………………………………………………………….. 75
Контракты, ориентированные на потребителя…………………………………………………… 76
Наш пример: использование CDC………………………………………………………………………… 76
Обзор методологии контрактов…………………………………………………………………………….. 76
Фреймворки для контрактного тестирования……………………………………………………… 77
Хранение и публикация контрактов API……………………………………………………………… 77
Руководство ADR: контрактное тестирование…………………………………………………………….. 78
Тестирование компонентов API……………………………………………………………………………………………….. 79
Контрактное тестирование в сравнении с тестированием компонентов…………………… 80
Практический пример: тестирование компонентов для проверки поведения…………… 80
Интеграционное тестирование API………………………………………………………………………………………….. 82
Использование серверов-заглушек: почему и как?……………………………………………………… 82
Руководство ADR: интеграционное тестирование………………………………………………………. 84
Контейнеризация тестовых компонентов: Testcontainers…………………………………………… 85
Практический пример: применение Testcontainers для верификации интеграций……. 85
Сквозное тестирование……………………………………………………………………………………………………………… 87
Автоматизация сквозной валидации…………………………………………………………………………….. 87
Типы сквозных тестов…………………………………………………………………………………………………….. 88
Руководство ADR: сквозное тестирование…………………………………………………………………… 89
Заключение………………………………………………………………………………………………………………………………… 90
Часть II. Управление трафиком API………………………………………….. 91
Глава 3. API-шлюзы: управление входящим трафиком………………………….. 93
Является ли API-шлюз единственным решением?………………………………………………………………….. 93
Рекомендация: прокси, балансировщик нагрузки или API-шлюз………………………………………….. 94
Практический пример: открытие доступа к сервису Участник для потребителей……………… 95
Что такое API-шлюз?…………………………………………………………………………………………………………………. 96
Какие функциональные возможности предоставляет API-шлюз?………………………………………… 96
Где выполняется развертывание API-шлюза?………………………………………………………………………… 97
Как API-шлюз интегрируется с другими технологиями на периферии?……………………………….. 98
Зачем нужен API-шлюз?……………………………………………………………………………………………………………. 99
Снижение связанности: адаптер/фасад между фронтендами и бэкендами……………. 100
Упрощение использования: агрегирование/преобразование бэкенд-сервисов……… 101
Защита API от чрезмерного использования и злоупотреблений: обнаружение и устранение угроз 102
Понимание того, как используются API: наблюдаемость………………………………………… 104
Управление API как продуктами: менеджмент жизненного цикла API…………………… 104
Монетизация API: управление учетными записями, биллинг и оплата………………….. 106
Современная история API-шлюзов………………………………………………………………………………………… 106
1990-е годы и далее: аппаратные балансировщики нагрузки…………………………………. 107
Начало 2000-х годов и далее: программные балансировщики нагрузки……………….. 108
Середина 2000-х: контроллеры доставки приложений (ADC)…………………………………. 109
Начало 2010-х: API-шлюзы первого поколения……………………………………………………….. 109
2015 год и далее: API-шлюзы второго поколения…………………………………………………….. 111
Текущая таксономия API-шлюзов………………………………………………………………………………………….. 112
Традиционные корпоративные шлюзы………………………………………………………………………. 112
Микросервисы/микрошлюзы………………………………………………………………………………………. 113
Шлюзы сервисных сетей……………………………………………………………………………………………… 113
Сравнение типов API-шлюзов……………………………………………………………………………………… 113
Практический пример: развитие конференц-системы с помощью API-шлюза…………………… 115
Установка Ambassador Edge Stack в Kubernetes………………………………………………………… 116
Настройка сопоставления URL-путей с бэкенд-сервисами……………………………………… 116
Настройка сопоставлений с использованием маршрутизации на основе хостов….. 117
Развертывание API-шлюзов: понимание и управление отказами……………………………………….. 118
API-шлюз как единая точка отказа…………………………………………………………………………….. 118
Обнаружение и принадлежность проблем…………………………………………………………………. 119
Разрешение инцидентов и проблем…………………………………………………………………………….. 119
Снижение рисков………………………………………………………………………………………………………….. 120
Общие ошибки при внедрении API-шлюзов………………………………………………………………………….. 121
Loopback API-шлюза……………………………………………………………………………………………………. 121
Шлюз API в качестве корпоративной сервисной шины (ESB,
Enterprise Service Bus)…………………………………………………………………………………………………… 121
Черепахи (API-шлюзы) — и нет им конца………………………………………………………………….. 122
Выбор API-шлюза……………………………………………………………………………………………………………………. 122
Определение требований…………………………………………………………………………………………….. 122
Создание или покупка?………………………………………………………………………………………………… 123
Руководство ADR: выбор API-шлюза…………………………………………………………………………. 123
Заключение………………………………………………………………………………………………………………………………. 124
Глава 4. Сервисные сети: управление трафиком между сервисами………. 127
Сервисная сеть — это единственное решение?…………………………………………………………………….. 127
Рекомендация: стоит ли внедрять технологию сервисной сети?…………………………………………. 128
Практический пример: извлечение функциональности сессий в сервис…………………………….. 128
Что такое сервисная сеть?………………………………………………………………………………………………………. 130
Какие функциональные возможности предоставляет сервисная сеть?………………………………. 132
Где развертывается сервисная сеть?……………………………………………………………………………………… 133
Как сервисная сеть интегрируется с другими сетевыми технологиями?……………………………. 134
Зачем нужна сервисная сеть?…………………………………………………………………………………………………. 135
Тонкий контроль маршрутизации, надежности и управления трафиком……………….. 136
Прозрачная маршрутизация и нормализация имен сервисов………………………….. 136
Надежность…………………………………………………………………………………………………………… 137
Продвинутая маршрутизация трафика: придание формы, контроль, разделение и зеркалирование 138
Придание формы трафику…………………………………………………………………………… 138
Контроль трафика……………………………………………………………………………………….. 139
Обеспечение прозрачной наблюдаемости…………………………………………………………………. 139
Обеспечение безопасности: транспортная безопасность, аутентификация и авторизация 140
Поддержка кросс-функционального взаимодействия на разных языках………………… 140
Разделение управления входящим и межсервисным трафиком……………………………….. 141
Эволюция сервисных сетей…………………………………………………………………………………………………….. 142
Ранняя история и мотивация……………………………………………………………………………………….. 143
Шаблоны реализации………………………………………………………………………………………………….. 145
Библиотеки……………………………………………………………………………………………………………. 145
Sidecar……………………………………………………………………………………………………………………. 146
Библиотеки gRPC без прокси………………………………………………………………………………. 148
Без sidecar: реализации ядра операционной системы (eBPF)…………………………… 150
Таксономия сервисных сетей………………………………………………………………………………………………….. 151
Практический пример: использование сервисной сети для маршрутизации, наблюдаемости и безопасности 152
Маршрутизация с помощью Istio………………………………………………………………………………… 152
Наблюдение за трафиком с помощью Linkerd…………………………………………………………… 154
Сегментация сети с помощью Consul………………………………………………………………………….. 156
Развертывание сервисной сети: понимание и управление отказами………………………………….. 158
Сервисная сеть как единая точка отказа……………………………………………………………………. 159
Общие проблемы внедрения сервисной сети………………………………………………………………………… 159
Сервисная сеть в качестве ESB……………………………………………………………………………………. 159
Сервисная сеть в качестве шлюза……………………………………………………………………………….. 159
Слишком много сетевых уровней……………………………………………………………………………….. 160
Выбор сервисной сети…………………………………………………………………………………………………………….. 160
Определение требований…………………………………………………………………………………………….. 160
Создание или покупка?………………………………………………………………………………………………… 160
Руководство ADR: выбор сервисной сети………………………………………………………………….. 161
Заключение………………………………………………………………………………………………………………………………. 162
Часть III. Эксплуатация и безопасность API……………………… 165
Глава 5. Развертывание и релизы API………………………………………………….. 167
Отделение развертывания от релиза……………………………………………………………………………………… 167
Практический пример: установка флагов функций…………………………………………………… 168
Управление трафиком………………………………………………………………………………………………….. 170
Практический пример: моделирование релизов в конференц-системе……………………………….. 171
Жизненный цикл API……………………………………………………………………………………………………. 171
Сопоставление стратегий релизов с жизненным циклом………………………………………….. 172
Руководство ADR: отделение релиза от развертывания с помощью
управления трафиком и флагов функций……………………………………………………………………. 173
Стратегии релизов…………………………………………………………………………………………………………………… 173
Канареечный релиз………………………………………………………………………………………………………. 174
Зеркалирование трафика…………………………………………………………………………………………….. 176
Сине-зеленое развертывание………………………………………………………………………………………. 177
Практический пример: развертывание с помощью Argo Rollouts……………………………………….. 178
Мониторинг успешного выполнения и выявление отказов………………………………………………….. 181
Три столпа наблюдаемости………………………………………………………………………………………… 181
Важные метрики для API……………………………………………………………………………………………… 183
Считывание сигналов…………………………………………………………………………………………………… 184
Прикладные решения для эффективных релизов программного обеспечения…………………… 184
Кеширование ответов…………………………………………………………………………………………………… 185
Распространение заголовков на уровне приложений……………………………………………….. 185
Ведение журнала для помощи в отладке…………………………………………………………………… 185
Рассмотрение субъективной платформы……………………………………………………………………. 186
Руководство ADR: субъективные платформы……………………………………………………………. 186
Заключение………………………………………………………………………………………………………………………………. 187
Глава 6. Операционная безопасность: моделирование угроз для API…… 189
Практический пример: применение OWASP к API участников……………………………………………. 189
Риск при отсутствии защиты внешних API……………………………………………………………………………. 191
Моделирование угроз 101………………………………………………………………………………………………………. 192
Мыслите как злоумышленник………………………………………………………………………………………………… 193
Как построить модель угрозы?………………………………………………………………………………………………. 194
Этап 1: определение целей………………………………………………………………………………………….. 195
Этап 2: сбор нужной информации………………………………………………………………………………. 195
Этап 3: декомпозиция системы……………………………………………………………………………………. 195
Этап 4: выявление угроз и включение их в модель STRIDE…………………………………….. 196
Spoofing (Спуфинг)……………………………………………………………………………………………….. 199
Tampering (Подмена)……………………………………………………………………………………………. 199
Внедрение полезной нагрузки……………………………………………………………………. 199
Массовое переназначение………………………………………………………………………….. 200
Repudiation (Отрицание)……………………………………………………………………………………… 201
Information disclosure (Разглашение сведений)………………………………………………….. 202
Чрезмерное раскрытие данных………………………………………………………………….. 202
Некорректное управление активами…………………………………………………………. 203
Denial of Service (Отказ в обслуживании)…………………………………………………………… 204
Ограничение количества запросов и сброс нагрузки………………………………. 204
Elevation of privilege (Расширение полномочий)……………………………………………….. 206
Неправильная конфигурация безопасности………………………………………………………. 206
Терминирование TLS-соединений……………………………………………………………… 207
Совместное использование ресурсов разными источниками………………….. 207
Усиление директив безопасности………………………………………………………………. 208
Этап 5: Оценка рисков угроз……………………………………………………………………………………….. 208
Этап 6: Валидация……………………………………………………………………………………………………….. 210
Заключение………………………………………………………………………………………………………………………………. 211
Глава 7. Аутентификация и авторизация API………………………………………. 213
Аутентификация………………………………………………………………………………………………………………………. 213
Аутентификация конечных пользователей на основе токенов………………………………… 215
Аутентификация между системами…………………………………………………………………………….. 216
Почему не следует смешивать ключи и пользователей?………………………………………….. 216
OAuth2………………………………………………………………………………………………………………………………………. 217
Роль сервера авторизации при взаимодействии с API………………………………………………. 218
Веб-токены JSON (JWT)……………………………………………………………………………………………….. 218
Кодирование и верификация веб-токенов JSON………………………………………………… 220
Терминология и механизмы предоставления доступа OAuth2………………………………… 221
Руководство ADR: стоит ли рассматривать возможность
использования OAuth2?……………………………………………………………………………………………….. 222
Authorization Code Grant: предоставление доступа по коду авторизации……………… 223
Authorization Code Grant (+ PKCE)……………………………………………………………………… 225
Практический пример: доступ к API Участник с помощью Authorization Code Grant 226
Refresh-токены………………………………………………………………………………………………………………. 227
Client Credentials Grant: предоставление доступа к учетным данным клиента………. 227
Практический пример: доступ к API Участник из CFP-системы
при помощи Client Credentials Grant……………………………………………………………………. 228
Дополнительные варианты предоставления доступа OAuth2…………………………………. 228
Руководство ADR: какой из грантов OAuth2 стоит поддерживать………………………….. 229
Области видимости OAuth2…………………………………………………………………………………………. 229
Практический пример: применение областей видимости OAuth2
к API Участник……………………………………………………………………………………………………… 230
Обеспечение выполнения авторизации………………………………………………………………………. 231
Вкратце об OIDC……………………………………………………………………………………………………………………… 232
Протокол SAML 2.0…………………………………………………………………………………………………………………. 234
Заключение………………………………………………………………………………………………………………………………. 234
Часть IV. Эволюционная архитектура
с применением API………………………………………………………………………. 235
Глава 8. Перепроектирование приложений на архитектуру,
управляемую API…………………………………………………………………………………. 237
Зачем использовать API для развития системы?………………………………………………………………….. 237
Создание полезных абстракций: повышение связности…………………………………………… 238
Уточнение границ домена: продвижение слабой связанности………………………………… 239
Практический пример: установление границ домена сервиса Участник…………………………… 240
Варианты архитектуры конечного состояния………………………………………………………………………. 241
Монолит………………………………………………………………………………………………………………………… 241
Сервис-ориентированная архитектура (SOA)……………………………………………………………. 241
Микросервисы………………………………………………………………………………………………………………. 242
Функции…………………………………………………………………………………………………………………………. 243
Управление эволюционным процессом…………………………………………………………………………………. 243
Определите свои цели………………………………………………………………………………………………….. 243
Использование функций приспособленности……………………………………………………………. 244
Декомпозиция системы на модули……………………………………………………………………………… 245
Создание API как «швов» для расширения………………………………………………………………… 247
Определение точек приложения усилий в системе……………………………………………………. 248
Непрерывная поставка и верификация………………………………………………………………………. 249
Архитектурные паттерны для эволюционирующих систем с API………………………………………. 249
Паттерн «Душитель»……………………………………………………………………………………………………. 249
Паттерны «Фасад» и «Адаптер»………………………………………………………………………………….. 250
Паттерн «Слоеный пирог API»……………………………………………………………………………………. 251
Определение болевых точек и возможностей……………………………………………………………………….. 252
Вопросы модернизации и технического сопровождения…………………………………………. 252
Проблемы с производительностью…………………………………………………………………………….. 253
Разрушение зависимостей: API с сильной связанностью…………………………………………. 253
Заключение………………………………………………………………………………………………………………………………. 254
Глава 9. Использование инфраструктуры API для эволюции
в сторону облачных платформ……………………………………………………………… 255
Практический пример: перенос сервиса Участник в облако……………………………………………….. 255
Выбор стратегии миграции в облако…………………………………………………………………………………….. 256
Сохранение или пересмотр…………………………………………………………………………………………. 257
Перенос………………………………………………………………………………………………………………………….. 258
Смена платформы………………………………………………………………………………………………………… 258
Новая покупка………………………………………………………………………………………………………………. 259
Рефакторинг/смена архитектуры………………………………………………………………………………… 259
Отключение…………………………………………………………………………………………………………………… 260
Практический пример: смена платформы сервиса Участник для переноса его в облако… 260
Роль API-менеджмента……………………………………………………………………………………………………………. 260
Север-юг и восток-запад: размывание границ управления трафиком………………………………… 262
Начните с периферии и работайте вглубь…………………………………………………………………. 262
Пересекая границы: маршрутизация по сетям…………………………………………………………… 262
От зональной архитектуры к принципу нулевого доверия………………………………………………….. 263
Попадание в зону………………………………………………………………………………………………………….. 263
Никому не доверять и проверять…………………………………………………………………………………. 265
Роль сервисной сети в архитектурах с нулевым доверием………………………………………. 266
Дополнение сервисной сети сетевыми политиками………………………………………….. 267
Заключение………………………………………………………………………………………………………………………………. 269
Глава 10. Подведение итогов……………………………………………………………….. 271
Практический пример: оглянитесь на пройденный путь……………………………………………………… 271
API, Закон Конвея и ваша организация…………………………………………………………………………………. 277
Понимание типов решений……………………………………………………………………………………………………… 278
Подготовка к будущему………………………………………………………………………………………………………….. 278
Асинхронное взаимодействие……………………………………………………………………………………… 278
Протокол HTTP/3…………………………………………………………………………………………………………. 279
Сеть на основе платформы………………………………………………………………………………………….. 279
Что дальше: как продолжать изучать архитектуру API?…………………………………………………….. 279
Постоянное совершенствование базовых знаний……………………………………………………… 280
Следите за новостями в отрасли…………………………………………………………………………………. 280
Радары, квадранты и трендовые отчеты……………………………………………………………………. 281
Изучение лучших практик и примеров использования…………………………………………….. 281
Обучение на практике………………………………………………………………………………………………….. 282
Обучение через преподавание…………………………………………………………………………………….. 282
Предметный указатель…………………………………………………………………………. 283
Об авторах……………………………………………………………………………………………. 287
Об изображении на обложке………………………………………………………………… 287

Дэниэл Брайант (Daniel Bryant) — глава отдела по взаимодействию с разработчиками в компании Ambassador Labs, Java-чемпион. Эксперт в инструментарии DevOps, облачных и контейнерных платформах, микросервисах.

Гоф Джеймс (James Gough) — заслуженный инженер в компании Morgan Stanley, Java-чемпион, соавтор книги «Optimizing Java».

Оберн Мэтью (Matthew Auburn) — вице-президент компании Morgan Stanley. Занимался разработкой финансовых систем, мобильных и веб-приложений, обеспечением безопасности API.
