7天用Go动手写/从零实现Web框架Gee

Gee -geektutu

设计一个框架

大部分时候,咱们须要实现一个 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

相关文章
相关标签/搜索