直入主题:
里面最重要的就是上图中的启动方法:
bootstrap.Start(configFilePath)
cmd子包分析结束,开始进入bootstrap子包。
第67行:
cfg, err := boot_config.Load(configFilePath)
- 1.读取文件内容,变成string
- 2.使用gopkg.in/yaml.v2库反序列化yaml格式文件,把结果保存到 cfg变量中
所以你应该学会了如何读取yaml配置文件。并且里面需要说明的是,使用了一个方法:os.ExpandEnv(configContent)
,说明如下:
// ExpandEnv replaces ${var} or $var in the string according to the values // of the current environment variables. References to undefined // variables are replaced by the empty string. func ExpandEnv(s string) string { return Expand(s, Getenv) }
即如果环境变量中配置了相应值,会替换yaml配置中的内容,熟悉Java的或者知道正则中的Matcher.appendReplacement
模板替换,如下示例:
如果环境变量配置了 MYSQL_USER=root, 那么yaml配置内容中${MYSQL_USER} 或者 $MYSQL_USER 解析读取后的内容会被替换成 root
得到cfg数据模型后,又序列化,这是为了校验cfg的有效性?
注意下面红框,这就是控制台出现大堆配置输出的缘由:
至此,读取配置工作✅
2.初始化日志:这里面我想分享的是 时间轮timewheel
定时任务每分钟“巡检”一次:看看有没有任务被添加进来,并判断是否需要真正执行:回调任务添加者提供的callback函数
里面有协程,锁,通过time.Ticker任务调度 等设计理念和实战,不了解的值得去好好看看的。
上图中297行正是添加任务:处理滚动日志,这也好理解:别让一个日志文件太大,定时切割。
上图2行代码做了2件事:
1.把localHost
的值保存到全局变量utils.LocalHost
2.对传入的context包了一层,添加一个kv, v正是 localHost
值
return context.WithValue(ctx, localhostCtx{}, localhost)
只做了一件事:把port的值保存到全局变量utils.LocalPort中
实际上,上述几个保存全局变量值在const.go文件中,里面的变量也就这3个:
4.metrics.InitMetrics()
跳过分析
InitMetrics 初始化 metrics 的所有指标
5.eventhub.InitEventHub()
// InitEventHub initialize event hub func InitEventHub() { initOnce.Do(func() { globalEventHub = createEventhub() }) }
数据模型如下:
// eventHub event hub type eventHub struct { ctx context.Context cancel context.CancelFunc topics map[string]*topic // 看这里 mu sync.RWMutex } type topic struct { name string queue chan Event // 事件队列 closeCh chan struct{} subs map[string]*subscription // 订阅者 mu sync.RWMutex } // Subscription subscription info type subscription struct { name string queue chan Event closeCh chan struct{} handler Handler opts *SubOptions // 里面只有一个队列大小属性 } // Handler event handler type Handler interface { // PreProcess do preprocess logic for event PreProcess(context.Context, any) any // OnEvent event process logic OnEvent(ctx context.Context, any2 any) error }
先对发布订阅事件模型有个大概了解,后续有机会案例分析。
6.设置插件配置:
只是把插件相差配置保存到全局变量中:
里面挺多配置内容的,具体可参看
因为启动过程涉及到的内容比较多,所以分多篇介绍。
本篇介绍了
- 启动开始 读取配置内容
- 初始化日志打印,使用第三方日志组件,并且使用时间轮设计处理日志滚动
- 初始化ip+port
- 初始化prometheus 度量
- 初始化事件发布订阅
- 保存插件配置到全局变量
后续有 初始化存储,启动流程,初始化插件,加载数据等。