golang實現一個簡易的http路由及其原理

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
  1. 前提:實現一個http路由必須要瞭解net/http包,主要是go/src/net/http/server.go檔案
  2. go實現一個web路由主要做三件事:
    • 監聽連接埠
    • 接收用戶端的請求
    • 為每個請求分配對應的handler(對應到php中就是將請求轉寄到相應的controller和action)

下面是一個簡單的實現路由的邏輯

package mainimport (        "fmt"        "net/http")func rootGateWay(w http.ResponseWriter, r *http.Request) {        println("Welcome to Chris's homepage! ")}func defaultGateWay(w http.ResponseWriter, r *http.Request) {        fmt.Fprintf(w, "Hello jingjing")        println("Welcome to Chris's homepage! ")}func main() {        http.HandleFunc("/", defaultGateWay)            http.ListenAndServe(":8080", nil)}//訪問http://host:8080/ 即可看到Hello jingjin

 由上面這個例子可知,我們只執行了兩步就完成了一個簡易的web路由,分別執行了HandleFunc以及ListenAndServe兩個函數。那這兩個函數中又分別執行了什麼操作呢

先看下面這段源碼:

//調用預設ServerMux的HandleFunc方法func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {                                                                                                                         DefaultServeMux.HandleFunc(pattern, handler)}//把方法handler轉換成HandlerFunc類型,即實現了Handler介面;再執行Handle方法func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {        mux.Handle(pattern, HandlerFunc(handler))}//路由器註冊一個handler給指定的partternfunc (mux *ServeMux) Handle(pattern string, handler Handler) {        ....}

不難看出,執行HandleFunc其實就是為某一規則的請求註冊處理器。

下面我們看看ListenAndServe都幹了什麼,看下面一段源碼:

func ListenAndServe(addr string, handler Handler) error {        //初始化一個Server Struct  賦值server的地址和Handler,不過Handler經常性為空白,因為會使                          //用DefaultServeMux        server := &Server{Addr: addr, Handler: handler}                                                                                                                                                return server.ListenAndServe()}//通過tcp網路監聽addr地址 func (srv *Server) ListenAndServe() error {        addr := srv.Addr        if addr == "" {                                                                                                                                                                                        addr = ":http"        }        ln, err := net.Listen("tcp", addr)        if err != nil {                return err        }        //for死迴圈一直接受http request, 每個請求開啟一個新的goroutine處理        return srv.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)})}

由此,我們可以簡單歸納出上文代碼所做的操作:

  • 為不同的url規則註冊路由handler  
  • 建立server並監聽連接埠
  • for迴圈一直接收request並並發處理

 

PS:  這一期的還是比較簡單,下一期爭取實現一個真正能滿足業務需求的http路由和web 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.