Golang, или просто Go, стал известен как язык Go gopher. Если вы до сих пор не понимаете, почему суслик, вы можете найти удивительную историю талисмана в этой статье. Что ж, давайте начнем с самого начала: Golang стал известен как один из самых продуктивных языков программирования. В отличие от традиционных языков, таких как Java или Python, Go обеспечивает уникальный баланс между простотой написания кода и быстрым выполнением, ускоряя разработку и сокращая время отладки и тестирования. В этой статье будет рассмотрен реальный пример использования горутин и контекста в проекте, который взаимодействует с медленным и нестабильным микросервисом REST API.
Задание
Предположим, вы только что присоединились к команде, и ваш руководитель группы просит вас связать новый микросервис, написанный на Golang (например, риск-менеджер), с пользовательским микросервисом, доступным через REST API.
Проблема
Риск-менеджеру необходимо взаимодействовать с REST API, который может быть медленным и нестабильным, что требует от нас осторожной обработки таких запросов. Я буду использовать горутины для асинхронных HTTP-запросов и контекст для управления таймаутами запросов и обработки ошибок.
Решение
Использование горутин и контекста в Golang позволяет эффективно управлять параллельными задачами и обрабатывать медленные или нестабильные внешние API.
Первый шаг к интерпретации его в коде — создание API, я использовал условно-бесплатный сервис https://mockapi.io/ Удобно генерировать REST API с базовым набором сущностей, таких как пользователи.
Предположим, кто-то постарался изо всех сил, и в вашей компании есть внутренний сервис, который составляет список пользователей. Наша задача — повторно использовать список пользователей в новом риск-менеджере (структура пользовательских данных удовлетворяет контракту, описанному в mockapi.io). Код ниже выполняет запрос, обрабатывает тело и выдает либо список пользователей, либо соответствующую ошибку.
type User struct { CreatedAt string Name string Avatar string Id string } // Original slow request func fetchUsers(ctx context.Context) (*[]User, error) { resp, err := http.Get("https://
Чтобы управлять операцией, я буду использовать самый верхний родительский контекст для всех остальных контекстов — context.Background. Я дополню этот контекст новыми данными, в данном случае таймаутом — context.WithTimeout, который я определю как 2 секунды. Подробнее о работе с контекстами в Go можно прочитать в этой статье.
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() usersChan := make(chan *[]User) errChan := make(chan error) go func() { users, err := fetchUsers(ctx) if err != nil { errChanВ примере я использую два канала — userChan для записи результата, полученного от нашего внутреннего сервиса, и второй канал errChan — для записи ошибки.
Если ответ от медленного API не приходит в течение 2 секунд, мы обнаруживаем ошибку и даем возможность корректно обработать ее на внешнем уровне.В этом практическом примере с риск-менеджером горутины включили асинхронные HTTP-запросы, а контекст обеспечил обработку тайм-аутов, что критически важно для создания надежных и отказоустойчивых микросервисов.
P.S.
Эта статья предназначена для начинающих разработчиков, которые имеют базовые знания, но слабо представляют, где они могут применить свои знания. Буду рад вашим отзывам и буду рад ответить на ваши вопросы.
Рабочий пример и несколько других реализаций самых базовых вещей на языке Go можно найти на моем GitHub, по ссылке
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3