• 简介
  • 概述
    • 程序入口
    • HTTP
    • 任务调度
    • 队列调度

    简介

    在「日常生活」中 使用任何工具时,如果理解了该工具的工作原理。那么用起来就会更加得心应手。应用开发也是如此,当你能真正懂得一个功能背后实现原理时,用起来会更加顺手,方便。文档存在目的是为了让你更加清晰地了解 Snow 框架是如何工作。通过框架进行全面了解,让一切都不再感觉很「神奇」。相信我,这有助于你更加清楚自己在做什么,对自己想做的事情更加胸有成竹。只要多一点尝试、学着如何运用,随着你浏览文档的其他部分,你用起来一定会更得心应手。

    概述

    程序入口

    Snow 应用的程序入口为根目录 main.go 文件。找到了入口,也就知道了整个程序的起点,后续就是沿着代码的逻辑脉络加以理解了。

    HTTP

    在main.go启动HTTP服务

    1. ## 配置文件路径,进程号路径,服务预启动回调函数,路由注册回调函数
    2. server.StartHttp(opts.ConfFile, pidFile, bootstrap.Bootstrap, routes.RegisterRoute)
    3. ## 具体启动逻辑
    4. func StartHttp(confFile, pidFile string, boot func(config *config.Config) error, registerRoute func(*gin.Engine)) error {
    5. //加载配置文件
    6. conf, err := config.Load(confFile)
    7. if err != nil {
    8. return err
    9. }
    10. //初始化服务信息
    11. err = initServer()
    12. if err != nil {
    13. return fmt.Errorf("init server failed, %s", err.Error())
    14. }
    15. //容器初始化
    16. err = boot(conf)
    17. if err != nil {
    18. return fmt.Errorf("container ini failed %s", err.Error())
    19. }
    20. //配置路由引擎
    21. engine := gin.Default()
    22. registerRoute(engine)
    23. addr := conf.Api.Host + ":" + strconv.Itoa(conf.Api.Port)
    24. runEngine(engine, addr, pidFile)
    25. go func() {
    26. srv.stop <- true
    27. }()
    28. //等待停止信号
    29. waitStop()
    30. return nil
    31. }

    任务调度

    在main.go启动任务调度服务

    1. ## 配置文件路径,进程号路径,服务预启动回调函数,任务注册回调函数
    2. server.StartConsole(opts.ConfFile, pidFile, bootstrap.Bootstrap, console.RegisterSchedule)
    3. ## 具体启动逻辑
    4. func StartConsole(confFile, pidFile string, boot func(*config.Config) error, registerSchedule func(*cron.Cron)) error {
    5. //加载配置文件
    6. conf, err := config.Load(confFile)
    7. if err != nil {
    8. return err
    9. }
    10. //初始化服务信息
    11. err = initServer()
    12. if err != nil {
    13. return fmt.Errorf("init server failed, %s", err.Error())
    14. }
    15. //容器初始化
    16. err = boot(conf)
    17. if err != nil {
    18. return fmt.Errorf("container ini failed %s", err.Error())
    19. }
    20. //注册Cron执行计划
    21. cronEngine := cron.New()
    22. registerSchedule(cronEngine)
    23. cronEngine.Start()
    24. //写pid文件
    25. writePidFile(pidFile)
    26. //注册信号量
    27. registerSignal()
    28. //等待停止信号
    29. waitConsoleStop(cronEngine)
    30. return nil
    31. }

    队列调度

    在main.go启动队列调度服务

    1. ## 配置文件路径,进程号路径,服务预启动回调函数,Workder注册回调函数
    2. server.StartJob(opts.ConfFile, pidFile, bootstrap.Bootstrap, jobs.RegisterWorker)
    3. ## 具体启动逻辑
    4. func StartJob(confFile, pidFile string, boot func(*config.Config) error, registerWorker func(*work.Job)) error {
    5. //加载配置文件
    6. conf, err := config.Load(confFile)
    7. if err != nil {
    8. return err
    9. }
    10. //初始化服务信息
    11. err = initServer()
    12. if err != nil {
    13. return fmt.Errorf("init server failed, %s", err.Error())
    14. }
    15. //容器初始化
    16. err = boot(conf)
    17. if err != nil {
    18. return fmt.Errorf("container ini failed %s", err.Error())
    19. }
    20. //注册Job Worker
    21. job := work.New()
    22. registerWorker(job)
    23. job.Start()
    24. //写pid文件
    25. writePidFile(pidFile)
    26. //注册信号量
    27. registerSignal()
    28. //等待停止信号
    29. waitJobStop(job)
    30. return nil
    31. }