Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk melaksanakan fungsi pemajuan permintaan di Golang

Bagaimana untuk melaksanakan fungsi pemajuan permintaan di Golang

PHPz
Lepaskan: 2023-04-05 10:50:36
asal
1328 orang telah melayarinya

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.

  1. Senario aplikasi pemajuan permintaan

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.

  1. Kaedah untuk melaksanakan 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)
   }
Salin selepas log masuk

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)
   }
Salin selepas log masuk

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.

  1. Ringkasan

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan