想寫個web伺服器,用Go語言實現,需要有哪些前提知識呢?

3年的php底子,最近學習go,也知道erlang是用來做伺服器的,把http權威指南也看一半了,想用來練手寫一個伺服器卻不知從何入手,可能基礎太薄弱了。請問下該怎麼做?


給Web開發者量身定做的書 astaxie/build-web-application-with-golang


看到 @asta謝 答題, 忍不住也來回答下.除了使用 beego, gin 等框架, 我更推薦直接上標準庫.

下面是手把手教你如何使用標準庫寫一個 http server. 所有代碼 copy 後可以直接運行.

1. 最簡單的伺服器, 訪問 127.0.0.1:8080 返回 Hello World!

package main

import "net/http"

func HandlerIndex(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello World!"))
}

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

2. 如何處理 POST 請求, 訪問 127.0.0.1:8080/post

package main

import (
"io/ioutil"
"net/http"
)

func HandlerPost(w http.ResponseWriter, r *http.Request) {
if r.Method == "POST" {
content, err := ioutil.ReadAll(r.Body)
if err != nil {
w.WriteHeader(400)
w.Write([]byte(err.Error()))
return
}
w.WriteHeader(200)
w.Write(content)
return
}
}

func main() {
http.HandleFunc("/post", HandlerPost)
http.ListenAndServe("127.0.0.1:8080", nil)
}

3. 一個完整的, 線上運行的 http 伺服器長啥樣

package main

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

type Handler struct {
mux map[string]func(http.ResponseWriter, *http.Request)
}

func NewHandler() *Handler {
Handler := Handler{}
Handler.mux = make(map[string]func(http.ResponseWriter, *http.Request))
return Handler
}

func (Handler *Handler) Bind(pattern string, handler func(w http.ResponseWriter, r *http.Request)) {
Handler.mux[pattern] = handler
}

func (Handler *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
zero := time.Now()
defer func() {
duration := time.Since(zero)
log.Printf("%s [%.2f] %s
", r.Method, duration.Seconds(), r.URL)
}()
if h, ok := Handler.mux[r.URL.String()]; ok {
h(w, r)
} else {
w.WriteHeader(404)
}
}

func HandlerGet(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(200)
w.Write([]byte("Hello World!"))
}

func main() {
Handler := NewHandler()
Handler.Bind("/get", HandlerGet)
server := http.Server{
Addr: "127.0.0.1:8080",
Handler: Handler,
}
server.ListenAndServe()
}

4. 你可能想監控伺服器的性能 / qps

查看標準庫 expvar, pprof.

所有代碼均託管在 gist 上, 歡迎訪問. https://gist.github.com/Mohanson/4c61d93834d33dcaba11a471b2ff61ad


有好幾種途徑實現web程序:

1. 利用beego之類的強大框架

2. 用gorilla之類的庫,結合go的標準庫,自己構建簡單框架

3. 用go標準庫,自己搭建一個有session、cookie、路由、模板功能的http框架

都不難。

可以折中用第二種,既可以很好的理解整個http請求處理的流程,又不用寫太多代碼。


前提條件是興趣和不斷學習。

我最近在玩golang,看了 Go web programming, Go程序設計語言,Golang學習筆記,Go並發編程實戰等書。第一本書專門講golang+web,入門快。最好把第二本書看透,這是語言基礎。

然後可以參考gin / beego / ozzo / marcaron. 估計你還會用到xorm/gorm/ozzo dbx等資料庫套件。

我邊看,邊寫了一個middleware練手. 稍微改一下也可以用在其它框架。

ScottHuangZL/gin-jwt-sessiongithub.com圖標

進階有:JustForFunc 系列視頻,Francesc Campoy的作品,原google專家,最近跳槽到某創業公司當副總。 https://github.com/campoy


http

網路編程

go


所以我就說只會 JavaScript 啊 Java EE 啊 PHP 的就不要冒充程序員了……

先看看 Go 的 net 包和 net/http 包。基於 net 包里相對低級的介面,用 TCP 寫基本的 C/S 通信程序。如果需要權威參考書,Unix Network Programming 是唯一正確的選擇。另有 Beej『s Guide to Network Programming 方便入門。

之後去看 rfc1945 實現基本的 HTTP/1.0。再之後開始實現 HTTP/1.1 的各種細節的時候才需要 http 權威指南吧。


參照成熟框架beego,revel等


需要http的基礎知識。需要懂Go語言,包括語法,異常處理,並發機制,以及對類型抽象的支持。最後還需要熟悉一下golang的和http想關的類庫,以及容器相關的類庫。此外肯定需要熟悉golang的數組切片。然後在網上找個例子,這個時候,你應該基本能看懂例子了。


推薦閱讀:

怎麼在Linux操作系統搭建HTTP伺服器?
這種情況下,304還是200更好?
HTTP冪等性概念?
WebSocket 是什麼原理?為什麼可以實現持久連接?
關於ajax請求的安全,如何避免csrf類似的攻擊?

TAG:計算機網路 | HTTP | Go語言 |