«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как Golang решит вашу первую рабочую задачу

Как Golang решит вашу первую рабочую задачу

Опубликовано 31 июля 2024 г.
Просматривать:745

Golang, или просто Go, стал известен как язык Go gopher. Если вы до сих пор не понимаете, почему суслик, вы можете найти удивительную историю талисмана в этой статье. Что ж, давайте начнем с самого начала: Golang стал известен как один из самых продуктивных языков программирования. В отличие от традиционных языков, таких как Java или Python, Go обеспечивает уникальный баланс между простотой написания кода и быстрым выполнением, ускоряя разработку и сокращая время отладки и тестирования. В этой статье будет рассмотрен реальный пример использования горутин и контекста в проекте, который взаимодействует с медленным и нестабильным микросервисом REST API.

Задание
Предположим, вы только что присоединились к команде, и ваш руководитель группы просит вас связать новый микросервис, написанный на Golang (например, риск-менеджер), с пользовательским микросервисом, доступным через REST API.

Проблема
Риск-менеджеру необходимо взаимодействовать с REST API, который может быть медленным и нестабильным, что требует от нас осторожной обработки таких запросов. Я буду использовать горутины для асинхронных HTTP-запросов и контекст для управления таймаутами запросов и обработки ошибок.

Решение

Использование горутин и контекста в Golang позволяет эффективно управлять параллельными задачами и обрабатывать медленные или нестабильные внешние API.

Первый шаг к интерпретации его в коде — создание API, я использовал условно-бесплатный сервис https://mockapi.io/ Удобно генерировать REST API с базовым набором сущностей, таких как пользователи.

Image description

Предположим, кто-то постарался изо всех сил, и в вашей компании есть внутренний сервис, который составляет список пользователей. Наша задача — повторно использовать список пользователей в новом риск-менеджере (структура пользовательских данных удовлетворяет контракту, описанному в 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://.mockapi.io/api/v1/users")
    if err != nil {
        return nil, err
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusOK {
        return nil, fmt.Errorf("failed to fetch users: %s", resp.Status)
    }

    var users []User
    if err := json.NewDecoder(resp.Body).Decode(&users); err != nil {
        return nil, err
    }

    return &users, nil
}

Чтобы управлять операцией, я буду использовать самый верхний родительский контекст для всех остальных контекстов — 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, по ссылке

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/maxflower/how-golang-will-solve-your-first-working-task-3kpc?1 Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить это
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3