跟Gin一块搭建自己的web框架(一)
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主要帮我们做了几大块事情。
- 一个路由匹配
- 一个请求和响应的context封装
- 一个中间件的使用,包括鉴权、日志、故障恢复等
我们也主要分析这几方面。下一篇先分析路由匹配。