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 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的合体