Bagaimana untuk menggunakan http.Transport untuk melaksanakan mekanisme cuba semula untuk permintaan khusus dalam Go?
Apabila membangunkan aplikasi web, kegagalan permintaan rangkaian sering dihadapi. Untuk meningkatkan kekukuhan dan kestabilan aplikasi anda, anda boleh mencuba semula secara automatik apabila kod ralat tertentu ditemui. Dalam bahasa Go, mekanisme cuba semula untuk permintaan tertentu boleh dilaksanakan melalui http.Transport.
Mula-mula, kita perlu mengimport pakej yang sepadan:
import ( "fmt" "net/http" "time" )
Seterusnya, kita perlu membuat Pengangkutan tersuai dan menetapkan sifat MaxIdleConnsPerHost
dan MaxIdleConns
untuk digunakan semula Connection: MaxIdleConnsPerHost
和MaxIdleConns
属性,以便重用连接:
transport := &http.Transport{ MaxIdleConnsPerHost: 10, MaxIdleConns: 100, }
然后,我们可以定义一个函数,用于发送HTTP请求并处理重试逻辑。在该函数中,我们可以使用http.Client
的Do方法发送HTTP请求,并根据返回的错误码进行重试:
func sendRequestWithRetry(url string) (*http.Response, error) { client := &http.Client{ Transport: transport, } for i := 0; i < 3; i++ { // 最多重试3次 resp, err := client.Get(url) if err != nil { if isRetryableError(err) { fmt.Printf("请求失败,正在进行第 %d 次重试... ", i+1) time.Sleep(1 * time.Second) continue } return nil, err } if resp.StatusCode == http.StatusOK { return resp, nil } resp.Body.Close() if isRetryableStatusCode(resp.StatusCode) { fmt.Printf("请求失败,正在进行第 %d 次重试... ", i+1) time.Sleep(1 * time.Second) continue } return nil, fmt.Errorf("请求失败,错误码:%d", resp.StatusCode) } return nil, fmt.Errorf("重试次数已达到上限") }
在重试逻辑中,我们可以定义两个辅助函数isRetryableError
和isRetryableStatusCode
func isRetryableError(err error) bool { // 判断是否为连接错误等常见错误 // 可根据实际需求进行修改 if err == io.EOF || strings.Contains(err.Error(), "connection reset by peer") || strings.Contains(err.Error(), "no such host") { return true } return false } func isRetryableStatusCode(code int) bool { // 判断是否为可重试的HTTP状态码 // 可根据实际需求进行修改 if code >= 500 || code == http.StatusBadGateway || code == http.StatusServiceUnavailable { return true } return false }
http.Client
untuk menghantar permintaan HTTP dan cuba semula berdasarkan kod ralat yang dikembalikan: func main() { resp, err := sendRequestWithRetry("http://example.com") if err != nil { fmt.Println("请求失败:", err) } else { fmt.Println("请求成功:", resp.Status) resp.Body.Close() } }
isRetryableError
dan isRetryableStatusCode
digunakan untuk menentukan sama ada percubaan semula perlu dilakukan. Mengikut keperluan sebenar, kita boleh menetapkan kod ralat dan kod status yang boleh dicuba semula: rrreee
Akhir sekali, kita boleh menggunakan fungsi di atas untuk menghantar permintaan HTTP dan mencuba semula: 🎜rrreee🎜Contoh kod di atas menunjukkan cara menggunakan http dalam Go . Transport melaksanakan mekanisme cuba semula untuk permintaan tertentu. Dengan menyesuaikan Pengangkutan dan menggabungkannya dengan logik cuba semula yang sesuai, kami boleh membolehkan aplikasi mengendalikan kegagalan permintaan rangkaian dengan lebih baik dan meningkatkan kebolehpercayaan dan kestabilan aplikasi. 🎜Atas ialah kandungan terperinci Bagaimana untuk melaksanakan mekanisme cuba semula untuk permintaan khusus menggunakan http.Transport in Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!