Вступление
00:00:00Разработан надежный API-сервис для сокращения URL-адресов, который из простого проекта для повышения квалификации превращается в готовое к работе приложение. Проект объединяет современные библиотеки и подходы к проектированию, включая эффективный маршрутизатор и расширенное ведение журнала, для обеспечения высокой степени поддержки и отзывчивости. Комплексное тестирование осуществляется с помощью модульных тестов, тестов-обработчиков и функциональных тестов для проверки надежности приложения как полноценной системы "черного ящика". Наконец, автоматизированный рабочий процесс развертывания с использованием GitHub Actions обеспечивает легкую настройку, сборку и удаленное развертывание сервера.
Почему мой Telegram-канал очень важен
00:01:28Творческий процесс начинается с активного участия в Telegram, где напрямую собирается информация о предпочтениях в контенте. Канал служит всеобъемлющим центром для обмена разнообразными идеями, отраслевыми руководствами, советами по разработке и своевременными анонсами проектов в сжатом формате. Учитывая сложности производства видео на YouTube, Telegram становится естественным источником более быстрых и частых обновлений, которые стимулируют развитие инновационных проектов.
Про папку cmd
00:03:05Настройка папки включает в себя видимый QR-код и ссылку, по которой пользователи могут перейти к коду приложения. Для запуска приложения создается файл, который помещается в указанную папку "cmd". В процессе описана общая структура, в которую позже могут быть добавлены различные команды, такие как очистка кэша и запланированные задачи, хотя в настоящее время реализована только команда запуска приложения. Папка, обрабатывающая эту команду, называется "shortiner".
План работ и описание используемых библиотек
00:03:46Минималистичная конфигурация и современная настройка ведения журнала Основная программа определяет четкую схему, в которой модуль настройки и система ведения журнала составляют основу. Для настройки выбрана минималистичная библиотека, позволяющая считывать различные популярные форматы файлов и точно управлять настройками по умолчанию и обязательными полями. Интегрирована современная библиотека протоколирования, которая уже сейчас предлагает передовые функциональные возможности и открывает путь для будущих обновлений стандартов. Тщательный отбор обеспечивает чистую и надежную инициализацию в основном файле Go.
Упрощенная маршрутизация, облегченная база данных и интеграция с рендерингом В приложении используется гибкий маршрутизатор, который отличается минимализмом и полностью совместим со стандартными пакетами, обеспечивая плавные переходы в будущем. Облегченная библиотека баз данных обеспечивает полную поддержку SQL с индексацией, сохраняя всю базу данных в простом файле, что идеально подходит для небольших проектов. Эффективный пакет рендеринга также позволяет легко управлять форматированием выходных данных. Этот интегрированный подход создает компактную, но мощную платформу для масштабируемой разработки проектов.
Конфигурация приложения и работа с конфигами - CleanEnv
00:07:46Инициализация конфигурации приложения Процесс начинается с создания папки "config" в корневом каталоге проекта, в которой хранятся файлы YAML, причем локальный файл YAML определяет среду, в которой выполняется приложение. Конфигурация различает локальные компьютеры и удаленные серверы, позволяя даже различать различные производственные экземпляры. Важные детали, такие как пути к файлам базы данных и индикаторы среды, настраиваются таким образом, чтобы адаптировать дальнейшую инициализацию.
Определение параметров сервера и тайм-аутов Конфигурация сервера определяет такие параметры, как хост и порт HTTP-сервера, и позволяет использовать нестандартные порты в случае возникновения конфликтов. Определены два отдельных таймаута: один для обработки клиентских запросов (4 секунды) и один для поддержания клиентских подключений (60 секунд). Такая конструкция оптимизирует повторное использование соединений, избегая повторяющихся циклов открытия/закрытия и обеспечивая своевременное реагирование.
Структурирование и анализ внутренней конфигурации Создается внутренний каталог для размещения встроенного оборудования для анализа конфигурационных файлов. Специальный файл отображает все параметры YAML в объект, который отражает структуру файла, используя теги NF для точного обозначения полей. Такой подход обеспечивает однозначное соответствие между параметрами, определенными в YAML, и внутренним объектом конфигурации приложения.
Управление настройками по умолчанию и метками безопасности Для параметров, которые могут быть опущены, установлены значения по умолчанию, такие как "Local", хотя рекомендуется соблюдать осторожность, поскольку эти значения по умолчанию могут создавать риски в производственных средах. Метки безопасности и тег NF required гарантируют, что все необходимые параметры указаны явно, предотвращая непреднамеренный запуск приложения. Использование этих тегов также позволяет дополнительно принудительно блокировать запуск при отсутствии критических конфигураций.
Чтение конфигурационных файлов и обработка ошибок Специализированная функция считывает конфигурационный файл по пути, определяемому переменными среды, подтверждая его существование с помощью утилит операционной системы. Если файл не найден, функция запускает аварийный сигнал при запуске, гарантируя, что приложение не запустится с неполными настройками. Такая немедленная обработка ошибок предотвращает длительные неправильные настройки и обеспечивает безопасность этапа инициализации.
Завершение настройки конфигурационного объекта и зависимостей После чтения и анализа файла конфигурации создается окончательный объект конфигурации, который возвращается для использования во всем приложении. Для вывода сведений о конфигурации включены шаги отладки, а также рекомендации по удалению конфиденциальной информации из производственных журналов. Процесс установки также включает инициализацию зависимостей, такую как сведения о контроле версий, обеспечивая полную и безопасную настройку перед запуском.
Настройка логгера - slog
00:21:34Slog как гибкая оболочка для ведения журнала Slog служит библиотекой-оболочкой, которая инкапсулирует множество методов ведения журнала, предоставляя как текстовый, так и JSON-форматы. Текстовый регистратор предназначен для локального визуального контроля, в то время как JSON-регистратор предназначен для агрегации журналов на стороне сервера. Его конструкция позволяет легко интегрировать пользовательские обработчики вывода. Правильный вывод конфигурации подтверждает, что настройка выполняется должным образом.
Инициализация регистратора, управляемая средой Создание логгера изолировано в специальной функции, которая регулирует поведение на основе параметра среды. Определена константа, позволяющая отличать локальное выполнение от производственного развертывания. Структура с переключателями выбирает между текстовыми или JSON-логгерами и соответствующим образом настраивает уровни ведения журнала. Такой подход обеспечивает четкое разделение между средами разработки и серверными средами.
Динамические уровни ведения журнала и пользовательские обработчики Система поддерживает настраиваемые уровни ведения журнала, которые активируют подробную отладочную информацию во время разработки и ограничивают журналы информационным уровнем в рабочей среде. Текстовый обработчик используется для немедленного создания удобочитаемых журналов, в то время как обработчик JSON облегчает структурированное ведение журнала на сервере. Конфигурация позволяет заменять или расширять стандартные обработчики пользовательскими функциями. Такая адаптивность гарантирует, что ведение журнала может соответствовать различным эксплуатационным требованиям.
Выполнение и проверка поведения регистратора Логгер выполняется в рамках основной функции, которая выводит сообщения журнала для подтверждения правильности установки и конфигурирования. Параметры среды и уровни ведения журнала отображаются в выводимых на печать данных, подтверждая предполагаемое поведение каждого обработчика. Журналы отладки и информационные журналы корректно генерируются в соответствии с настройками активной среды. Тестирование подтверждает, что объект logger возвращает структурированные и точные данные для ведения журнала.
Пишем Storage - БД / хранилище данных сервиса - SQLite
00:30:25Модульная конструкция для унифицированного хранилища SQLite В выделенной внутренней папке хранится отдельный файл, который объединяет информацию для всех реализаций хранилища, закладывая основу для будущих изменений. Дизайн предусматривает использование нескольких методов хранения, что позволяет легко адаптировать такие приложения, как Yandex, MySQL или MongoDB. Этот подход служит минималистичным "Hello World" для базы данных, подчеркивая простоту и расширяемость.
Надежная обработка ошибок и согласованные результаты Код последовательно возвращает как объект хранилища, так и сообщение об ошибке, гарантируя, что любые проблемы будут напрямую переданы обратно для четкой отладки. Константы и метки ошибок используются для стандартизации сообщений об ошибках в разных модулях. Такой систематический подход укрепляет поддерживаемую и надежную стратегию управления ошибками.
Минималистичная стратегия инициализации и миграции базы данных База данных инициализируется с помощью простого запроса, который создает таблицу URL, если она не существует, что упрощает настройку. Структура таблицы содержит три основных поля: ID, alias и URL, которые важны для перенаправления URL. Несмотря на то, что миграции признаны полезными, в настоящее время основное внимание уделяется простой и эффективной инициализации, способствующей дальнейшему развитию.
Простой запуск приложения и настройка драйвера Основной файл приложения управляет инициализацией хранилища и гарантирует, что драйвер SQLite правильно импортирован и настроен. Основное внимание уделяется обработке ошибок, связанных с драйверами, и устранению непредвиденных проблем во время запуска. Такая последовательность инициализации гарантирует, что приложение надежно подключится к базе данных, прежде чем продолжить работу.
Централизованные утилиты ведения журнала для улучшения отладки Для упрощения составления отчетов об ошибках и обеспечения единообразия форматирования сообщений был создан отдельный пакет протоколирования. Служебные функции автоматически добавляют постоянные идентификаторы в журналы ошибок, уменьшая избыточность кода обработки ошибок. Это не только упрощает отладку, но и способствует созданию более чистой и организованной базы кода.
Эффективная отладка, ведущая к будущим улучшениям После устранения проблем с импортом и устранения ошибок, связанных с отсутствием каталога, система хранения данных успешно инициализируется и создает необходимую таблицу. Процесс подтверждает, что все компоненты — от драйвера SQLite до процедур обработки ошибок — работают должным образом. Обладая таким прочным фундаментом, проект хорошо подготовлен к дополнительным усовершенствованиям и внедрению альтернативных систем хранения данных.
SaveURL() - пишем метод Storage для сохранения URLов
00:43:56Понятный дизайн API для хранения URL-адресов Функция signature отличает параметр URL, используя уникальное имя, чтобы избежать конфликтов между стандартными библиотеками. Выбор имени предотвращает неоднозначность с существующими типами и обеспечивает четкую идентификацию того, что хранится. Дизайн предусматривает возврат ошибки и индекса записи, несмотря на то, что некоторые базы данных не предоставляют идентификаторы автоматически. Такой продуманный подход создает четкий и недвусмысленный интерфейс для хранения URL-адресов.
Надежная обработка ошибок и уникальная логика ограничений Ошибки из базы данных преобразуются во внутренние типы, что позволяет обнаруживать уникальные нарушения ограничений. Реализация преобразует и проверяет конкретные коды ошибок, чтобы определить, когда возникают дубликаты. Стандартизация ответов на ошибки позволяет избежать утечки информации, относящейся к конкретной базе данных, клиенту. Такая последовательная обработка ошибок гарантирует, что повторяющиеся записи URL-адреса вызовут единое информативное сообщение об ошибке.
Валидация с помощью тестирования и ведения журнала Ручное выполнение и автоматические тесты подтверждают, что функция корректно обрабатывает повторяющиеся записи URL-адресов. Сообщения об ошибках регистрируются и проверяются с помощью проверок базы данных, что гарантирует соблюдение запланированного поведения. Процесс тестирования показывает, что ошибки, связанные с уникальными ограничениями, точно фиксируются и передаются в отчет. Эти проверки демонстрируют, что функция надежно справляется как с успешными вставками, так и с ошибками.
GetURL() - метод Storage для получения URLов
00:50:01Метод с именем getURL используется в компоненте Storage для извлечения URL-адресов исключительно для внутреннего использования в обработчиках. Он следует шаблону, установленному предыдущим методом safe URL, но реализует более простой подход, используя постоянный API и подготовку запросов. Этот метод включает обработку ошибок, проверяя, существует ли запрошенный URL-адрес в базе данных, и при необходимости возвращает конкретные, заранее подготовленные ошибки. Если возникает какая-либо другая ошибка, она просто возвращается, обеспечивая четкую и согласованную обработку на протяжении всего процесса.
DeleteURL() - упражнение для самостоятельной работы
00:51:40Независимая практика сосредоточена на создании метода, который удаляет URL-адреса и возвращает ошибку при неудачном удалении. Полностью разработанный метод получения URL-адреса и соответствующий обработчик удаления уже существуют, что подчеркивает четкое назначение функции. Эта задача оттачивает навыки обработки ошибок и разработки методов, а также поощряет практическое изучение серверных операций.
Создаём роутер - Chi
00:52:29Инструкции начинаются с создания и интеграции маршрутизатора в файл main.go и описывают следующие шаги по инициализации. В них подчеркивается необходимость установки необходимого пакета, если это еще не было сделано, для упрощения разработки. Вместо того, чтобы каждый раз вручную вводить необходимые импортные данные, рекомендуется выполнить поиск в Интернете или использовать доступные ресурсы GitHub для их копирования и вставки. Из описания становится ясно, что эти методы обеспечивают более плавную и эффективную настройку проекта.
Middleware для роутера - что это?
00:53:27Внутри маршрутизатора промежуточное программное обеспечение определяет цепочку обработчиков, каждый из которых последовательно обрабатывает входящие запросы. Завершающим выполнением запроса управляет основной обработчик, в то время как дополнительные обработчики, такие как проверки авторизации, гарантируют, что будут выполняться только должным образом подтвержденные запросы. Для таких действий, как создание или удаление URL-адреса, промежуточное программное обеспечение авторизации играет решающую роль, проверяя информацию для входа в систему и останавливая процесс, если учетные данные отсутствуют или неверны.
Подключаем Middleware: RequestID и RealIP
00:54:30Интегрированное промежуточное программное обеспечение с помощью маршрутизатора присваивает уникальный идентификатор запроса каждому входящему запросу, упрощая процесс отслеживания ошибок в параллельных операциях. Этот уникальный идентификатор обеспечивает точную корреляцию с журналами базы данных и облегчает эффективную отладку с помощью инструментов ведения журнала, таких как Grafana или Kibana. Программа настройки также предоставляет возможность отслеживать изменения в поведении пользователя, что еще больше расширяет возможности мониторинга.
Middleware для логирования запросов
00:56:19Стратегия централизованного ведения журнала запросов Промежуточное программное обеспечение для ведения журнала предназначено для отслеживания каждого входящего HTTP-запроса путем внедрения специального регистратора, который записывает уникальную запись при получении. Оно помечает каждый запрос специальными сообщениями в журнале, указывающими время поступления запроса и его обработки. Промежуточное программное обеспечение также собирает важные данные, такие как количество байт и статус ответа. Этот подход позволяет настроить как внутренний регистратор, так и пользовательское решение для ведения журнала для всего приложения.
Выполнение и интеграция цепочки промежуточного программного обеспечения Компонент ведения журнала интегрирован в HTTP-сервер через структурированную структуру промежуточного программного обеспечения, организованную в его собственном каталоге. Он выводит начальную логическую инструкцию перед передачей управления следующему обработчику в цепочке посредством вызова функции. К каждому запросу присваивается уникальный идентификатор запроса для обеспечения корреляции между последующими журналами. Стандартные библиотеки упрощают эту интеграцию, предлагая легко адаптируемую модульную реализацию обработчика.
Улучшенные показатели и настраиваемые выходные данные журнала Подробные выходные данные журнала содержат ключевые показатели производительности, такие как статус ответа, количество байт и продолжительность обработки. Для сбора и регистрации информации как до, так и после выполнения основного обработчика запросов используется функциональная оболочка. Включение постоянного идентификатора запроса облегчает эффективную фильтрацию и отслеживание журналов. Конструкция обеспечивает гибкость, позволяя по желанию использовать либо встроенное промежуточное программное обеспечение, либо пользовательское ведение журнала, адаптированное к конкретным потребностям приложения.
Middleware: Recover и URLFormat - удобный парсинг URL-параметров
01:02:43Один ошибочный запрос может вызвать панику внутри обработчика, которая может привести к сбою всего приложения, поэтому для отслеживания таких событий и восстановления после них используется промежуточное программное обеспечение. Этот механизм восстановления гарантирует, что система остается стабильной, несмотря на неожиданные сбои. Подход к форматированию URL-адресов позволяет создавать привлекательные, параметризованные маршруты для обработки запросов, например, вставлять идентификатор в URL-адрес. Хотя такой подход повышает удобство и ясность маршрутизации, он тесно привязывает реализацию к конкретной платформе маршрутизатора.
Pretty Logger - крутые красивые логи для локальной разработки
01:04:20Создание пользовательского регистратора с индивидуальными обработчиками для локальной разработки Идея заключается в создании логгера специально для локальной разработки путем создания пользовательских обработчиков и интеграции их с системой маршрутизации. В этом подходе используется пакет slog, который обрабатывает записи журнала как структурированные объекты, которые затем форматируются этими обработчиками. Вдохновленный статьей на slog, мы создали специальный каталог для размещения реализаций обработчиков, которые выводят логи в эстетичном формате JSON с выделенными цветами.
Внедрение улучшенных дисплеев журналов с цветовой кодировкой для повышения наглядности Реализация заменяет стандартную инициализацию логгера в главном файле пользовательским обработчиком для преобразования выходных данных журнала. При запуске приложение отображает сообщения журнала с четкими цветовыми выделениями — ошибки выделены красным, ключевые сообщения - синим, а параметры - приглушенными. Такая визуальная дифференциация упрощает процесс отладки, четко разграничивая компоненты сообщений и демонстрируя мощный локальный инструмент разработки.
Handler: Save - обработчик запросов на сохранение URL
01:08:35Основы обработчика сохранения URL-адреса Архитектура начинается с четкой организации по папкам, где каталог "Hands" содержит подпапку для обработчиков URL-адресов. Дизайн нацелен на обработку запросов на сохранение URL-адресов с учетом масштабируемости и будущих улучшений. Структура, подготовленная для потенциальных дополнений, таких как аутентификация, обеспечивает надежную отправную точку.
Создание экземпляров обработчиков с помощью функций конструктора Для инициализации обработчика сохранения со всеми необходимыми параметрами создана специальная функция-конструктор New. Эта функция инкапсулирует дополнительные настройки и легко привязывает обработчик к маршрутизатору. Она устраняет разрыв между обработкой необработанных запросов и базовой бизнес-логикой.
Интеграция репозитория через соответствие интерфейсу Интерфейс URL-сервера определяет методы, которые возвращают псевдоним, идентификатор и информацию об ошибке при хранении URL-адреса. Репозиторий на основе sqlite интегрирован для автоматического соответствия этому интерфейсу. Такой подход обеспечивает согласованность, модульность и четкий контракт для управления данными.
Разработка схемы запроса JSON Запросы ожидаются в виде объектов JSON, которые детализируют URL-адрес, который необходимо сохранить. Схема содержит обязательные поля наряду с необязательными элементами, что обеспечивает точный синтаксический анализ. Четко определенная структура поддерживает надежное преобразование входных данных в обрабатываемые.
Динамическая обработка необязательных псевдонимов Система позволяет клиентам указывать псевдоним, но если он опущен, то вместо него генерируется уникальный случайный псевдоним. Эта гибкая логика гарантирует, что каждая запись URL-адреса получит отдельный идентификатор. Механизм поддерживает надежность, автоматически компенсируя недостающие данные.
Формирование единой структуры реагирования Ответы стандартизированы и включают в себя постоянные индикаторы состояния и сообщения об ошибках при возникновении проблем. Поле постоянного состояния присутствует всегда, в то время как сведения об ошибке отображаются только в том случае, если что-то идет не так. Такой дизайн обеспечивает четкую обратную связь и упрощает интерпретацию результатов клиентом.
Повторное использование Пакетов Ответов в разных Обработчиках Отдельный пакет API объединяет общие функциональные возможности реагирования для повторного использования в нескольких обработчиках. Это модульное повторное использование гарантирует единообразное построение всех ответов. Благодаря централизации этой логики будущие обновления становятся проще, а система приобретает общую согласованность.
Интеграция ведения журнала и управления метаданными В рамках реализации внедрены константы ведения журнала и уникальные идентификаторы запросов для улучшения прослеживаемости каждой операции. Эти элементы метаданных помогают отслеживать каждую транзакцию и облегчают отладку. Систематическое ведение журнала обеспечивает прозрачность и упрощает устранение неполадок на протяжении всего процесса обработки.
Принудительная проверка введенных данных с помощью инструментов проверки подлинности Специальный валидатор, такой как пакет gogen, используется для подтверждения того, что входящие запросы JSON содержат все необходимые поля. Эта упреждающая проверка проверяет форматы ввода, в частности, проверяя правильность структуры URL-адресов. При сбое проверки генерируются описательные сообщения об ошибках, что повышает надежность.
Реализация генерации случайных псевдонимов Отдельный модуль обрабатывает генерацию случайного псевдонима, когда клиент не предоставляет ни одного из них. Используя генератор случайных чисел, он каждый раз формирует уникальную последовательность символов. Такая реализация повышает надежность сервиса, гарантируя уникальность при создании идентификатора.
Стратегии обработки ошибок и обнаружения дубликатов Тщательная обработка ошибок гарантирует, что такие проблемы, как дублирование URL-адресов или сбои в обработке, будут четко зарегистрированы и доведены до сведения пользователей. Предопределенные коды ошибок и статусы отличают нормальную работу от состояния ошибки. Клиенты получают немедленную и прозрачную обратную связь о любых возникающих проблемах.
Интеграция маршрутизации и окончательная сборка Обработчик сохранения, в конечном счете, связан с основным маршрутизатором, сопоставляя его с конечными точками POST для сохранения URL-адресов. Его бесшовная интеграция с компонентами проверки, ведения журнала и создания отчетов об ошибках создает надежный модульный сервис. Тщательное тестирование и четкие определения маршрутизации подготавливают систему к практическому внедрению и будущим усовершенствованиям.
Создание и запуск HTTP сервера
01:35:09Настройка HTTP-сервера с помощью унифицированного промежуточного программного обеспечения HTTP-сервер запускается немедленно после инициализации основного обработчика GET еще до завершения всех обработчиков перенаправления. Реализация использует стандартную библиотеку для объединения отдельных обработчиков запросов в единый маршрутизатор, что упрощает управление промежуточным программным обеспечением. Значения тайм-аута чтения и записи настраиваются из внешних настроек, обеспечивая достаточное время для обработки запросов и доставки ответов. Ведение журнала подтверждает инициализацию, выводя адрес сервера сразу после ее запуска.
Запуск службы и проверка операций Служба работает со всем необходимым промежуточным программным обеспечением и специальным обработчиком URL-адресов, обрабатывающим входящие запросы. Механизм блокировки вызовов останавливает выполнение и регистрирует ошибки в случае возникновения непредвиденной проблемы, обеспечивая надежность. Основная процедура выполняется и отслеживается с помощью журналов, подтверждающих, что и средство регистрации промежуточного программного обеспечения, и сервер активны. Тестирование с использованием таких клиентов, как Postman или curl, немедленно подтверждает отзывчивость сервера и его рабочее состояние.
Пишем тест для хэндлера Save
01:38:08Установление необходимости тестирования обработчика Разработчик подчеркивает, что, хотя тесты для обработчика сохранения необязательны, они настоятельно рекомендуются для обеспечения надежности. Вместо того, чтобы переписывать тесты с нуля, копируется и адаптируется уже существующий шаблон. Такой подход экономит время, сохраняя при этом необходимый охват для надежной функциональности.
Создание регистратора отказов для изолированного тестирования Для предотвращения влияния сообщений журнала на результаты тестирования реализован регистратор сброса. Регистратор придерживается требуемого интерфейса, автоматически отбрасывая сообщения вместо вывода результатов. Каждый метод определен таким образом, чтобы имитировать стандартное поведение, изолируя логику обработчика.
Автоматизированная генерация макетов для моделирования зависимостей Макеты автоматически генерируются с использованием специализированной библиотеки для имитации поведения реальных зависимостей. Эта автоматизация исключает ручное копирование и создает реалистичные реакции объекта, включая возможные сценарии ошибок. Этот процесс гарантирует, что во время тестирования будут точно имитированы внешние взаимодействия.
Организация параллельного выполнения тестов с использованием уникальных примеров Тесты разработаны для параллельного выполнения, что оптимизирует эффективность и имитирует условия реального мира. Каждый тестовый набор уникально идентифицируется для обеспечения изолированного и независимого выполнения. Система проверяет, что каждый набор запускается ровно один раз, предотвращая дублирование или несогласованные результаты.
Моделирование тестовых запросов и проверка поведения обработчика Тестовые запросы тщательно обрабатываются с использованием конкретных полезных данных и параметров JSON, которые имитируют реальные вызовы API. Обработчик обрабатывает эти входные данные, а его ответы проверяются на соответствие ожидаемым сообщениям об ошибках и выводам. Это моделирование подтверждает, что обработчик правильно интерпретирует входные данные и обрабатывает ошибки, как было задумано.
Интеграция регистраторов ответов для проверки HTTP Для обработки выходных данных обработчика используется средство записи ответов из стандартной библиотеки HTTP. Отправляя POST-запрос со структурированным текстом, тест проверяет код состояния, содержимое ответа и сообщения об ошибках. Такая интеграция гарантирует, что обработчик ведет себя должным образом в среде HTTP-сервера.
Выполнение тестов и усовершенствование обработки ошибок Затем выполняется полный набор тестов для проверки того, что обработчик возвращает правильный статус, сообщение и коды ошибок. Выявляются и устраняются любые несоответствия, такие как непредвиденные ошибки или количество вызовов. Итеративное тестирование и доработка приводят к созданию стабильной системы, в которой все тесты проходят надежно.
Функциональные тесты - что это такое, и чем они лучше?
01:52:13Тестирование разделено на модульные тесты, которые проверяют конкретные обработчики, и функциональные тесты, которые моделируют реальные сценарии с подлинными запросами. Модульные тесты нацелены только на базовую функциональность обработчика, не затрагивая такие элементы, как полное взаимодействие с конечными точками или потоки авторизации. Авторизация и другие общесистемные функции обрабатываются отдельно, чтобы обеспечить надлежащую проверку всего потока запросов. Такой подход обеспечивает как точное тестирование компонентов, так и всестороннюю проверку всего рабочего процесса приложения.
Handler: Redirect - редиректим пользователя на сохранённый URL
01:53:37Создание логики перенаправления на основе URL Сохраненный URL-адрес сначала сохраняется с ключевым параметром для последующего перенаправления. Обработчик аккуратно форматируется и подключается к основному маршрутизатору, где параметры извлекаются с использованием фигурных скобок. Этот подход лежит в основе процесса перенаправления, который эффективно направляет пользователей к их сохраненному месту назначения.
Определение интерфейса средства получения URL-адресов и настройка обработчика Введен специальный интерфейс получения URL-адресов, который принимает строку и возвращает ошибку при необходимости. Для инкапсуляции этой функциональности создается новый пакет перенаправления, а обработчик создается фабричным методом. Динамическое извлечение параметров из маршрутизатора легко связывает вводимые пользователем данные с поиском в сохраненной базе URL-адресов.
Обеспечение безопасной обработки ошибок и настройки HTTP-ответа Обработчик проверяет, не является ли указанный параметр непустым, прежде чем продолжить поиск сохраненного URL-адреса. В случаях, когда URL-адрес отсутствует или недействителен, ошибки регистрируются внутри системы и возвращается соответствующий ответ без раскрытия конфиденциальных сведений. На заключительном этапе отправляется индивидуальный ответ на перенаправление HTTP с учетом кодов состояния, таких как 301, для управления кэшированием и постоянными перемещениями.
Handler: Delete - упражнение для самостоятельной работы
02:00:23В руководстве предлагается разработать обработчик удаления как самостоятельное упражнение, позволяющее избежать ненужного дублирования предыдущих методов. В нем делается упор на использование простого HTTP-запроса на удаление, который сервер может интерпретировать естественным образом. Предыдущий опыт работы с подобными обработчиками гарантирует, что создание этой функциональности является управляемым. В рекомендациях содержится намек на будущие расширения, в которых удаления могут быть нацелены на различные ресурсы, такие как URL-адреса или пользователи, что усиливает минималистичный и гибкий подход к дизайну.
Авторизация - ограничение прав доступа к некоторым хэндлерам
02:01:37Ограничение доступа к конфиденциальным конечным точкам Удаленная служба использует управляемую систему управления URL-адресами, в которой только определенные конечные точки могут вносить изменения, такие как сохранение, удаление или обновление URL-адресов. Пользовательская группа маршрутизаторов с унифицированным префиксом URL-адреса управляет этими операциями, ограничивая общий доступ к назначенной конечной точке. Права доступа намеренно ограничены, гарантируя, что только авторизованный пользователь изначально сможет управлять этими обработчиками.
Интеграция базовой аутентификации для безопасной маршрутизации Функция промежуточного программного обеспечения включает в маршрутизатор базовый механизм аутентификации, обеспечивающий проверку учетных данных с помощью HTTP-заголовков. Система использует облегченную базовую библиотеку аутентификации, которая ожидает информацию об имени пользователя и пароле для подтверждения доступа. Конфиденциальные конечные точки защищены с помощью этой встроенной логики, гарантирующей, что каждый запрос на изменение будет должным образом аутентифицирован.
Безопасное управление Конфигурацией в разных Средах Стратегия настройки позволяет отделить конфиденциальные настройки, хранящиеся в локальных файлах, от безопасных учетных данных, хранящихся в защищенных секретных файлах GitHub. Переменные среды используются для передачи секретных данных в качестве стандартных параметров, что позволяет различать настройки для разработки и производства. Автоматическое тестирование, включая запросы почтальонов, подтверждает, что при предоставлении неверных или отсутствующих учетных данных в доступе отказано.
Авторизация: как её протестировать с помощью Postman
02:07:03Использовать Postman для тестирования авторизации просто, поскольку он позволяет создавать POST-запрос и выбирать различные методы аутентификации. Интерфейс инструмента предлагает множество вариантов для моделирования различных методов авторизации, включая методы на основе токенов и OAuth. Простая аутентификация осуществляется путем ввода имени пользователя и пароля, что гарантирует соответствие выбранного метода требованиям сервиса. Этот практичный подход помогает установить надежный контроль доступа в сервисах RESTful.
Пишем тест для хэндлера Redirect
02:08:06Упрощенная настройка для тестирования обработчика перенаправления Базовый тест для обработчика перенаправления создается с использованием того же подхода, что и тест для безопасного обработчика. Макет объекта создается с соблюдением установленных принципов, чтобы гарантировать отсутствие непредвиденных ошибок. Планируется несколько тестовых случаев, чтобы охватить различные пограничные сценарии, сохраняя при этом простоту реализации.
Интеграция с маршрутизатором для перенаправления на основе параметров Вместо использования стандартного обработчика создается маршрутизатор, облегчающий поиск ключевых параметров по имени. Такая конструкция позволяет тестовой платформе моделировать различные сценарии и настраивать обработку запросов. Этот подход использует привычные обозначения для обеспечения согласованности с предыдущими тестами и упрощает извлечение параметров.
Обеспечение ожидаемых кодов перенаправления и пользовательской обработки ошибок В процессе тестирования проверяется, что перенаправление возвращает именно статус HTTP 302, вызывая пользовательскую ошибку при возникновении отклонений. Специализированный HTTP-клиент фиксирует заголовок "Местоположение", чтобы предотвратить автоматическое перенаправление и точно проверить конечный URL. Окончательные проверки гарантируют, что тела ответов закрываются должным образом и что общее поведение соответствует ожидаемым критериям.
Функциональные тесты - тестируем приложение как черную коробку
02:13:18Простой подход к тестированию с помощью черного ящика Функциональные тесты рассматривают приложение как "черный ящик", фокусируясь исключительно на поведении при вводе-выводе, не полагаясь на внутренние зависимости или сетевые макеты. Тестируемый сервис прост в использовании, что устраняет необходимость в сложных сетевых симуляциях. Специализированные библиотеки генерируют случайные имена, адреса электронной почты и телефонные номера для получения реалистичных тестовых данных.
Использование платформ тестирования HTTP Для моделирования реальных взаимодействий клиента с сервисом используется специализированная платформа тестирования HTTP. Базовый URL-адрес тщательно разрабатывается с использованием стандартных библиотек для обеспечения соответствия конфигурациям развертывания. Запросы POST отправляются с правильно сформированной полезной нагрузкой в формате JSON, а ответы проверяются путем подтверждения ожидаемых кодов состояния и структуры.
Динамическое формирование запроса и оценка ответа Запросы создаются путем динамического формирования URL-адресов и встраивания случайно сгенерированных тестовых данных в полезную информацию в формате JSON. Система проверяет ответы, проверяя успешный статус HTTP 200 и корректность содержимого в формате JSON. Утверждения извлекают и сравнивают ключевые элементы ответа, чтобы убедиться, что сервис функционирует должным образом.
Проверка механизма перенаправления и рабочего процесса удаления Функциональность перенаправления тестируется путем генерации URL-адресов с точными конечными сегментами и проверки соответствия возвращаемого перенаправления ожидаемым критериям маршрутизации. Рабочий процесс включает в себя имитацию процесса удаления и проверку того, что неверные запросы приводят к соответствующим кодам состояния. Эти проверки обеспечивают как правильное перенаправление, так и управление ошибками при вызове обработчиков удаления.
Ведение журнала промежуточного программного обеспечения и прозрачность потока запросов Компоненты промежуточного программного обеспечения собирают подробные журналы, в которых фиксируется прохождение каждого запроса через систему. Регистрируемая информация включает параметры API, уникальные идентификаторы запросов и продолжительность обработки, что помогает выявлять проблемы. Последовательная проверка журналов повышает прозрачность процессов аутентификации, авторизации и обработки ошибок.
Интеграция с базой данных и постоянная проверка состояния Функциональные тесты распространяются на уровень базы данных, чтобы убедиться в правильности записи динамически генерируемых ссылок и связанных с ними данных. Бесперебойное взаимодействие между конечными точками службы и внутренним хранилищем подтверждает, что операции постоянно поддерживаются. Этот интеграционный тест проверяет соответствие между запросами в режиме реального времени и постоянным состоянием приложения.
Надежная обработка ошибок и проверка крайних случаев Расширенные сценарии имитируют ошибочные входные данные, такие как пустые или неправильно сформированные URL-адреса, для проверки корректной обработки ошибок. Ожидается, что приложение будет возвращать конкретные сообщения об ошибках и альтернативные коды состояния при возникновении аномалий. Дополнительные проверки, включая фильтрацию идентификаторов запросов, гарантируют, что все крайние случаи будут тщательно проверены на устойчивость.
Настраиваем деплой проекта на удалённый сервер
02:28:23Комплексная стратегия гарантирует, что приложение будет проверено тщательным тестированием перед его развертыванием на удаленном сервере. Служба настроена для надежной работы без необходимости постоянного размещения на персональном компьютере. Механизм автоматического перезапуска гарантирует, что служба останется доступной благодаря немедленному восстановлению после любого непредвиденного простоя.
Покупаем сервер у Selectel
02:28:46Приобретение облачного сервера Selectel Процесс начинается с доступа к панели управления Selectel и инициирования создания нового облачного сервера. Сервер приобретается по одному из нескольких доступных вариантов, адаптированных для облегченных проектов, которые позже будут интегрированы с GitHub Actions. Гибкость обеспечивается за счет возможности выбора различных конфигураций, соответствующих потребностям проекта в развертывании.
Эффективное распределение ресурсов Sharedline В основе конфигурации лежит опция sharedline, при которой арендуется только часть ядра процессора, например 20%, а не все ядро целиком. Этот метод позволяет снизить затраты, обеспечивая при этом все возможности сервера, такие как балансировка нагрузки, масштабирование и резервное копирование. Система динамически распределяет неиспользуемые ресурсы, позволяя временно использовать их в полном объеме без дополнительных затрат.
Настройка операционной системы и технических характеристик оборудования Во время установки предлагается ряд дистрибутивов Linux, причем по умолчанию используется вариант, соответствующий основным требованиям проекта. Сервер оснащен минимальными ресурсами — 512 МБ памяти и небольшим дисковым пространством — для обеспечения экономичности при работе с легким приложением. Такой выбор обеспечивает баланс между производительностью и доступностью по цене, оставляя при этом возможности для масштабирования в будущем, если потребуется более высокая вычислительная мощность.
Защита доступа с помощью SSH-ключей и действий на GitHub Безопасный доступ к серверу обеспечивается путем генерации пары SSH-ключей и назначения одного из них для автоматического развертывания с помощью GitHub Actions. Открытый ключ загружается в интерфейс сервера и присваивается идентификатор для конкретного проекта, что упрощает процесс интеграции. Эта автоматизированная настройка устраняет необходимость в ручном вмешательстве, гарантируя, что будущие обновления кода и развертывания будут выполняться безопасно и эффективно.
GitHub Actions: настройка автоматического деплоя проекта
02:36:00GitHub Actions автоматизирует публикацию проектов и управление рабочими процессами на GitHub. Все начинается с подготовки репозитория путем создания необходимых файлов, таких как .gitignore, чтобы исключить определенные каталоги. Нажатие одним щелчком мыши упрощает фиксацию и загрузку проекта, обеспечивая эффективную интеграцию. Затем интерфейс Actions предлагает универсальные варианты развертывания, включая индивидуальные конфигурации для таких языков, как Go.
GitHub Actions: Пишем Worflow для деплоя
02:37:38Организация файлов рабочего процесса для развертывания В корневой папке проекта создается специальная папка для хранения всех рабочих процессов развертывания, что обеспечивает централизацию конфигураций. Предварительно подготовленный файл рабочего процесса копируется в этот каталог, чтобы избежать ручного кодирования в режиме реального времени. Этот метод упрощает управление и обеспечивает согласованность методов развертывания.
Настройка четких триггеров и контролируемое выполнение Рабочий процесс специально назван так, чтобы отображаться в списке действий на GitHub, и настроен на запуск в зависимости от определенного тега. Реализован механизм ручной диспетчеризации, требующий явного ввода тега для запуска процесса. Этот контролируемый подход гарантирует, что развертывания будут выполняться только по назначению и с соблюдением точных условий.
Определение структуры заданий и серверной среды В разделе "Задание" описаны все необходимые шаги и указано, как использовать среду Ubuntu для выполнения. Подробные сведения о сервере, включая IP-адреса и необходимые переменные, указаны для точной удаленной настройки. Эта структура разбивает развертывание на этапы, начиная с указания целевого сервера и заканчивая настройкой переменных среды.
Создание приложения и подготовка ресурсов Компьютер runner клонирует репозиторий и устанавливает зависимости, используя определенную версию Go. В процессе сборки приложение компилируется, при этом собираются все необходимые артефакты. Для передачи файлов конфигурации и скомпилированных ресурсов на удаленный сервер используются безопасные методы, такие как SSH.
Завершение развертывания с помощью системных инструментов Развертывание завершается обновлением системных конфигураций, в том числе заменой служебного файла systemd для запуска приложения. Конфиденциальные учетные данные надежно управляются с помощью GitHub secrets, что гарантирует отсутствие доступа к паролям. Процесс остается гибким с учетом потенциальных альтернатив, таких как контейнеризация, хотя подход systemd предпочтительнее из-за его простоты.
systemd: настройка автоматического запуска сервиса
02:47:27Процесс начинается с копирования тщательно подготовленного файла конфигурации systemd в нужный каталог перед запуском приложения. Создается специальная папка для хранения содержимого развертывания, в которой содержится четкое описание проекта и рабочий каталог. Файл конфигурации явно определяет команду запуска вместе с параметрами перезапуска, чтобы обеспечить автоматическое восстановление в случае сбоя в работе службы. В нем подчеркивается необходимость сохранения точных путей к файлам и имен для предотвращения неправильной настройки, что подчеркивает необходимость точности при изменении параметров. Наконец, все изменения проверяются и фиксируются, чтобы подтвердить, что развертывание завершено и является стабильным.
Запускаем и проверяем деплой через наш Workflow
02:48:58Развертывание начинается с отправки файла рабочего процесса, содержащего конфигурацию конкретного поставщика и системы, на GitHub, что запускает новый рабочий процесс, в котором отображается имя развертывания, указанное в конфигурации. Указанный тег содержит расширенный элемент интерфейса, позволяющий управлять локальными тегами или настраивать их на лету. Процесс последовательно копирует проект, проверяет его существование, устанавливает необходимые зависимости и, наконец, запускает приложение после почти двухминутного ожидания. Такое тщательное согласование команд обеспечивает плавное и наблюдаемое развертывание даже при наличии потенциальных проблем с конфигурацией.
GitHub Secrets: хранение приватной информации для деплоя
02:50:32В инструкции объясняется, как использовать функцию Secrets на GitHub для безопасного хранения личной информации, необходимой для развертывания приложений. В ней подробно описывается создание секрета для закрытого ключа, подчеркивается, что закрытый ключ должен оставаться конфиденциальным, в то время как общий доступ предоставляется только к открытому ключу. Этот процесс включает в себя переход к панели настроек для добавления секретных данных, гарантируя, что после сохранения конфиденциальные данные не будут просмотрены повторно, что позволяет поддерживать высокие стандарты безопасности.
Успешный деплой через наш Workflow
02:52:44Процесс начался с безопасного сохранения пароля доступа и установки версии системы на v01, что активировало автоматизированные действия в рабочем процессе. Приложение было безупречно развернуто на виртуальной машине, все шаги были выполнены корректно, включая правильную обработку закрытого ключа. Заключительные шаги включали копирование системного файла и запуск приложения, что обеспечивало плавное и успешное развертывание.
Тестируем наш сервис на удалённом сервере
02:53:18Служба, развернутая на удаленном сервере, была подтверждена работоспособной после того, как первоначальное успешное тестирование приложения показало, что развертывание завершено. При раннем запросе Postman произошел сбой из-за отсутствия информации о порту, что привело к ожидаемой ошибке. Использование правильного порта и добавление необходимых имени пользователя и пароля для авторизации устранили проблему, что привело к надлежащему ответу. Затем служба корректно сохранила URL-адреса и осуществила перенаправление, подтвердив свою предполагаемую функциональность.
Заключение
02:55:21Автоматизированное развертывание и надежное завершение проекта Служба реестра оснащена полностью написанным кодом, комплексными тестами и автоматизированным рабочим процессом, который позволяет развернуть проект на удаленном сервере через GitHub с использованием специального тега. Эта настройка объединяет разработку, тестирование и непрерывное развертывание в единый процесс. Полученный результат отражает значительные инженерные усилия, которые обеспечивают надежный и бесперебойный запуск проекта.
Заинтересованное сообщество и будущие возможности для контента Подробная информация, включая документацию по процессу и структуру кода, будет опубликована в статье с доступными ссылками. Ранний доступ предоставляется через эксклюзивные каналы и предстоящие прямые трансляции, предназначенные для решения вопросов и устранения неполадок в режиме реального времени. Активная сеть поддержки и выделенные чат-группы еще больше расширяют возможности сообщества для совместной работы и совместного решения проблем.