golang源码解析(1),总体理解
2021-05-20 本文已影响0人
哆啦在这A梦在哪
大纲解释
前言
需要了解原声go web的http的一些机制。
原生的http.ListenAndServe
的第二个参数提供了路由器的自定义逻辑,而gin就是实现了一个自己的路由器,再加上一些特定的架构和工具(比如中间件,gin.Context)就形成完整的gin框架。
所以gin主要的关注点就是 下面这个路由器方法的实现,以及对应其他每个工具的实现。
gin.go:438 ServeHTTP(ResponseWriter, *Request)
一个请求来到服务器了,ServeHTTP 会被调用,gin做的事情包括:
1.路由,找到handle
2.将请求和响应用Context包装起来供业务代码使用
3.依次调用中间件和处理函数
4.输出结果
理解过程总体分为几部分
1.路由解析,gin为什么受欢迎,因为他路由的效率高是原因之一。
2.中间件
gin启动,即准备工作
gin.go : 326行
func (engine *Engine) Run(addr ...string) (err error) {
defer func() { debugPrintError(err) }()
trustedCIDRs, err := engine.prepareTrustedCIDRs()
if err != nil {
return err
}
engine.trustedCIDRs = trustedCIDRs
address := resolveAddress(addr)// 地址操作,主要是处理一下端口
debugPrint("Listening and serving HTTP on %s\n", address)
err = http.ListenAndServe(address, engine)
//使用原生监听,这里把Engine就是gin实现的路由器放进去。
//这样在接口请求的时候就会执行对应的ServeHTTP方法。
return
}
这里梳理出所有的流程,便于下面有一个清晰的目标来理解
总流程
构造准备阶段
1.构建一个核心 Engine
2.Engine下实现每种方法对应以每种方法(post,get,put,delete)为key构造root根节点(root内部为node结构)
3.root下的addRoute,将对应handle逻辑方法和path对应
请求匹配阶段
1.也是基础的实现ServeHTTP的内容,接口被请求时,进入这里的逻辑
路由的构造,匹配以及理解,请移步二:https://www.jianshu.com/p/0b4de079ea00
总结,再来整理一遍gin的过程,主要做的几步工作:
其实主要比较核心的东西就三个,Engine核心,路由构造和匹配,context
1.先构造核心Engine
这一步主要是框架中的一些工作(new一个Engine,放入基本的方法等等)
2.路由的构造
就是你的你那些Post和Get方法的路由和路由组的书写,构造成一棵树,并和上一步的引擎关联,形成一个完整的路由器。
同时,实现路由器必须的ServeHTTP(ResponseWriter, *Request)方法,这个方法里面构建了context,并准备着接受请求