global

Global 用于提供服务器运行期全局化的对象和方法. 这是一个很常见的技术方案.
在 Go 语言可以通过 package global 来做. 全局的当然是要被其他包import的. 因此要注意package globalimport的包不能造成循环import.
global 当前提供了这几个对象

  • 管理配置 Conf *toml.TomlTree
  • 日志管理 Log MultiLogger
  • http路由 Mux *mux.Router
  • 可卸载监听 GracefulListen *manners.GracefulListener
  • 站点根目录 DocRoot string
  • 安全的ShutDown OnShutDown

toml

前文说过选用 TOML 格式作为配置文件. 这也是作者第一次使用 TOML. 在当前的版本下有几点体会

  • 虽然类型是 TomlTree,但是读取配置数据的时候只能从根对象读取, 这与go-toml内部实现有关
  • 由于Get等方法返回的都是interface{}, 所以要用到 type assertion

LoadConfig 大量使用type assertion的写法可能会让使用者不喜. 作者感觉可以接受.

main

braintree/manners作为可ShutDown的服务器. main 只负责启动/重启/停止服务器, 所以main函数反而是最简单的. import一些包, 使其生效, 简单的维护下服务器的状态就可以了. 你会发现这个项目是分好多package完成, 这就是 Go 的风格.

随着项目的进展作者发现在控制台 Ctrl+C 并不会立即结束进程, 这应该是受 socket 释放周期影响. 到底该如何处理, 现在还不明朗.

静态文件

对于裸奔的服务器, 完成静态文件访问是最基本的. 路由分派器gorilla/mux没有提供静态文件支持, 这很正常, 这不是路由负责的, 要由应用自己完成. TypePress采用这样的路由方式

如果所有的路由匹配都失败, 那么就会执行gorilla/muxNotFoundHandler. TypePress 用这个进行静态文件请求. 实现一个静态文件服务器其实是很简单, 加上静态gzip支持也要不了几行代码.

log

文件日志是最常见的日志方案. TypePress选用的log包提供了很好的机制,但是没有提供文件日志. 没关系, 自己实现filewriter. 主要做了2件事

  • 给写文件加并发互斥锁
  • 注册到OnShutDown,以便正常的关闭日志文件

GracefulListen

ShutDown的时候应该关闭监听. 所以就有了全局的 GracefulListen, ShutDown的行为应该由控制器负责. 当前还没有具体实现.

注意

GitHub 源码中没有上传 log 目录. 如果你想试运行, 可以自建.