Beego源码解析-(三)-HTTP请求处理流程

本文详细解析了Beego框架处理HTTP请求的流程,从beego.Run()入口开始,探讨app.Run()函数以及ServeHTTP()的核心逻辑。文章介绍了如何在接收到HTTP请求时,通过ControllerRegister对象和路由树进行匹配,执行相应的Controller方法,并涉及Filter、Session管理和路由查找等关键步骤。
摘要由CSDN通过智能技术生成

原文地址:
Beego源码解析-(三)-HTTP请求处理流程

关于上一篇文章Beego源码解析(二)-路由机制中介绍了在 Beego中如注册路由以及如何将我们自定义的路由加入到 Beego的 App实例中
我们知道关于注册的路由都是会加入到路由树的节点中,那么在 HTTP的请求中,查找路由树就是非常关键的一部分了

这篇文章将梳理一遍在 Beego启动后,处理 HTTP请求的流程

关于 Beego的源码注释可以见我的Github

beego.Run()入口

在第一篇文章中就曾提到过,在启动 Beego应用时都是通过调用 beego.Run()方法启动.而这个方法在设置了6个回到调函数后会进入 app.Run()方法(app就是我们 Beego应用程序的一个实例,在 app.go的 init()函数中被初始化)

app.Run()函数

app.Run()函数就是在一切都准备好之后进入 HTTP请求循环的一个启动函数了,函数并不是很长而且逻辑比较简单,结合注释看下即可
beego/app.go:

// beego程序启动函数
func (app *App) Run() {
    //获得地址
    addr := BConfig.Listen.HTTPAddr
    if BConfig.Listen.HTTPPort != 0 {
        addr = fmt.Sprintf("%s:%d", BConfig.Listen.HTTPAddr, BConfig.Listen.HTTPPort)
    }

    var (
        err        error
        l          net.Listener
        endRunning = make(chan bool, 1)
    )
    // 运行 CGI服务器
    if BConfig.Listen.EnableFcgi {}
    //这里设置标准包中的 http.Server.handler为 app.ServerHandler
    //也就是 ContollerRegister类型,因为 ControllerRegister实现了 ServeHTTP()函数
    app.Server.Handler = app.Handlers
    //设置超时
    app.Server.ReadTimeout = time.Duration(BConfig.Listen.ServerTimeOut) * time.Second
    app.Server.WriteTimeout = time.Duration(BConfig.Listen.ServerTimeOut) * time.Second
    // 运行热编译模式
    if BConfig.Listen.Graceful {
        httpsAddr := BConfig.Listen.HTTPSAddr
        app.Server.Addr = httpsAddr
        // 热编译模式下的 HTTPS
        if BConfig.Listen.EnableHTTPS {
            go func() {
                time.Sleep(20 * time.Microsecond)
                if BConfig.Listen.HTTPSPort != 0 {
                    httpsAddr = fmt.Sprintf("%s:%d", BConfig.Listen.HTTPSAddr, BConfig.Listen.HTTPSPort)
                    app.Server.Addr = httpsAddr
                }
                server := grace.NewServer(httpsAddr, app.Handlers)
                server.Server.ReadTimeout = app.Server.ReadTimeout
                server.Server.WriteTimeout = app.Server.WriteTimeout
                //执行 HTTPS的 ListenAndServerTLS()
                if err := server.ListenAndServeTLS(BConfig.Listen.HTTPSCertFile, BConfig.Listen.HTTPSKeyFile); err != nil {
   
                    BeeLogger.Critical("ListenAndServeTLS: ", err, fmt.Sprintf("%d", os.Getpid()))
                    time.Sleep(100 * time.Microsecond)
                    endRunning <- true
                }
            }()
        }
        // 热编译模式下的 HTTP
        if BConfig.Listen.EnableHTTP {
            go func() {
                server := grace.NewServer(addr, app.Handlers)
                server.Server.ReadTimeout = app.Server.ReadTimeout
                server
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值