go iris 源码思路分析

旧巷老猫 提交于 2019-11-26 20:31:57

app init

进入
app := iris.New()
app.Run(iris.Addr("0.0.0.0:8080"))

iris.go
核心是初始化了Router 和ContextPool
在这里插入图片描述

iris.go
在run函数里首先进行了app.build, 然后进行配置,最后调用传入的参数函数, 核心是
app.build()
iris.Addr(":8080")(app)
在这里插入图片描述

iris.go
app.build 核心是app.Router.BuildRouter(), 传入了默认requestHandller
在这里插入图片描述

iris.go
iris.Addr(":8080")(app) 核心是
NewHost()
ListenAndServer()
iris.go

iris.go net/http/server.go net/http/server.go
NewHost()核心是
srv.Handler = app.Router
现在整体思路就很清晰了,这个函数把http.Server 的路由改成了自己的路由,剩下的语句都是配置监听server
所以数据流程是net/http 接受请求,调用server.handler.servehttp处理该次请求,也就是调用app.router.servehttp

在这里插入图片描述
在这里插入图片描述

iris/core/router/router.go
iris 路由默认用mainhandler处理每次请求
在这里插入图片描述

iris/core/router/router.go   iris/context/pool.go
router.mainhandler 在上文app.build中提到的router.buildrouter 中定义
这里是真正处理每次请求的地方,先从cpool 也就是上文第一步提到的contextPool中提取一个ctx对象,交给handlerrequest处理,在释放ctx 对象
ctx 对象相信大家都听熟悉,每个接口的参数都是他,iris 建立了一个sync.pool 临时对象池,当池里没有空闲对象时就调用new 方法创建, 有空闲的当然直接就提取出来啦,然后通过ctx.BeginRequest(w, r)里重新初始化ctx 对象
handlerrequest 不用猜就知道包括iris 的路由算法和我们的各种中间件和最终每个接口的处理函数
最后再释放掉ctx对象.这就是整个框架请求的核心流程
在这里插入图片描述
在这里插入图片描述

iris/core/router/handler.go
接下来就是路由算法,也就是routerhandler.handlerrequest方法里的东西
算法我也没咋细看,想看的自己去看,中间件和接口函数最后就是在这个函数227行调用的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

整体思路就是用自己的路由替代了net/http的路由,建立了一个对象池缓存ctx对象,ctx对象相当于是net/http w和r的合体

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!