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)) }
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)) }
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)
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!