Caddy 是一个开源的 Go 语言项目, 它采用了一种全新的插件架构, 使它的功能远远超出了任何其他 Web 服务器。
从单一二进制到可扩展的设计
Caddy 的核心理念是"更少的活动部件", 这意味着它是一个单一的、自包含的、静态的二进制文件, 没有任何外部依赖项。这不仅简化了部署, 还减少了生产环境中的故障排查工作。
但是, 如果没有动态链接,Caddy 又如何做到扩展呢?Caddy 采用了一种新颖的插件架构, 实现了超越其他 Web 服务器的功能。它由三个主要组成部分组成: 命令、核心库和模块。
命令、核心库和模块
命令提供了熟悉的命令行界面, 用于从操作系统启动 Caddy 进程。核心库, 也就是 Caddy 的"核心", 主要负责管理配置。而模块则负责执行所有其他工作。
内置的"标准模块"提供了大多数用户所需的功能, 比如静态文件服务、反向代理等。开发者也可以编写自己的模块来扩展 Caddy 的功能。这些模块通过简单的"插入"机制集成到 Caddy 中, 无需修改 Caddy 的代码库。
模块的生命周期
Caddy 中的模块有两种类型: 主机模块和访客模块。主机模块负责加载和管理其他模块, 而访客模块则是被加载的模块。
模块的生命周期包括四个阶段: 加载、配置和验证、使用, 以及最后的清理。在配置和验证阶段, 模块有机会进行自我设置和验证。在使用阶段, 主机模块会调用访客模块提供的接口。最后, 在清理阶段, 模块有机会释放任何分配的资源。
优雅的配置管理
Caddy 采用了一种优雅的设计来管理配置变更, 能够做到不中断运行服务、支持粒度配置更改, 并且所有的重载操作都是原子的、一致的、隔离的, 并且大多数是持久的 ("ACID") 。这得益于它将配置视为不可变的原子单元, 要么整个替换, 要么什么都不变。
Caddy 的架构设计不仅简化了部署, 还提供了一种可扩展的插件机制, 使它能够超越传统的 Web 服务器。同时, 它还采用了优雅的配置管理方式, 确保了系统的稳定性和可靠性。这些特性无疑为 Caddy 赢得了广泛的关注和好评。
参考文献: