Golang提供了非常完善的net/http标准库,基于这个标准库能够很容易的就构建一个能用的web框架。现在的开源社区上有很多的go web框架,提供了丰富的选择性,从大而全的beego,到轻便的gin、echo等等。

其中的gin具有和maritini类似的API,但它拥有了更好的性能,因为它采用了httprouter,使得性能提升了将近40倍。

同时,在代码风格上也比较清晰简洁。我们通过分析gin的源码,一步一步构建我们自己的web框架。当然,整个过程也可以看成gin源码的分析过程。

Golang原生net/http包

通过Golang原生net/http包就能构建一个最简单的web服务器,参照官方文档的例子:

package main

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

func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hi there, I love %s!", r.URL.Path[1:])
}

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

运行以上的代码,访问 http://localhost:8080/ 就已经构建了最简单的web服务器。

那么可能会有疑问,既然这么快速的实现了一个web服务器,为什么还需要web框架呢。答案当然是功能太简单了。在web服务中需要的很多功能,其实并不需要我们重新实现一遍,而是有很多封装可以直接拿来使用,框架就帮我们隐去了很多细节,节省了大量时间。

简单的来说,Gin主要帮我们做了几大块事情。

  1. 一个路由匹配
  2. 一个请求和响应的context封装
  3. 一个中间件的使用,包括鉴权、日志、故障恢复等

我们也主要分析这几方面。下一篇先分析路由匹配。