Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Penjelasan terperinci tentang proksi terbalik dan pengimbangan beban dalam rangka kerja Gin

Penjelasan terperinci tentang proksi terbalik dan pengimbangan beban dalam rangka kerja Gin

WBOY
WBOYasal
2023-06-22 21:43:381852semak imbas

Rangka kerja Gin ialah rangka kerja pembangunan web untuk Golang, yang digunakan oleh banyak projek. Apabila projek kami berkembang ke skala tertentu, cara meningkatkan ketersediaan dan prestasi perkhidmatan kami menjadi topik penting. Pada masa ini, proksi terbalik dan pengimbangan beban menjadi sangat penting. Artikel ini akan membincangkan cara menggunakan proksi terbalik dan pengimbangan beban dalam rangka kerja Gin untuk meningkatkan ketersediaan dan prestasi perkhidmatan kami.

  1. Proksi songsang

Proksi songsang bermakna perkhidmatan kami diletakkan di belakang pelayan proksi Permintaan klien sampai ke pelayan proksi dahulu, dan kemudian pelayan proksi Permintaan itu dimajukan kepada pelayan yang sebenarnya menyediakan perkhidmatan, dan respons pelayan diterima dan dikembalikan kepada klien. Dengan cara ini, pelanggan hanya perlu mengetahui alamat pelayan proksi dan tidak perlu mengetahui pelayan yang sebenarnya menyediakan perkhidmatan ini dengan berkesan boleh melindungi dan menyembunyikan pelayan, dan pada masa yang sama meningkatkan ketersediaan dan prestasi perkhidmatan tersebut.

Dalam rangka kerja Gin, kami boleh melaksanakan proksi terbalik melalui MiddleWare. MiddleWare ialah konsep yang sangat penting dalam rangka kerja Gin Ia adalah perisian tengah yang memintas dan memproses permintaan sebelum ia mencapai fungsi pemprosesan. Berikut ialah contoh MiddleWare bagi proksi terbalik:

func ReverseProxyMiddleware(target *url.URL) gin.HandlerFunc {
    return func(c *gin.Context) {
        director := func(req *http.Request) {
            req.URL.Scheme = target.Scheme
            req.URL.Host = target.Host
            req.URL.Path = path.Join(target.Path, "/api", c.Param("action"))
        }
        proxy := &httputil.ReverseProxy{Director: director}
        proxy.ServeHTTP(c.Writer, c.Request)
    }
}

Dalam kod di atas, kami mula-mula mentakrifkan fungsi ReverseProxyMiddleware, yang menerima alamat pelayan proksi dan kemudian mengembalikan fungsi jenis gin.HandlerFunc. Di dalam fungsi ini, kami mula-mula menentukan fungsi pengarah untuk mengubah suai alamat URL permintaan dan mengubah hala permintaan ke alamat pelayan proksi. Kemudian, kami menggunakan struktur ReverseProxy untuk memajukan permintaan kepada pelayan yang sebenarnya menyediakan perkhidmatan tersebut.

Seterusnya, gunakan MiddleWare dalam penghala kami untuk memintas permintaan, dan gunakan proksi terbalik untuk memajukan permintaan ke pelayan sebenar:

r := gin.Default()

// 假设代理服务器地址为:http://localhost:8080
proxyUrl, _ := url.Parse("http://localhost:8080")

r.GET("/api/:action", ReverseProxyMiddleware(proxyUrl))

Dalam kod di atas, kami menggunakan kaedah GET A penghala ditakrifkan dan alamat permintaan "/api/:action" terikat pada middleware ReverseProxyMiddleware Apabila permintaan tiba, middleware akan menghantar permintaan kepada pelayan proksi dan mengubah hala ke pelayan yang sebenarnya menyediakan perkhidmatan.

  1. Pengimbangan Beban

Pengimbangan beban merujuk kepada memperuntukkan permintaan pelanggan kepada berbilang pelayan untuk mencapai pemprosesan permintaan serentak dan meningkatkan ketersediaan dan prestasi perkhidmatan. Apabila pelayan gagal, pengimbangan beban secara automatik boleh mengedarkan permintaan kepada pelayan lain untuk memastikan ketersediaan perkhidmatan.

Dalam rangka kerja Gin, kami boleh mencapai pengimbangan beban dengan menggunakan proksi terbalik yang digabungkan dengan tinjauan DNS atau perisian pengimbangan beban pihak ketiga. Berikut ialah contoh pengimbangan beban round robin DNS:

var addr = flag.String("addr", "192.168.0.100", "load balance server address")

func main() {
    r := gin.Default()

    // 定义DNS轮询的负载均衡地址列表
    addrs := []string{"192.168.0.101:8080", "192.168.0.102:8080", "192.168.0.103:8080"}

    // 定义负载均衡路由
    r.GET("/api/:action", func(c *gin.Context) {
        raddr := addrs[rand.Intn(len(addrs))]
        url, _ := url.Parse(fmt.Sprintf("http://%s%s", raddr, c.Request.URL.Path))
        proxy := httputil.NewSingleHostReverseProxy(url)
        proxy.ServeHTTP(c.Writer, c.Request)
    })

    r.Run(*addr)
}

Dalam kod di atas, kami mula-mula mentakrifkan beberapa alamat pelayan, dan kemudian menentukan laluan pengimbangan beban untuk meminta alamat "/api/:action" Bind kepada fungsi penghalaan. Dalam fungsi penghalaan ini, kami menggunakan fungsi rand.Intn untuk memilih secara rawak alamat pelayan yang sebenarnya menyediakan perkhidmatan dan menggunakan struktur httputil.NewSingleHostReverseProxy untuk memajukan permintaan kepada pelayan.

Perlu diambil perhatian bahawa dalam kod di atas kami menggunakan pakej bendera untuk menghuraikan parameter baris arahan. Semasa menjalankan program, anda boleh menentukan alamat tempat perkhidmatan mendengar melalui parameter "-addr".

Ringkasnya, proksi terbalik dan pengimbangan beban dalam rangka kerja Gin adalah cara penting untuk meningkatkan ketersediaan dan prestasi perkhidmatan. Kami boleh menggunakan MiddleWare dan ReverseProxy untuk melaksanakan proksi terbalik, atau menggabungkannya dengan tinjauan DNS atau perisian pengimbangan beban pihak ketiga untuk mencapai pengimbangan beban. Dalam aplikasi praktikal, kita perlu memilih kaedah pelaksanaan yang sesuai mengikut keperluan kita sendiri untuk mencapai hasil yang optimum.

Atas ialah kandungan terperinci Penjelasan terperinci tentang proksi terbalik dan pengimbangan beban dalam 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