前面 我们探究了如何搭建一个简单的beego应用,本节我们看其启动流程。
首先快速从下图复习下上节的mybeen应用的结构:
image.png
然后我们看main.go运行时候,如何一步步来启动httpserver的,其启动时序图如下:
image.png
image.png 步骤5则加载项目目录conf下的app.conf文件
image.png 然后步骤6解析该文件中配置项到全局配置BConfig中。
func initBeforeHTTPRun() {
//添加内置hooks
AddAPPStartHook(
registerMime,
registerDefaultErrorHandler,
registerSession,
registerTemplate,
registerAdmin,
registerGzip,
)
//顺序执行hook方法
for _, hk := range hooks {
if err := hk(); err != nil {
panic(err)
}
}
}
其中启动普通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创建的应用的启动流程。