7天用Go動手寫/從零實現Web框架Gee

gee.jpg

設計一個框架

大部分時候,咱們須要實現一個 Web 應用,第一反應是應該使用哪一個框架。不一樣的框架設計理念和提供的功能有很大的差異。好比 Python 語言的 djangoflask,前者大而全,後者小而美。Go語言/golang 也是如此,新框架層出不窮,好比BeegoGinIris等。那爲何不直接使用標準庫,而必須使用框架呢?在設計一個框架以前,咱們須要回答框架核心爲咱們解決了什麼問題。只有理解了這一點,才能想明白咱們須要在框架中實現什麼功能。html

咱們先看看標準庫net/http如何處理一個請求。git

func main() {
    http.HandleFunc("/", handler)
    http.HandleFunc("/count", counter)
    log.Fatal(http.ListenAndServe("localhost:8000", nil))
}

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "URL.Path = %q\n", r.URL.Path)
}

net/http提供了基礎的Web功能,即監聽端口,映射靜態路由,解析HTTP報文。一些Web開發中簡單的需求並不支持,須要手工實現。github

  • 動態路由:例如hello/:namehello/*這類的規則。
  • 鑑權:沒有分組/統一鑑權的能力,須要在每一個路由映射的handler中實現。
  • 模板:沒有統一簡化的HTML機制。
  • ...

當咱們離開框架,使用基礎庫時,須要頻繁手工處理的地方,就是框架的價值所在。但並非每個頻繁處理的地方都適合在框架中完成。Python有一個很著名的Web框架,名叫bottle,整個框架由bottle.py一個文件構成,共4400行,能夠說是一個微框架。那麼理解這個微框架提供的特性,能夠幫助咱們理解框架的核心能力。golang

  • 路由(Routing):將請求映射到函數,支持動態路由。例如'/hello/:name
  • 模板(Templates):使用內置模板引擎提供模板渲染機制。
  • 工具集(Utilites):提供對 cookies,headers 等處理機制。
  • 插件(Plugin):Bottle自己功能有限,但提供了插件機制。能夠選擇安裝到全局,也能夠只針對某幾個路由生效。
  • ...

Gee 框架

這個教程將使用 Go 語言實現一個簡單的 Web 框架,起名叫作Geegeektutu.com的前三個字母。我第一次接觸的 Go 語言的 Web 框架是GinGin的代碼總共是14K,其中測試代碼9K,也就是說實際代碼量只有5KGin也是我很是喜歡的一個框架,與Python中的Flask很像,小而美。web

7天實現Gee框架這個教程的不少設計,包括源碼,參考了Gin,你們能夠看到不少Gin的影子。算法

時間關係,同時爲了儘量地簡潔明瞭,這個框架中的不少部分實現的功能都很簡單,可是儘量地體現一個框架核心的設計原則。例如Router的設計,雖然支持的動態路由規則有限,但爲了性能考慮匹配算法是用Trie樹實現的,Router最重要的指標之一即是性能。django

但願這個教程可以對你有所啓發,若是對 Gee 有任何好的建議,歡迎提issues - Github 和 PR。教程中的任何問題,能夠直接在文章末尾評論。flask

目錄

推薦閱讀

原文地址:7天用Go從零實現Web框架Gee - 極客兔兔cookie

相關文章
相關標籤/搜索