Облачный Go

This document was uploaded by one of our users. The uploader already confirmed that they had the permission to publish it. If you are author/publisher or own the copyright of this documents, please report to us by using this DMCA report form.

Simply click on the Download Book button.

Yes, Book downloads on Ebookily are 100% Free.

Sometimes the book is free on Amazon As well, so go ahead and hit "Search on Amazon"

Go – первый язык программирования, спроектированный специально для разработки облачных приложений. В настоящее время он занял лидирующие позиции в облачной разработке и используется повсюду: от Docker до Harbour, от Kubernetes до Consul, от InfluxDB до CockroachDB. Требования к масштабированию вынуждают разработчиков размещать свои сервисы на десятках и сотнях серверов – IT-отрасль постепенно становится «облачной». Но как разрабатывать и поддерживать такой сервис? В этой книге описывается практическая реализация сложных принципов проектирования облачных вычислений с помощью Go. Издание адресовано опытным разработчикам, особенно инженерам веб-приложений и инженерам по надежности, которые решают задачи управления и развертывания облачных приложений.

Author(s): Мэтью А. Титмус
Edition: 1
Publisher: ДМК Пресс
Year: 2022

Language: Russian
Commentary: Vector PDF
Pages: 418
City: М.
Tags: Cloud Computing; Programming; Concurrency; Distributed Systems; Scalability; Docker; Design Patterns; Go; Kubernetes; Prometheus; Resilience; Observability; Manageability

От издательства
Об авторе
Об иллюстрации на обложке
Предисловие
Часть I. Облачное окружение
Глава 1. Что такое «облачное» приложение?
История развития до настоящего времени
Что значит быть «облачным»?
Масштабируемость
Слабая связанность
Устойчивость
Управляемость
Наблюдаемость
Что особенного в облачном окружении?
Итоги
Глава 2. Почему Go правит облачным миром
Как появился Go
Особенности облачного мира
Композиция и структурная типизация
Понятность
Модель взаимодействия последовательных процессов
Быстрая сборка
Стабильность языка
Безопасность памяти
Производительность
Статическая компоновка
Статическая типизация
Итоги
Часть II. Облачные конструкции в Go
Глава 3. Основы языка Go
Базовые типы данных
Логические значения
Простые числа
Комплексные числа
Строки
Переменные
Сокращенная форма объявления переменных
Нулевые значения
Пустой идентификатор
Константы
Контейнеры: массивы, срезы и ассоциативные массивы
Массивы
Срезы
Работа со срезами
Оператор извлечения среза
Строки и срезы
Ассоциативные массивы
Проверка наличия в ассоциативном массиве
Указатели
Управляющие структуры
Забавный цикл for
Универсальная инструкция for
Обход в цикле элементов массивов и срезов
Обход в цикле элементов ассоциативных массивов
Инструкция if
Инструкция switch
Обработка ошибок
Создание ошибки
Необычные особенности функций: переменное число параметров и замыкания
Функции
Несколько возвращаемых значений
Рекурсия
Отложенные вычисления
Указатели как параметры
Функции с переменным числом аргументов
Передача срезов в параметре с переменным числом значений
Анонимные функции и замыкания
Структуры, методы и интерфейсы
Структуры
Методы
Интерфейсы
Проверка типа
Пустой интерфейс
Композиция путем встраивания типов
Встраивание интерфейсов
Встраивание структур
Продвижение
Прямой доступ к встроенным полям
Самое интересное: конкуренция
Сопрограммы
Каналы
Блокировка канала
Буферизация каналов
Закрытие каналов
Прием значений из канала в цикле
select
Реализация тайм-аутов для каналов
Итоги
Глава 4. Шаблоны программирования облачных приложений
Пакет context
Что может дать контекст
Создание контекста
Определение крайних сроков и тайм-аутов контекста
Определение значений в контексте запроса
Использование контекста
Структура этой главы
Шаблоны стабильности
Circuit Breaker (Размыкатель цепи)
Применимость
Реализация
Пример кода
Debounce (Антидребезг)
Применимость
Компоненты
Реализация
Пример кода
Retry (Повтор)
Применимость
Компоненты
Реализация
Пример кода
Throttle (Дроссельная заслонка)
Применимость
Компоненты
Реализация
Пример кода
Timeout (Тайм-аут)
Применимость
Компоненты
Реализация
Пример кода
Шаблоны конкуренции
Fan-In (Мультиплексор)
Применимость
Компоненты
Реализация
Пример кода
Fan-Out (Демультиплексор)
Применимость
Компоненты
Реализация
Пример кода
Future (В будущем)
Применимость
Компоненты
Реализация
Пример кода
Sharding (Сегментирование)
Применимость
Компоненты
Реализация
Пример кода
Итоги
Глава 5. Конструирование облачной службы
Давайте создадим службу!
Что такое хранилище пар ключ/значение?
Требования
Что такое идемпотентность, и почему это важно?
Конечная цель
Итерация 0: базовая функциональность
Наш суперпростой API
Итерация 1: монолит
Создание HTTP-сервера с использованием net/http
Создание HTTP-сервера с использованием gorilla/mux
Создание минимальной службы
Инициализация проекта с по­мощью модулей Go
Переменные в путях URI
Множество сопоставлений
Создание службы RESTful
Методы RESTful
Реализация функции создания
Реализация функции чтения
Добавление в структуру данных поддержки использования в конкурентном окружении
Интеграция мьютекса чтения/записи в приложение
Итерация 2: долговременное хранение ресурса
Что такое журнал транзакций?
Формат журнала транзакций
Интерфейс регистратора транзакций
Сохранение состояния в журнале транзакций
Создание прототипа регистратора транзакций
Определение типа события
Реализация FileTransactionLogger
Создание экземпляра FileTransactionLogger
Добавление записей в конец журнала транзакций
Использование bufio.Scanner для воспроизведения транзакций из журнала
Интерфейс регистратора транзакций (еще раз)
Инициализация FileTransactionLogger в веб-службе
Интеграция FileTransactionLogger в веб-службу
Будущие улучшения
Сохранение состояния во внешней базе данных
Работа с базами данных в Go
Импортирование драйвера базы данных
Реализация PostgresTransactionLogger
Создание экземпляра PostgresTransactionLogger
Выполнение SQL-запроса INSERT с по­мощью db.Exec
Использование db.Query для воспроизведения транзакций из журнала
Инициализация PostgresTransactionLogger в веб-службе
Будущие улучшения
Итерация 3: реализация безопасности транспортного уровня
Transport Layer Security
Сертификаты, центры сертификации и доверие
Закрытый ключ и файлы сертификатов
Формат Privacy Enhanced Mail (PEM)
Защита веб-службы с по­мощью HTTPS
В заключение о транспортном уровне
Контейнеризация хранилища пар ключ/значение
Основы Docker
Dockerfile
Сборка образа контейнера
Запуск образа контейнера
Проверка запущенного образа контейнера
Отправка запроса в опубликованный порт контейнера
Запуск нескольких контейнеров
Остановка и удаление контейнеров
Сборка контейнера для службы хранилища пар ключ/значение
Итерация 1: добавление двоичного файла в пустой образ
Итерация 2: многоэтапная сборка
Сохранение данных контейнера вовне
Итоги
Часть III. Облачные атрибуты
Глава 6. Все дело в надежности
В чем суть облачных вычислений?
Все дело в надежности
Что такое надежность, и почему она так важна?
Надежность обеспечивается не только операторами
Достижение надежности
Предотвращение неисправностей
Рекомендуемые практики программирования
Особенности языка
Масштабируемость
Слабая связанность
Отказоустойчивость
Устранение неисправностей
Проверка и тестирование
Управляемость
Прогнозирование неисправностей
Непреходящая актуальность методологии «Двенадцать факторов»
I. Кодовая база
II. Зависимости
III. Конфигурация
IV. Сторонние службы
V. Сборка, выпуск, выполнение
VI. Процессы
VII. Изоляция данных
VIII. Масштабируемость
IX. Живучесть
X. Сходство окружений разработки/эксплуатации
XI. Журналирование
XII. Задачи администрирования
Итоги
Глава 7. Масштабируемость
Что такое масштабируемость?
Различные формы масштабирования
Четыре основных узких места
С состоянием и без состояния
Состояние приложения и состояние ресурса
Преимущества отсутствия состояния
Отложенное масштабирование: эффективность
Эффективное кеширование с использованием кеша LRU
Эффективная синхронизация
Разделяйте память, общаясь
Уменьшение простоев на блокировках с помощью буферизованных каналов
Уменьшение простоев на блокировках с помощью сегментирования
Утечки памяти могут вызвать... фатальную ошибку исчерпания памяти во время выполнения
Утечки сопрограмм
Вечно тикающие таймеры
В заключение об эффективности
Архитектуры служб
Архитектура монолитной системы
Архитектура системы микросервисов
Бессерверные архитектуры
Достоинства и недостатки бессерверных вычислений
Бессерверные службы
Итоги
Глава 8. Слабая связанность
Тесная связанность
Множество форм тесной связанности
Хрупкие протоколы обмена
Общие зависимости
Общий момент времени
Фиксированные адреса
Взаимодействия между службами
Шаблон обмена сообщениями запрос/ответ
Распространенные реализации шаблона запрос/ответ
Отправка HTTP-запросов с использованием net/http
Вызов удаленных процедур с использованием gRPC
Определение интерфейса с использованием протокола буферов
Установка компилятора протокола буферов
Определение структуры сообщения
Структура сообщений для взаимодействий с хранилищем пар ключ/значение
Определение методов службы
Компиляция протокола буферов
Реализация службы gRPC
Реализация клиента gRPC
Слабое связывание локальных ресурсов с помощью плагинов
Подключение плагинов с по­мощью пакета plugin
Словарь плагинов
Пример плагина
Интерфейс Sayer
Код плагина
Сборка плагинов
Использование плагинов Go
Запуск примера
Система плагинов HashiCorp для Go, доступных через RPC
Еще один пример плагина
Общий код
Реализация плагина
Процесс-потребитель
Гексагональная архитектура
Архитектура
Реализация гексагональной службы
Реорганизация компонентов
Наш первый разъем
Основное приложение
Адаптеры TransactionLogger
Порт FrontEnd
Все вместе
Итоги
Глава 9. Устойчивость
Почему устойчивость важна
Что подразумевается под сбоем системы?
Обеспечение устойчивости
Каскадные сбои
Предотвращение перегрузки
Дросселирование
Сброс нагрузки
Постепенное ухудшение качества обслуживания
Повтори еще раз: повторные запросы
Алгоритмы увеличения задержки
Размыкание цепи
Тайм-ауты
Использование контекста Context для реализации тайм-аутов на стороне службы
Прерывание ожидания обработки клиентских запросов HTTP/REST
Прерывание ожидания обработки клиентских запросов gRPC
Идемпотентность
Как сделать службу идемпотентной?
А как насчет скалярных операций?
Избыточность служб
Проектирование избыточности
Автоматическое масштабирование
Проверка работоспособности
Что подразумевается под «работоспособностью» экземпляра?
Три типа проверок работоспособности
Проверка жизнеспособности
Поверхностная проверка работоспособности
Глубокая проверка работоспособности
Открытие при отказе
Итоги
Глава 10. Управляемость
Что такое управляемость, и почему она важна?
Настройка приложения
Рекомендуемые приемы организации конфигураций
Настройка с использованием переменных окружения
Настройка с использованием аргументов командной строки
Стандартный пакет flag
Парсер командной строки Cobra
Настройка с использованием файлов
Наша структура конфигурационных данных
Формат JSON
Формат YAML
Наблюдение за изменениями в конфигурационных файлах
Viper: швейцарский армейский нож конфигурационных пакетов
Явно устанавливаемые значения в Viper
Работа с флагами командной строки в Viper
Работа с переменными окружения в Viper
Работа с конфигурационными файлами в Viper
Использование удаленных хранилищ пар ключ/значение в Viper
Значения по умолчанию в Viper
Управление функциональными возможностями с по­мощью флагов
Разработка флага для управления функциональной возможностью
Итерация 0: начальная реализация
Итерация 1: жестко запрограммированный флаг
Итерация 2: настраиваемый флаг
Итерация 3: динамический флаг
Динамические флаги как функции
Реализация функции динамического флага
Поиск функции флага
Функция маршрутизации
Итоги
Глава 11. Наблюдаемость
Что такое наблюдаемость?
Зачем нужна наблюдаемость?
Чем наблюдаемость отличается от «традиционного» мониторинга?
«Три столпа наблюдаемости»
OpenTelemetry
Компоненты OpenTelemetry
Трассировка
Концепции трассировки
Трассировка с использованием OpenTelemetry
Создание экспортеров трассировки
Создание провайдера трассировки
Настройка глобального провайдера трассировки
Получение экземпляра трассировщика
Начальная и конечная операции
Установка метаданных операции
Автоматическое инструментирование
Собираем все вместе: трассировка
API-службы вычисления чисел Фибоначчи
Функция-обработчик службы вычисления чисел Фибоначчи
Функция main службы
Запуск служб
Вывод консольного экспортера
Просмотр результатов в Jaeger
Метрики
Два способа передачи метрик: принудительная и по запросу
Принудительная отправка метрик
Передача метрик по запросу
Какой подход лучше?
Метрики в OpenTelemetry
Создание экспортеров метрик
Установка глобального провайдера метрик
Экспортирование конечной точки метрик
Получение экземпляра Meter
Инструменты метрик
Собираем все вместе: метрики
Запуск служб
Вывод конечной точки метрик
Просмотр результатов в Prometheus
Журналирование
Рекомендуемые методы журналирования
Интерпретируйте журналы как потоки событий
Структурируйте события для последующего анализа
Лучше меньше, да лучше
Динамически фильтруйте журналируемые данные
Журналирование с использованием стандартного пакета log
Специальные функции журналирования
Журналирование в нестандартный объект записи
Флаги журналирования
Пакет журналирования Zap
Создание регистратора Zap
Журналирование с использованием Zap
Динамическая фильтрация журналируемых данных в Zap
Итоги
Предметный указатель