"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Golang이 첫 번째 작업을 해결하는 방법

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

2024-07-31에 게시됨
검색:863

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 



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

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

추신.

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

에서 찾을 수 있습니다.
릴리스 선언문 이 글은 https://dev.to/maxflower/how-golang-will-solve-your-first-working-task-3kpc?1에서 복제됩니다.1 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다. 그것
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3