简介
在「日常生活」中 使用任何工具时,如果理解了该工具的工作原理。那么用起来就会更加得心应手。应用开发也是如此,当你能真正懂得一个功能背后实现原理时,用起来会更加顺手,方便。文档存在目的是为了让你更加清晰地了解 Snow 框架是如何工作。通过框架进行全面了解,让一切都不再感觉很「神奇」。相信我,这有助于你更加清楚自己在做什么,对自己想做的事情更加胸有成竹。只要多一点尝试、学着如何运用,随着你浏览文档的其他部分,你用起来一定会更得心应手。
概述
程序入口
Snow 应用的程序入口为根目录 main.go 文件。找到了入口,也就知道了整个程序的起点,后续就是沿着代码的逻辑脉络加以理解了。
HTTP
在main.go启动HTTP服务
## 配置文件路径,进程号路径,服务预启动回调函数,路由注册回调函数
server.StartHttp(opts.ConfFile, pidFile, bootstrap.Bootstrap, routes.RegisterRoute)
## 具体启动逻辑
func StartHttp(confFile, pidFile string, boot func(config *config.Config) error, registerRoute func(*gin.Engine)) error {
//加载配置文件
conf, err := config.Load(confFile)
if err != nil {
return err
}
//初始化服务信息
err = initServer()
if err != nil {
return fmt.Errorf("init server failed, %s", err.Error())
}
//容器初始化
err = boot(conf)
if err != nil {
return fmt.Errorf("container ini failed %s", err.Error())
}
//配置路由引擎
engine := gin.Default()
registerRoute(engine)
addr := conf.Api.Host + ":" + strconv.Itoa(conf.Api.Port)
runEngine(engine, addr, pidFile)
go func() {
srv.stop <- true
}()
//等待停止信号
waitStop()
return nil
}
任务调度
在main.go启动任务调度服务
## 配置文件路径,进程号路径,服务预启动回调函数,任务注册回调函数
server.StartConsole(opts.ConfFile, pidFile, bootstrap.Bootstrap, console.RegisterSchedule)
## 具体启动逻辑
func StartConsole(confFile, pidFile string, boot func(*config.Config) error, registerSchedule func(*cron.Cron)) error {
//加载配置文件
conf, err := config.Load(confFile)
if err != nil {
return err
}
//初始化服务信息
err = initServer()
if err != nil {
return fmt.Errorf("init server failed, %s", err.Error())
}
//容器初始化
err = boot(conf)
if err != nil {
return fmt.Errorf("container ini failed %s", err.Error())
}
//注册Cron执行计划
cronEngine := cron.New()
registerSchedule(cronEngine)
cronEngine.Start()
//写pid文件
writePidFile(pidFile)
//注册信号量
registerSignal()
//等待停止信号
waitConsoleStop(cronEngine)
return nil
}
队列调度
在main.go启动队列调度服务
## 配置文件路径,进程号路径,服务预启动回调函数,Workder注册回调函数
server.StartJob(opts.ConfFile, pidFile, bootstrap.Bootstrap, jobs.RegisterWorker)
## 具体启动逻辑
func StartJob(confFile, pidFile string, boot func(*config.Config) error, registerWorker func(*work.Job)) error {
//加载配置文件
conf, err := config.Load(confFile)
if err != nil {
return err
}
//初始化服务信息
err = initServer()
if err != nil {
return fmt.Errorf("init server failed, %s", err.Error())
}
//容器初始化
err = boot(conf)
if err != nil {
return fmt.Errorf("container ini failed %s", err.Error())
}
//注册Job Worker
job := work.New()
registerWorker(job)
job.Start()
//写pid文件
writePidFile(pidFile)
//注册信号量
registerSignal()
//等待停止信号
waitJobStop(job)
return nil
}