前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >beego原理探究-启动流程

beego原理探究-启动流程

作者头像
加多
发布2019-06-14 21:06:16
1.2K0
发布2019-06-14 21:06:16
举报
文章被收录于专栏:Java编程技术

一、前言

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

二、启动流程

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

image.png

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

image.png

  • 如上时序图步骤1,2,3首先调用了beego.go文件的init方法,该方法内步骤4使用newBconfig方法创建了一个默认配置类,比如http服务监听端口默认为8080等等

image.png 步骤5则加载项目目录conf下的app.conf文件

image.png 然后步骤6解析该文件中配置项到全局配置BConfig中。

  • 时序图中步骤7才是真正开始执行我们的main.go中的main函数,其中会调用beego的Run方法,其内部首先调用initBeforeHTTPRun方法,该方法代码如下:
代码语言:javascript
复制
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代码如下:

代码语言:javascript
复制
//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创建的应用的启动流程。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.06.10 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、前言
  • 二、启动流程
  • 三、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档