Golang이 첫 번째 작업을 해결하는 방법

WBOY
풀어 주다: 2024-07-17 21:50:35
원래의
468명이 탐색했습니다.

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://<use your id after sign up>.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 <- err
        return
    }
    usersChan <- user
}()

select {
case users := <-usersChan:
    fmt.Printf("Fetched users: %+v\n", users)
case err := <-errChan:
    fmt.Printf("Error fetching users: %v\n", err)
case <-ctx.Done():
    fmt.Println("Request timed out")
}
로그인 후 복사

예제에서는 두 개의 채널(usersChan을 사용하여 내부 서비스에서 받은 결과를 기록하고 두 번째 채널 errChan)을 사용하여 오류를 기록합니다.
느린 API의 응답이 2초 이내에 도착하지 않으면 오류를 감지하고 외부 레이어에서 이를 올바르게 처리할 수 있는 기회를 제공합니다.

위험 관리자를 사용한 이 실제 예에서 고루틴은 비동기 HTTP 요청을 활성화하는 한편 컨텍스트는 시간 초과 처리를 보장하며 이는 안정적이고 탄력적인 마이크로서비스를 구축하는 데 중요합니다.

추신

이 글은 기본적인 지식은 있지만 자신의 지식을 어디에 적용할 수 있을지 잘 모르는 초보 개발자를 대상으로 작성되었습니다. 귀하의 의견을 환영하며 귀하의 질문에 기꺼이 답변해 드리겠습니다.
Go 언어의 가장 기본적인 것들에 대한 실제 예제와 여러 다른 구현은 내 GitHub의 링크에서 찾을 수 있습니다

위 내용은 Golang이 첫 번째 작업을 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:dev.to
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!