Pemajukan permintaan Golang merujuk kepada kaedah melaksanakan fungsi pemajuan permintaan dalam bahasa Golang. Pemajuan permintaan merujuk kepada pemajuan permintaan daripada klien ke pelayan lain untuk diproses, dan kemudian mengembalikan hasil pemprosesan kepada klien. Pemajuan permintaan membolehkan halaman hujung hadapan mengakses sumber pada pelayan yang berbeza, dengan itu meningkatkan ketersediaan dan kebolehskalaan aplikasi web. Dalam artikel ini, kami akan memperkenalkan cara melaksanakan fungsi pemajuan permintaan di Golang.
Dalam pembangunan sebenar, kita selalunya perlu berkongsi data atau melaksanakan tugas antara berbilang pelayan dan berbilang aplikasi. Pemajuan permintaan boleh mengedarkan permintaan pelanggan kepada berbilang pelayan untuk pemprosesan, meningkatkan penggunaan sumber dan kelajuan tindak balas. Pemajuan permintaan juga merupakan alat penting untuk membina aplikasi yang diedarkan Sama ada dalam bentuk pengimbangan beban atau pelayan proksi, permintaan boleh diedarkan melalui pemajuan permintaan.
2.1 Menggunakan proksi HTTP
Di Golang, anda boleh menggunakan struktur ReverseProxy dalam pakej net/http untuk melaksanakan Proksi HTTP untuk mencapai pemajuan permintaan. Struktur ReverseProxy boleh memajukan permintaan yang diterima ke URL lain untuk diproses dan mengembalikan hasilnya kepada klien selepas diproses. Berikut ialah kod sampel menggunakan ReverseProxy:
package main import ( "net/http" "net/http/httputil" "net/url" ) func main() { proxy := httputil.NewSingleHostReverseProxy(&url.URL{ Scheme: "http", Host: "localhost:8080", }) http.ListenAndServe(":80", proxy) }
Dalam kod sampel ini, kami mula-mula mencipta proksi objek proksi dan menetapkan alamat permintaan kepada http://localhost:8080. Kemudian, kami mengikat objek proksi ke pelayan HTTP dengan memanggil fungsi http.ListenAndServe, dengar pada port 80 dan tunggu permintaan klien. Apabila permintaan pelanggan diterima, objek proksi akan memajukan permintaan ke alamat hujung belakang untuk diproses, dan akhirnya mengembalikan hasil pemprosesan kepada pelanggan.
2.2 Menggunakan tinjauan pendapat untuk melaksanakan pengimbangan beban
Kaedah pelaksanaan pemajuan permintaan lain yang biasa ialah pemajuan permintaan berdasarkan pengimbangan beban. Pengimbangan beban merujuk kepada mengedarkan permintaan pelanggan kepada berbilang pelayan supaya beban pelayan adalah sekata yang mungkin dan meningkatkan ketersediaan dan kebolehskalaan sistem. Di Golang, algoritma tinjauan pendapat boleh digunakan untuk mencapai pengimbangan beban dan mengagihkan permintaan pelanggan secara sama rata kepada berbilang pelayan.
Berikut ialah contoh kod yang menggunakan tinjauan pendapat untuk mencapai pengimbangan beban:
package main import ( "fmt" "io/ioutil" "log" "math/rand" "net/http" "net/url" "time" ) // 定义所有可用的服务器列表 var proxyList = []string{ "http://localhost:8080", "http://localhost:8081", "http://localhost:8082", } func main() { proxy := &Proxy{ urls: make([]*url.URL, 0), current: 0, transport: &http.Transport{}, } for _, p := range proxyList { u, _ := url.Parse(p) proxy.urls = append(proxy.urls, u) } // 监听80端口 if err := http.ListenAndServe(":80", proxy); err != nil { panic(err) } } type Proxy struct { urls []*url.URL current int transport *http.Transport } func (p *Proxy) ServeHTTP(w http.ResponseWriter, r *http.Request) { // 随机获取一台服务器 u := p.urls[p.current] p.current = (p.current + 1) % len(p.urls) // 设置协议和主机 r.Header.Set("X-Forwarded-Host", r.Header.Get("Host")) r.Header.Set("X-Forwarded-Proto", "http") r.URL.Scheme = u.Scheme r.URL.Host = u.Host // 发送请求 res, err := p.transport.RoundTrip(r) if err != nil { log.Printf("%s", err) w.WriteHeader(http.StatusInternalServerError) return } defer res.Body.Close() // 将结果返回给客户端 for k, v := range res.Header { w.Header().Set(k, v[0]) } w.WriteHeader(res.StatusCode) body, err := ioutil.ReadAll(res.Body) if err != nil { log.Printf("%s", err) w.WriteHeader(http.StatusInternalServerError) return } fmt.Fprintf(w, "%s", body) }
Dalam kod sampel ini, kami mula-mula mentakrifkan proksi objek proksi, yang mengandungi semua Senarai alamat pelayan yang tersedia . Kemudian, kami mengikat objek proksi ke pelayan HTTP dengan memanggil fungsi http.ListenAndServe, dengar pada port 80 dan tunggu permintaan klien. Apabila permintaan pelanggan diterima, objek proksi secara rawak memilih pelayan untuk diproses dan menghantar permintaan itu kepada pelayan itu. Selepas pemprosesan selesai, objek proksi mengembalikan keputusan kepada klien.
Dalam artikel ini, kami memperkenalkan dua kaedah untuk melaksanakan fungsi pemajuan permintaan dalam bahasa Golang: menggunakan proksi HTTP dan permintaan berasaskan pengimbangan beban. Proksi HTTP ialah kaedah pelaksanaan pemajuan permintaan biasa yang boleh memajukan permintaan kepada pelayan lain untuk diproses, dengan itu meningkatkan penggunaan sumber dan kelajuan tindak balas. Pengimbangan beban ialah kaedah pemajuan permintaan yang praktikal dan praktikal Ia boleh mengedarkan permintaan pelanggan kepada berbilang pelayan untuk membuat beban pelayan sekata yang mungkin dan meningkatkan ketersediaan dan kebolehskalaan sistem. Sama ada menggunakan proksi HTTP atau pengimbangan beban, fungsi pemajuan permintaan boleh dilaksanakan untuk meningkatkan ketersediaan dan kebolehskalaan aplikasi web.
Atas ialah kandungan terperinci Bagaimana untuk melaksanakan fungsi pemajuan permintaan di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!