博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Journey源码分析二:整体启动流程
阅读量:6589 次
发布时间:2019-06-24

本文共 3240 字,大约阅读时间需要 10 分钟。

hot3.png

不可不说,静态语言的源码看起来确实比较方便,之前看python的源码可是很累的。

journey的入口函数在main.go中,main()函数做了以下几件事:

  1. 设置了GOMAXPROCS为CPU核数

  2. 使用flag读取命令行配置

  3. 初始化数据库database.Initialize(),看下Initialize()源码:

    func Initialize() error {		// 如果journey.db不存在,查找Ghost数据库并转换它		if !helpers.FileExists(filenames.DatabaseFilename) {			// Convert Ghost database if available (time format needs to change to be compatible with journey)			migration.Ghost()		}		// 打开或者创建一个数据库		var err error		readDB, err = sql.Open("sqlite3", filenames.DatabaseFilename)		if err != nil {			return err		}		readDB.SetMaxIdleConns(256) // TODO: is this enough?		err = readDB.Ping()		if err != nil {			return err		}		currentTime := time.Now()		// 看下stmtInitialization语句可知,如果不存在相应的表才会创建。		// 后面跟的参数用于填充stmtInitialization中的占位符,占位符是问号`?`。		_, err = readDB.Exec(stmtInitialization, uuid.Formatter(uuid.NewV4(), uuid.CleanHyphen), currentTime, currentTime, uuid.Formatter(uuid.NewV4(), uuid.CleanHyphen), currentTime, currentTime, uuid.Formatter(uuid.NewV4(), uuid.CleanHyphen), currentTime, currentTime, uuid.Formatter(uuid.NewV4(), uuid.CleanHyphen), currentTime, currentTime, uuid.Formatter(uuid.NewV4(), uuid.CleanHyphen), currentTime, currentTime, uuid.Formatter(uuid.NewV4(), uuid.CleanHyphen), currentTime, currentTime, uuid.Formatter(uuid.NewV4(), uuid.CleanHyphen), currentTime, currentTime, uuid.Formatter(uuid.NewV4(), uuid.CleanHyphen), currentTime, currentTime, uuid.Formatter(uuid.NewV4(), uuid.CleanHyphen), currentTime, currentTime, uuid.Formatter(uuid.NewV4(), uuid.CleanHyphen), currentTime, currentTime, uuid.Formatter(uuid.NewV4(), uuid.CleanHyphen), currentTime, currentTime, uuid.Formatter(uuid.NewV4(), uuid.CleanHyphen), currentTime, currentTime)		// TODO: Is Commit()/Rollback() needed for DB.Exec()?		if err != nil {			return err		}		err = checkBlogSettings()		if err != nil {			return err		}		return nil	}
  4. 生成博客首页基本信息methods.GenerateBlog(),生成的Blog对象是全局变量,只会生成一次:

    func GenerateBlog() error {		// 写锁定全局Blog变量		if Blog != nil {			Blog.Lock()			defer Blog.Unlock()		}		// 从数据库读取博客,database.RetrieveBlog()使用预先定义好的sql语句获取内容,生成blog对象。		blog, err := database.RetrieveBlog()		if err != nil {			return err		}		// 添加数据库中没有保存的参数。		// 从配置文件中获取博客的首页连接。		blog.Url = []byte(configuration.Config.Url) 		//这个是干嘛的?		blog.AssetPath = assetPath			// 创建导航栏的slugs,slug即页面的唯一标识符,可用在url上。		for index, _ := range blog.NavigationItems {			blog.NavigationItems[index].Slug = slug.Generate(blog.NavigationItems[index].Label, "navigation")		}		Blog = blog		return nil	}
  5. 模板编译(不是渲染哦)templates.Generate(),后面的文章会分析编译流程。

  6. 加载插件plugins.Load()。plug的官方介绍:

  7. 从配置文件(config.json)读取http/https监听端口。

  8. 从配置文件读取服务器启动方式。有AdminOnly,All,default三种,默认是default,下面看下default做了哪些事:

    httpRouter := httptreemux.New()	// 注册博客路由	server.InitializeBlog(httpRouter)	server.InitializePages(httpRouter)	// 注册admin路由	server.InitializeAdmin(httpRouter)	// 启动HTTP server,它使用的服务go使用标准库的http包。	log.Println("Starting server without HTTPS support. Please enable HTTPS in " + filenames.ConfigFilename + " to improve security.")	log.Println("Starting http server on port " + httpPort + "...")	err := http.ListenAndServe(httpPort, httpRouter)	if err != nil {		log.Fatal("Error: Couldn't start the HTTP server:", err)

    路由的注册流程将在后面的文章中介绍。

转载于:https://my.oschina.net/fmnisme/blog/502485

你可能感兴趣的文章
三分 --- ZOJ 3203 Light Bulb
查看>>
个人作业Week3-案例分析
查看>>
open还是codecs.open区别
查看>>
文件操作
查看>>
基于zepto的H5/移动端tab切换触摸拖动加载更多数据
查看>>
hdu Cow Sorting 数学题(值得思考)
查看>>
问题:ActiveRecord?
查看>>
ExtJS中获取选中行的数据
查看>>
【vc】14_网络编程_socket编程
查看>>
TinkPHP 简单知识摘要
查看>>
【置顶】知识点汇总
查看>>
汇编语言描述
查看>>
为什么循环不能输出??
查看>>
一 java 中使用redis 测试Redis的写入性能
查看>>
简单的反射
查看>>
OC运行时和方法机制笔记
查看>>
【题解】Hanoi塔问题
查看>>
oracle union
查看>>
220 DIV2 A. Inna and Pink Pony
查看>>
sql练习(mysql版)
查看>>