Rumah pembangunan bahagian belakang Golang Bagaimana untuk melaksanakan anti-proksi dalam golang

Bagaimana untuk melaksanakan anti-proksi dalam golang

Apr 25, 2023 am 09:11 AM

Golang ialah bahasa pengaturcaraan yang cekap dan ringkas Sokongan serentak yang kuat dan kelajuan penyusunan pantas menjadikannya disegani secara meluas dalam bidang pengaturcaraan rangkaian. Proksi terbalik ialah seni bina rangkaian biasa yang memajukan permintaan ke pelayan yang berbeza untuk mengoptimumkan trafik rangkaian dan meningkatkan prestasi sistem. Dalam artikel ini, kita akan membincangkan cara melaksanakan proksi terbalik menggunakan Golang.

  1. Apakah proksi terbalik?

Proksi terbalik ialah seni bina rangkaian yang memajukan permintaan pelanggan ke pelayan hujung belakang dan kemudian mengembalikan respons kepada klien. Tidak seperti proksi hadapan, proksi terbalik menyembunyikan identiti pelayan bahagian belakang dan menyediakan beberapa perkhidmatan tambahan kepada pelanggan, seperti pengimbangan beban, caching dan peningkatan keselamatan.

Inti proksi terbalik ialah pengimbangan beban. Apabila pelanggan memulakan permintaan kepada proksi terbalik, proksi terbalik mengedarkan permintaan kepada pelayan bahagian belakang yang paling sesuai untuk memaksimumkan kecekapan dan prestasi rangkaian. Selain itu, proksi terbalik boleh mengurangkan beban pelayan melalui caching dan boleh menyediakan ciri seperti penamatan SSL dan tembok api untuk meningkatkan keselamatan rangkaian.

  1. Menggunakan Golang untuk melaksanakan proksi terbalik

Menggunakan Golang untuk melaksanakan proksi terbalik adalah sangat mudah. Golang menyediakan perpustakaan standard "net/http/httputil", yang mengandungi beberapa fungsi dan struktur berguna yang boleh melaksanakan proksi terbalik dengan mudah.

Berikut ialah contoh proksi terbalik Golang yang mudah:

package main

import (
    "fmt"
    "log"
    "net/http"
    "net/http/httputil"
)

func main() {
    proxy := httputil.NewSingleHostReverseProxy(&url.URL{
        Scheme: "http",
        Host:   "localhost:8080",
    })
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        proxy.ServeHTTP(w, r)
    })
    log.Fatal(http.ListenAndServe(":3000", nil))
}
Salin selepas log masuk

Dalam contoh ini, kami menggunakan fungsi httputil.NewSingleHostReverseProxy untuk mencipta objek proksi terbalik dan memajukan permintaan kepada hos tempatan Pelabuhan 8080. Kami kemudian menggunakan fungsi http.HandleFunc untuk mengaitkan fungsi pengendali dengan laluan "/" dan memulakan proksi terbalik pada pelayan tempatan di port 3000.

  1. Konfigurasi lanjutan proksi songsang

Proksi songsang yang dicipta oleh kod di atas adalah sangat mudah, tetapi dalam aplikasi sebenar, kami mungkin memerlukan konfigurasi yang lebih lanjut untuk memenuhi keperluan tertentu . Berikut ialah beberapa contoh konfigurasi lanjutan untuk proksi terbalik:

  • Pengimbangan Beban

Pengimbangan beban ialah salah satu fungsi teras proksi terbalik. Golang menyediakan beberapa algoritma untuk mengagihkan permintaan secara sama rata antara berbilang pelayan bahagian belakang. Berikut ialah contoh pengimbangan beban mudah:

package main

import (
    "fmt"
    "log"
    "net/http"
    "net/http/httputil"
    "net/url"
)

func main() {
    backends := []*url.URL{
        &url.URL{
            Scheme: "http",
            Host:   "localhost:8080",
        },
        &url.URL{
            Scheme: "http",
            Host:   "localhost:8081",
        },
        &url.URL{
            Scheme: "http",
            Host:   "localhost:8082",
        },
    }

    proxy := httputil.NewSingleHostReverseProxy(backends[0])
    proxy.Transport = &http.Transport{
        Dial: func(network, address string) (net.Conn, error) {
            return net.DialTimeout(network, address, time.Second)
        },
        MaxIdleConns:        10,
        IdleConnTimeout:     30 * time.Second,
        DisableCompression:  true,
    }

    proxy.ModifyResponse = func(r *http.Response) error {
        r.Header.Set("X-Proxy", "Golang Reverse Proxy")
        return nil
    }

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        i := rand.Intn(len(backends))
        proxy.URL = backends[i]
        proxy.ServeHTTP(w, r)
    })

    log.Fatal(http.ListenAndServe(":3000", nil))
}
Salin selepas log masuk

Dalam contoh ini, kami menggunakan tatasusunan hujung belakang yang mengandungi tiga pelayan hujung belakang dan pilih satu secara rawak apabila permintaan tiba. Kami juga menyediakan fungsi ModifyResponse yang menambahkan pengepala "X-Proxy" pada pengepala respons dan menggunakan medan httputil.ReverseProxy.Transport tersuai untuk membenarkan sifat sambungan rangkaian tersuai. Akhirnya, kami mempunyai pelayan proksi terbalik yang mendengar pada port tempatan 3000.

  • Penamatan SSL

Penamatan SSL ialah teknik yang boleh meningkatkan prestasi dan keselamatan tapak web. Proksi terbalik boleh berfungsi sebagai titik penamatan SSL, menerima permintaan SSL daripada pelanggan dan memajukan permintaan HTTP yang tidak disulitkan ke pelayan bahagian belakang. Jika aplikasi anda menggunakan penyulitan SSL, teknologi ini boleh menjadi cara terbaik untuk mengurangkan beban pada pelayan. Berikut ialah contoh penamatan SSL mudah:

package main

import (
    "crypto/tls"
    "crypto/x509"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "net/http/httputil"
    "net/url"
)

func main() {
    cert, err := tls.LoadX509KeyPair("cert.pem", "key.pem")
    if err != nil {
        log.Fatalf("Failed to load keypair: %s", err)
    }

    certBytes, err := ioutil.ReadFile("cert.pem")
    if err != nil {
        log.Fatalf("Failed to read cert file: %s", err)
    }

    rootCAs := x509.NewCertPool()
    ok := rootCAs.AppendCertsFromPEM(certBytes)
    if !ok {
        log.Fatal("Failed to append root CA")
    }

    proxy := httputil.NewSingleHostReverseProxy(&url.URL{
        Scheme: "http",
        Host:   "localhost:8080",
    })
    proxy.Transport = &http.Transport{
        TLSClientConfig: &tls.Config{
            Certificates:       []tls.Certificate{cert},
            RootCAs:            rootCAs,
            InsecureSkipVerify: true,
        },
    }

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        proxy.ServeHTTP(w, r)
    })

    log.Fatal(http.ListenAndServeTLS(":3000", "cert.pem", "key.pem", nil))
}
Salin selepas log masuk

Dalam contoh ini kami memuatkan sijil TLS dan kunci peribadi daripada sistem fail menggunakan fungsi tls.LoadX509KeyPair dan membina akar menggunakan kumpulan Sijil fungsi x509.NewCertPool . Kami kemudiannya menetapkan sijil yang dimuatkan dan kumpulan sijil akar kepada medan httputil.ReverseProxy.Transport.TLSClientConfig untuk memastikan sambungan selamat kepada klien. Selain itu, kami menggunakan fungsi http.ListenAndServeTLS untuk menyokong sambungan HTTPS.

  • Caching

Caching ialah teknologi yang boleh meningkatkan prestasi proksi songsang dengan ketara. Proksi terbalik boleh menyimpan sumber statik bahagian hadapan, dengan itu mengurangkan tekanan pada pelayan. Berikut ialah contoh cache mudah:

package main

import (
    "bytes"
    "fmt"
    "log"
    "net/http"
    "net/http/httputil"
    "net/url"
    "time"
)

var cache = make(map[string]*bytes.Buffer)

func main() {
    proxy := httputil.NewSingleHostReverseProxy(&url.URL{
        Scheme: "http",
        Host:   "localhost:8080",
    })

    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        if r.Method == "GET" {
            if buf, ok := cache[r.URL.Path]; ok {
                w.Write(buf.Bytes())
                return
            }
        }

        if r.Method == "POST" || r.Method == "PUT" || r.Method == "DELETE" {
            delete(cache, r.URL.Path)
        }

        proxy.ServeHTTP(w, r)

        if r.Method == "GET" && r.Header.Get("Cache-Control") != "no-cache" {
            buf := bytes.NewBuffer(nil)
            buf.ReadFrom(w.(http.ResponseWriter))
            cache[r.URL.Path] = buf
        }
    })

    log.Fatal(http.ListenAndServe(":3000", nil))
}
Salin selepas log masuk

Dalam contoh ini, kami menggunakan cache pembolehubah peta untuk menyimpan hasil jawapan yang dicache. Apabila sumber yang sepadan wujud dalam cache, kami boleh terus mengembalikan hasilnya kepada klien tanpa meminta pelayan bahagian belakang. Dan kami menggunakan jenis asas *bytes.Buffer antara muka http.ResponseWriter untuk cache hasil respons. Selain itu, apabila kaedah permintaan ialah POST, PUT atau DELETE, kami memadamkan cache supaya data yang dikemas kini diambil daripada pelayan bahagian belakang. Akhir sekali, kami mengendalikan sama ada kami perlu menyimpan cache hasil respons dengan menyemak medan "Cache-Control" dalam pengepala permintaan.

  1. Kesimpulan

Proksi songsang ialah seni bina rangkaian berkuasa yang boleh meningkatkan prestasi dan keselamatan sistem dengan ketara dengan menyembunyikan pelayan bahagian belakang dan menyediakan pelbagai perkhidmatan seks tambahan. Sangat mudah untuk melaksanakan proksi terbalik menggunakan Golang menyediakan banyak fungsi dan struktur yang berguna untuk membuat pelayan proksi terbalik dengan mudah. Dalam artikel ini, kami memperkenalkan konsep asas proksi terbalik dan menunjukkan cara melaksanakan konfigurasi berbeza proksi terbalik lanjutan menggunakan Golang.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan anti-proksi dalam golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
3 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah? GO Language Pack Import: Apakah perbezaan antara garis bawah dan tanpa garis bawah? Mar 03, 2025 pm 05:17 PM

Artikel ini menerangkan mekanisme import pakej Go: Dinamakan import (mis., Import & quot; fmt & quot;) dan import kosong (mis., Import _ & quot; fmt & quot;). Dinamakan import membuat kandungan pakej boleh diakses, sementara import kosong hanya melaksanakan t

Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go? Bagaimana cara menukar senarai hasil pertanyaan mysql ke dalam slice struktur tersuai dalam bahasa Go? Mar 03, 2025 pm 05:18 PM

Artikel ini memperincikan penukaran yang cekap hasil pertanyaan MySQL ke dalam kepingan struct go. Ia menekankan menggunakan kaedah imbasan pangkalan data/SQL untuk prestasi optimum, mengelakkan parsing manual. Amalan terbaik untuk pemetaan medan struct menggunakan tag db dan robus

Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego? Bagaimana untuk melaksanakan pemindahan maklumat jangka pendek antara halaman dalam kerangka beego? Mar 03, 2025 pm 05:22 PM

Artikel ini menerangkan fungsi Newflash () Beego untuk pemindahan data antara halaman dalam aplikasi web. Ia memberi tumpuan kepada menggunakan NewFlash () untuk memaparkan mesej sementara (kejayaan, kesilapan, amaran) antara pengawal, memanfaatkan mekanisme sesi. Limita

Bagaimana saya menulis objek dan stub untuk ujian di GO? Bagaimana saya menulis objek dan stub untuk ujian di GO? Mar 10, 2025 pm 05:38 PM

Artikel ini menunjukkan penciptaan dan stub di GO untuk ujian unit. Ia menekankan penggunaan antara muka, menyediakan contoh pelaksanaan mengejek, dan membincangkan amalan terbaik seperti menjaga mocks fokus dan menggunakan perpustakaan penegasan. Articl

Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO? Bagaimana saya boleh menentukan kekangan jenis tersuai untuk generik di GO? Mar 10, 2025 pm 03:20 PM

Artikel ini meneroka kekangan jenis adat Go untuk generik. Ia memperincikan bagaimana antara muka menentukan keperluan jenis minimum untuk fungsi generik, meningkatkan keselamatan jenis dan kebolehgunaan semula kod. Artikel ini juga membincangkan batasan dan amalan terbaik

Bagaimana cara menulis fail dalam bahasa Go dengan mudah? Bagaimana cara menulis fail dalam bahasa Go dengan mudah? Mar 03, 2025 pm 05:15 PM

Artikel ini memperincikan penulisan fail yang cekap di GO, membandingkan OS.WriteFile (sesuai untuk fail kecil) dengan os.openfile dan buffered menulis (optimum untuk fail besar). Ia menekankan pengendalian ralat yang teguh, menggunakan penangguhan, dan memeriksa kesilapan tertentu.

Bagaimana anda menulis ujian unit di GO? Bagaimana anda menulis ujian unit di GO? Mar 21, 2025 pm 06:34 PM

Artikel ini membincangkan ujian unit menulis di GO, meliputi amalan terbaik, teknik mengejek, dan alat untuk pengurusan ujian yang cekap.

Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya? Bagaimana saya boleh menggunakan alat pengesanan untuk memahami aliran pelaksanaan aplikasi saya? Mar 10, 2025 pm 05:36 PM

Artikel ini meneroka menggunakan alat pengesanan untuk menganalisis aliran pelaksanaan aplikasi GO. Ia membincangkan teknik instrumentasi manual dan automatik, membandingkan alat seperti Jaeger, Zipkin, dan OpenTelemetry, dan menonjolkan visualisasi data yang berkesan

See all articles