Caddy源码阅读(二)启动流程与 Event 事件通知
Preface
Caddy 是 Go 语言构建的轻量配置化服务器。https://github.com/caddyserver/caddy
Caddy 整个软件可以说是由不同的 插件 堆砌起来的。自己本身仅提供 Plugin 的注册运行逻辑和 Server 的监听服务功能。
学习 caddy 的源码,实际上是学习 如何构建一个 松耦合的 抽象 Plugin 设计,即模块化插拔的做法。
所以我们的源码阅读,围绕 Caddy 为 Plugin 提供的基础设施,和 Plugin 自身逻辑。
下面我们从第一步,启动流程开始阅读。
之后的路径应该是 Caddyfile 的解析,解析出的 配置文件如何消费,配置完成的服务器如何服务。
Overview
Package
这是 caddy 包的结构
main.go
一切的开始 —
我们查看 在 caddy 文件夹下的 main.go 函数。
这是 上图 caddy 文件夹下的目录结构。
其中 run.go 我们在上一篇文章阅读完成
main.go 的 Trick
在 caddy 文件夹中的 main 函数启动 caddy 服务器。实际运行的是 run.go 中的文件,这是方便测试使用
看 main.go 的代码
通过改变 run 变量的值来方便测试,可以学习一下。
启动流程
启动 caddy 的流程
caddyfileLoader
加载 caddyfile 配置 =》生成 Input 信息Context
=》 生成 Server
caddyfile 示例
caddyfile
简单示例:
Instance
是运行操作的 Server 实例,可以看到几个主要的操作都是在他身上
Server
两种监听模式 TCP
UDP
我们首先关心的是 Start()
启动服务器。
启动服务器
发送 StartupEvent, 参照下文中 Event 理解
// Executes Startup events
caddy.EmitEvent(caddy.StartupEvent, nil)
读取配置文件:参照我的接下来的文章 Caddy-解析Caddyfile
caddyfileinput