Goのnet/httpでWebサーバを作って確認したこと

  • 投稿日:
  • by
  • カテゴリ:

Go のnet/httpパッケージを使うと簡単にWebサーバが構築できます。 実際に動作を確認した内容について備忘録としてメモしています。

並列処理可能

特に何も工夫せずにWebサーバとして動作させるだけで、goroutineによる並列処理が可能です。
動作確認のため、Apache Bench(ab)を使って確認しましたが、1000セッション同時に処理できていました。
動作確認の際は、リクエストの応答にsleepを1秒入れて1000セッションが10リクエストを発行しました。
すると、10秒くらいですべてのリクエストが処理されました。

動作確認に使ったコマンドは以下です。
実行すると約1秒毎に1000リクエストが処理されて、約10秒後に完了します。
結果のサマリを見ても、ほとんどのリクエストが約1秒で完了していました。

ab -c 1000 -n 10000 http://localhost:8080/

レスポンスのContent-Type自動設定

レスポンスをhtmlにすると、自動的にContent-Typeがtext/htmlになりました。
レスポンスをダブルクォートで囲んだ文字列にすると、中身がhtmlでもtext/plainになりました。
強制的に変更したいときは、以下のようにして指定できます。

w.Header().Set("Content-Type", "text/html; charset=utf-8")

コード

実際の動作確認の際は、不要なものを削除したりコメントアウトしたりしながら実施していますが、
上記の確認に必要なものはこれで足りると思います。

 package main

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

func main() {
 http.HandleFunc("/", uploader)
 log.Fatal(http.ListenAndServe(":8080", nil))
}

func uploader(w http.ResponseWriter, r *http.Request) {
 w.Header().Set("Content-type" , "text/html; charset=utf-8")
 time.sleep(1 * time.Second)
 fmt.Fprintf(w, "%s", html.EscapeString(r.URL.Path)
}