app init

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

iris.go
核心是初始化了Router 和ContextPool
go iris 源码思路分析

iris.go
在run函数里首先进行了app.build, 然后进行配置,最后调用传入的参数函数, 核心是
app.build()
iris.Addr(":8080")(app)
go iris 源码思路分析

iris.go
app.build 核心是app.Router.BuildRouter(), 传入了默认requestHandller
go iris 源码思路分析

iris.go
iris.Addr(":8080")(app) 核心是
NewHost()
ListenAndServer()
go iris 源码思路分析

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
go iris 源码思路分析
go iris 源码思路分析
go iris 源码思路分析

iris/core/router/router.go
iris 路由默认用mainhandler处理每次请求
go iris 源码思路分析

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对象.这就是整个框架请求的核心流程
go iris 源码思路分析
go iris 源码思路分析

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

总结

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

相关文章:

  • 2021-09-30
  • 2021-05-12
  • 2021-08-14
  • 2021-12-04
  • 2022-01-18
  • 2021-06-03
  • 2021-08-30
  • 2020-05-16
猜你喜欢
  • 2019-06-19
  • 2021-12-10
  • 2022-01-09
  • 2021-10-07
  • 2018-09-17
  • 2021-10-20
  • 2021-04-21
相关资源
相似解决方案