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,并准备着接受请求

3.在执行Run后,执行ListenAndServe方法监听,并把上述的路由器放入,形成一个完整的整体。

接下来就是可以正常请求使用了。

上一篇下一篇

猜你喜欢

热点阅读