Web アプリケーションを開発する場合、ロード バランシングやリクエスト キャッシュの実装など、処理のためにリクエストを別のサーバーに転送する必要がよくあります。 Golang は効率的な言語であり、その標準ライブラリの net/http パッケージはリクエストを転送するためのさまざまな方法を提供します。ここでは、Golang でリクエスト転送を実装し、遅延関数を追加する方法について説明します。
まず、ユーザーのリクエストを受信するための HTTP サーバーを作成する必要があります。デモンストレーションの便宜上、2 つの HTTP サーバーをローカルで起動してリクエストの転送をシミュレートします。サーバーのポートの 1 つは 8081 で、もう 1 つは 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)) }
次に、コードを変更してリクエスト転送を実装し、遅延関数を追加する必要があります。 Golang は非同期操作を適切にサポートしているため、ゴルーチンとチャネルを通じて遅延を実装できます。
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)) }
上記のコードでは、チャネルを作成し、ゴルーチンを使用して 1 秒の遅延を実装し、次に http.Get() を使用してリクエストを転送し、最後にチャネルがシグナルを送信するのを待ちました。つまり、遅延リクエストが完了すると、応答がユーザーに返されます。これにより、リクエストを転送する際に遅延を付加する機能が実現される。
ゴルーチンとチャネルを使用して遅延を実装することに加えて、以下に示すように、time パッケージで提供される time.Sleep() メソッドを使用することもできます。実際に運用環境では、長すぎる遅延によるアプリケーションのパフォーマンスの低下を避けるために、遅延時間に注意を払う必要があります。
以上がGolangでリクエスト転送を実装し、遅延機能を追加する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。