Bagaimana untuk melaksanakan pemajuan permintaan dan menambah fungsi kelewatan dalam Golang

PHPz
Lepaskan: 2023-04-05 10:42:06
asal
594 orang telah melayarinya

Apabila membangunkan aplikasi web, kami selalunya perlu memajukan permintaan ke pelayan lain untuk diproses, seperti melaksanakan pengimbangan beban, meminta caching, dsb. Golang ialah bahasa yang cekap, dan pakej net/http dalam perpustakaan standardnya menyediakan pelbagai cara untuk memajukan permintaan. Di sini, mari kita bincangkan cara melaksanakan pemajuan permintaan dan menambah fungsi kelewatan dalam Golang.

Pertama, kita perlu mencipta Pelayan HTTP untuk menerima permintaan pengguna. Untuk kemudahan demonstrasi, saya akan mensimulasikan pemajuan permintaan dengan memulakan dua Pelayan HTTP secara tempatan. Salah satu port Server ialah 8081 dan satu lagi ialah 8082.

package main

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

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        log.Printf("request from: %s\n", r.RemoteAddr)
        resp, err := http.Get("http://127.0.0.1:8081")
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
        defer resp.Body.Close()

        _, err = w.Write([]byte(fmt.Sprintf("[%s]: %s", r.RemoteAddr, resp.Status)))
        if err != nil {
            log.Printf("failed to write response: %s", err.Error())
        }
    })

    addr := ":8080"
    log.Printf("listening on %s...\n", addr)
    log.Fatal(http.ListenAndServe(addr, nil))
}
Salin selepas log masuk

Seterusnya, kita perlu mengubah suai kod untuk melaksanakan pemajuan permintaan dan menambah fungsi kelewatan. Memandangkan Golang mempunyai sokongan yang baik untuk operasi tak segerak, kami boleh melaksanakan kelewatan melalui goroutine dan saluran.

package main

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

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        log.Printf("request from: %s\n", r.RemoteAddr)

        // 使用channel来实现延时
        done := make(chan bool)
        go func() {
            time.Sleep(1 * time.Second)
            done <- true
        }()

        // 请求转发
        resp, err := http.Get("http://127.0.0.1:8081")
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
        defer resp.Body.Close()

        _, err = w.Write([]byte(fmt.Sprintf("[%s]: %s", r.RemoteAddr, resp.Status)))
        if err != nil {
            log.Printf("failed to write response: %s", err.Error())
        }

        // 等待延时完成
        <-done
    })

    addr := ":8080"
    log.Printf("listening on %s...\n", addr)
    log.Fatal(http.ListenAndServe(addr, nil))
}
Salin selepas log masuk

Dalam kod di atas, kami mencipta saluran, menggunakan goroutine untuk melaksanakan kelewatan 1 saat, kemudian gunakan http.Get() untuk memajukan permintaan, dan akhirnya tunggu saluran menghantar isyarat . Iaitu, respons dikembalikan kepada pengguna hanya selepas kelewatan selesai. Dengan cara ini, fungsi menambah kelewatan semasa memajukan permintaan direalisasikan.

Selain menggunakan goroutine dan saluran untuk melaksanakan kelewatan, kami juga boleh menggunakan kaedah time.Sleep() yang disediakan dalam pakej masa, seperti yang ditunjukkan di bawah:

time.Sleep(1 * time.Second)
Salin selepas log masuk

Sepatutnya menyatakan bahawa, Dalam persekitaran pengeluaran sebenar, kita perlu memberi perhatian kepada masa kelewatan untuk mengelakkan masalah kemerosotan prestasi aplikasi akibat kelewatan yang terlalu lama.

Atas ialah kandungan terperinci Bagaimana untuk melaksanakan pemajuan permintaan dan menambah fungsi kelewatan dalam 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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!