ホームページ >バックエンド開発 >Golang >Go 言語 http.Transport でのタイムアウト管理のベスト プラクティス

Go 言語 http.Transport でのタイムアウト管理のベスト プラクティス

WBOY
WBOYオリジナル
2023-07-23 12:18:201217ブラウズ

Go 言語でのタイムアウト管理のベスト プラクティス http.Transport

はじめに:
Go 言語を使用してネットワーク リクエストを行う場合、リクエストとリソースのブロックを避けるためにタイムアウトを合理的に設定することが非常に重要です無駄の。この記事では、Go 言語でのタイムアウト管理に http.Transport を使用するベスト プラクティスを紹介し、参考用のサンプル コードをいくつか紹介します。

  1. タイムアウトの設定:
    http.Transport を使用してリクエストを送信する前に、いくつかのメソッドを使用してリクエストのタイムアウトを設定できます。たとえば、http.Client 構造の Timeout フィールドを使用して、リクエスト全体のタイムアウトを設定できます。たとえば、次のようになります。

    client := &http.Client{
     Timeout: time.Second * 10, // 设置超时时间为10秒
    }

    上記のコードでは、 , Timeout フィールドは、リクエスト全体のタイムアウトが 10 秒であることを示します。リクエストの処理時間が 10 秒を超えると、リクエストは net.DialTimeout エラーを返します。

さらに、http.Transport## を使用してリクエストを送信する前に、http.RequestTimeout を使用することもできます。 # 単一リクエストのタイムアウトを設定するフィールド。例:

req, err := http.NewRequest("GET", "http://example.com", nil)
if err != nil {
    log.Fatal(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("User-Agent", "MyClient/1.0")
req.Timeout = time.Second * 5 // 设置单个请求的超时时间为5秒

resp, err := client.Do(req)
if err != nil {
    log.Fatal(err)
}
defer resp.Body.Close()

body, err := ioutil.ReadAll(resp.Body)
if err != nil {
    log.Fatal(err)
}

fmt.Println(string(body))

上記のコードでは、

req.Timeout を通じて 1 つのリクエストのタイムアウトを 5 秒に設定します。リクエストの処理時間が 5 秒を超えると、リクエストはnet.DialTimeout エラーが返されます。

  1. タイムアウト処理:

    リクエストがタイムアウトした場合、このエラーを合理的に処理する必要があります。一般的な方法は、
    context パッケージを使用してリクエストのタイムアウトを制御することです。タイムアウトを指定した context.Context を作成し、それをリクエストの http.Request に渡すことができます。例:

    ctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
    defer cancel()
    
    req, err := http.NewRequestWithContext(ctx, "GET", "http://example.com", nil)
    if err != nil {
     log.Fatal(err)
    }

    上記のコードでは、

    context.WithTimeout を通じて 10 秒のタイムアウトを持つ context.Context を作成し、http を使用します。 .NewRequestWithContextContext をリクエストに渡します。

リクエストを送信するとき、

context.Context を使用してタイムアウト イベントを監視できます。例:

resp, err := client.Do(req.WithContext(ctx))
if err != nil {
   if err == context.DeadlineExceeded {
       log.Println("请求超时")
       return
   }
   log.Fatal(err)
}
defer resp.Body.Close()

body, err := ioutil.ReadAll(resp.Body)
if err != nil {
    log.Fatal(err)
}

fmt.Println(string(body))

上記のコードでは、リクエストのタイムアウトが発生すると、エラーの種類が

context.DeadlineExceeded であるかどうかを判断してタイムアウト イベントを処理します。タイムアウト イベントの場合は、エラー情報を返す、リクエストを再試行するなど、対応する処理操作を実行できます。

概要:

Go 言語を使用してネットワーク リクエストを行う場合、適切なタイムアウトを設定することが非常に重要です。この記事では、Go 言語で http.Transport を使用したタイムアウト管理のベスト プラクティスを紹介し、いくつかのサンプル コードを提供します。タイムアウトを適切に設定し、context.Context を使用してタイムアウト イベントを監視することにより、リクエストのタイムアウトをより適切に管理し、プログラムの安定性と信頼性を向上させることができます。

参考文献:

    https://golang.org/pkg/net/http/
  • https://golang.org/pkg/net/ http /#クライアント
  • https://golang.org/pkg/context/
  • https://github.com/dgrijalva/jwt-go

以上がGo 言語 http.Transport でのタイムアウト管理のベスト プラクティスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。