Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk melaksanakan pemajuan permintaan dan menambah fungsi kelewatan dalam Golang

Bagaimana untuk melaksanakan pemajuan permintaan dan menambah fungsi kelewatan dalam Golang

PHPz
PHPzasal
2023-04-05 10:29:29641semak imbas

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!

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