關於 net/http
包的幾點總結:
net/http
本身基於goroutine實現, 通過新建協程處理新的連接任務;- 默認是長連接: net/http客戶端發起請求時header標記HTTP/1.1;
- 連接可複用:默認創建連接池;
- 關於連接池使用:池中找不到空閒連接時,會重新new一個連接,而不會阻塞等待一個連接;
- 關於連接斷開:如果對端關閉連接,由於Go Runtime會在底層進行epoll wait,監聽close事件並關閉相關fd資源,上層應用可以被告知哪些連接已關閉,從而進行相關的邏輯處理;
- 關於
time_wait
與close_wait
:收到對方的fin請求, 內核會將連接置爲close_wait
狀態;主動發起關閉連接請求的一方,會將連接置爲time_wait
狀態;
以下爲net/http
的極簡demo:
package main
import (
"fmt"
"log"
"net/http"
)
func HelloHandler(w http.ResponseWriter, req *http.Request) {
fmt.Fprintf(w, "Hello, world!\n")
}
func main() {
http.HandleFunc("/hello", HelloHandler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
其中開啓服務監聽的流程如下圖所示: