beego原理探究-启动流程

一、前言

前面 我们探究了如何搭建一个简单的beego应用,本节我们看其启动流程。

二、启动流程

首先快速从下图复习下上节的mybeen应用的结构:beego原理探究-启动流程_第1张图片

然后我们看main.go运行时候,如何一步步来启动httpserver的,其启动时序图如下:beego原理探究-启动流程_第2张图片

  • 如上时序图步骤1,2,3首先调用了beego.go文件的init方法,该方法内步骤4使用newBconfig方法创建了一个默认配置类,比如http服务监听端口默认为8080等等beego原理探究-启动流程_第3张图片步骤5则加载项目目录conf下的app.conf文件beego原理探究-启动流程_第4张图片然后步骤6解析该文件中配置项到全局配置BConfig中。

  • 时序图中步骤7才是真正开始执行我们的main.go中的main函数,其中会调用beego的Run方法,其内部首先调用initBeforeHTTPRun方法,该方法代码如下:

func initBeforeHTTPRun() {	
    //添加内置hooks	
    AddAPPStartHook(	
        registerMime,	
        registerDefaultErrorHandler,	
        registerSession,	
        registerTemplate,	
        registerAdmin,	
        registerGzip,	
    )	
    //顺序执行hook方法	
    for _, hk := range hooks {	
        if err := hk(); err != nil {	
            panic(err)	
        }	
    }	
}
  • 如上时序图步骤13具体启动http服务,根据app.conf 中配置不同启动不同的httpserver,默认是正常模式,如果设置EnableFcgi为true则启动cgi服务,如果设置Graceful为true则启动优雅重启服务。这些后面具体讲解。

其中启动普通httpserver代码如下:

//1. 创建含有一个元素的bool类型通道	
var endRunning = make(chan bool, 1)	
//2.开启gorotuine启动httpserver	
if BConfig.Listen.EnableHTTP {	
        go func() {	
            app.Server.Addr = addr	
            logs.Info("http server Running on http://%s", app.Server.Addr)	
            if BConfig.Listen.ListenTCP4 {	
                ln, err := net.Listen("tcp4", app.Server.Addr)	
                if err != nil {	
                    logs.Critical("ListenAndServe: ", err)	
                    time.Sleep(100 * time.Microsecond)	
                    //向通道写入元素	
                    endRunning <- true	
                    return	
                }	
                if err = app.Server.Serve(ln); err != nil {	
                    logs.Critical("ListenAndServe: ", err)	
                    time.Sleep(100 * time.Microsecond)	
                    //向通道写入元素	
                    endRunning <- true	
                    return	
                }	
            } else {	
                if err := app.Server.ListenAndServe(); err != nil {	
                    logs.Critical("ListenAndServe: ", err)	
                    time.Sleep(100 * time.Microsecond)	
                    //向通道写入元素	
                    endRunning <- true	
                }	
            }	
        }()	
    }	
//3.等待http服务终止。	
<-endRunning

可知具体启动了一个新goroutine来启动服务,并且当前goroutine会在服务处理请求过程中使用代码3挂起当前goroutine,当新goroutine内服务结束后会向通道endRunning写入一个数据,然后当前goroutine就会返回了。

到这里httpserver启动概要流程已经完毕。

三、总结

本文我们简单额剖析了beego创建的应用的启动流程。

你可能感兴趣的:(beego原理探究-启动流程)