beego原理探究-启动流程

一、前言

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

二、启动流程

首先快速从下图复习下上节的mybeen应用的结构:


beego原理探究-启动流程_第1张图片
image.png

然后我们看main.go运行时候,如何一步步来启动httpserver的,其启动时序图如下:


beego原理探究-启动流程_第2张图片
image.png
  • 如上时序图步骤1,2,3首先调用了beego.go文件的init方法,该方法内步骤4使用newBconfig方法创建了一个默认配置类,比如http服务监听端口默认为8080等等
    beego原理探究-启动流程_第3张图片
    image.png

    步骤5则加载项目目录conf下的app.conf文件
    beego原理探究-启动流程_第4张图片
    image.png

    然后步骤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原理探究-启动流程_第5张图片
image.png

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