Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Penjelasan terperinci tentang klien HTTP dan kumpulan sambungan rangka kerja Gin

Penjelasan terperinci tentang klien HTTP dan kumpulan sambungan rangka kerja Gin

WBOY
WBOYasal
2023-06-23 10:19:482501semak imbas

Rangka kerja Gin ialah rangka kerja web ringan yang direka bentuk untuk menyediakan model pemprosesan web berprestasi tinggi dan ketersediaan tinggi. Dalam rangka kerja Gin, klien HTTP dan kumpulan sambungan adalah komponen yang sangat penting. Artikel ini akan menyelidiki butiran pelaksanaan asas klien HTTP dan kumpulan sambungan dalam rangka kerja Gin.

1. Pelanggan HTTP

Klien HTTP ialah komponen teras dalam rangka kerja Gin untuk menghantar permintaan HTTP. Dalam rangka kerja Gin, terdapat banyak pelaksanaan klien HTTP yang berbeza, tetapi dua yang paling biasa digunakan ialah pakej net/http dan pakej fasthttp.

  1. net/http

Menggunakan permintaan net/http memerlukan mewujudkan sambungan TCP, menghantar permintaan HTTP, membaca respons pelayan dan akhirnya menutup sambungan TCP. Proses ini boleh menyebabkan kehilangan prestasi tertentu. Jika anda perlu menghantar sejumlah besar permintaan, disyorkan untuk menggunakan pengumpulan sambungan untuk meningkatkan prestasi.

Berikut ialah contoh menggunakan pakej net/http untuk menghantar permintaan HTTP ke Baidu dan mendapatkan respons:

func main() {
    resp, err := http.Get("http://www.baidu.com")
    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))
}
  1. fasthttp

fasthttp ialah klien dan pelayan HTTP berprestasi tinggi, lebih pantas daripada pakej net/http. Ia ditulis dalam Go dan boleh mengendalikan sejumlah besar permintaan dengan cepat. Ia juga mempunyai pelaksanaan kolam sambungan.

Berikut ialah contoh menggunakan pakej fasthttp untuk menghantar permintaan HTTP ke Baidu dan mendapatkan respons:

func main() {
    client := &fasthttp.Client{}
    req := fasthttp.AcquireRequest()
    defer fasthttp.ReleaseRequest(req)
    req.SetRequestURI("http://www.baidu.com")
    resp := fasthttp.AcquireResponse()
    defer fasthttp.ReleaseResponse(resp)
    err := client.Do(req, resp)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(resp.String())
}
  1. Perbandingan prestasi

The berikut menggunakan hasil Ujian HTTP berbeza bagi pakej pelanggan yang membuat 1,000 permintaan serentak kepada Baidu pada masa yang sama:

Alat ujian: ApacheBench
Konfigurasi persekitaran ujian: MacBook Air 13-inci RAM 8G
Ujian keputusan: (unit: saat)

  • pakej bersih/http: purata masa tindak balas 6.90s, masa tindak balas maksimum 19.87s
  • pakej fasthttp: purata masa tindak balas 2.87s, masa tindak balas maksimum 10.14s

Dapat dilihat bahawa menggunakan pakej fasthttp untuk menghantar permintaan HTTP adalah lebih pantas daripada pakej net/http.

2. Kumpulan sambungan

Kolam sambungan ialah komponen utama untuk meningkatkan prestasi klien HTTP. Semasa proses permintaan klien HTTP, kos masa yang diperlukan untuk mewujudkan dan mengekalkan sambungan TCP adalah agak tinggi. Kumpulan sambungan boleh menggunakan semula sambungan TCP yang telah ditetapkan, mengurangkan kos masa setiap permintaan dan meningkatkan prestasi.

Dalam rangka kerja Gin, terdapat banyak kaedah pelaksanaan penggabungan sambungan yang berbeza Mari perkenalkan mereka masing-masing di bawah.

  1. net/http

Dalam pakej net/http, pengumpulan sambungan didayakan secara lalai. Ia menggunakan mekanisme TCPKeepAlive, yang akan memastikan sambungan TCP terbuka selepas sambungan TCP selesai sehingga sambungan semasa ditutup atau ditutup oleh pelayan. Saiz kumpulan sambungan boleh dikawal dengan mengubah suai struktur Pengangkutan:

transport := &http.Transport{
    MaxIdleConns:    10,
    IdleConnTimeout: 30 * time.Second,
}
httpClient := &http.Client{
    Transport: transport,
}

MaxIdleConns mewakili bilangan maksimum sambungan melahu dan IdleConnTimeout mewakili masa melahu maksimum sambungan melahu. Saiz kolam sambungan boleh dikawal dengan mengubah suai kedua-dua parameter ini.

  1. fasthttp

Dalam pakej fasthttp, kumpulan sambungan dilaksanakan sedikit berbeza daripada pakej net/http. Ia dilaksanakan melalui struktur Klien, dan saiz kolam sambungan boleh ditukar dengan menukar parameter MaxConnsPerHost:

client := &fasthttp.Client{
    MaxConnsPerHost: 100,
}

MaxConnsPerHost mewakili bilangan maksimum sambungan yang diselenggara oleh setiap hos. Saiz kolam sambungan boleh ditukar dengan menukar parameter ini.

  1. Perbandingan prestasi

Berikut ialah keputusan ujian menggunakan kumpulan sambungan berbeza untuk meminta Baidu 1000 kali serentak:

Alat ujian: ApacheBench
Konfigurasi persekitaran ujian: MacBook Air 13-inci RAM 8G
Keputusan ujian: (Unit: saat)

  • kumpulan sambungan didayakan pakej bersih/http: purata masa tindak balas 7.63s, masa tindak balas maksimum 18.59 s
  • Pakej fasthttp membolehkan kumpulan sambungan: purata masa tindak balas ialah 3.12s, masa tindak balas maksimum ialah 9.90s

Ia boleh dilihat bahawa kumpulan sambungan menggunakan fasthttp pakej adalah lebih baik daripada kumpulan sambungan pakej net/http cepat.

Kesimpulan

Selepas ujian, klien HTTP dan kumpulan sambungan pakej fasthttp mempunyai prestasi yang lebih tinggi daripada pakej net/http, terutamanya apabila mengendalikan sejumlah besar permintaan. Oleh itu, apabila menggunakan rangka kerja Gin untuk menghantar permintaan HTTP, kami mengesyorkan menggunakan pakej fasthttp untuk meningkatkan prestasi. Pada masa yang sama, anda perlu memberi perhatian kepada tetapan kumpulan sambungan untuk menggunakan sepenuhnya faedah penggunaan semula kumpulan sambungan TCP.

Atas ialah kandungan terperinci Penjelasan terperinci tentang klien HTTP dan kumpulan sambungan rangka kerja Gin. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn