这是一个更简单的例子,展示如何用utopia框架不用reload nginx就能改写URI。
要让一个功能热加载其对应的配置,要做两方面:配置管理和配置使用。配置管理又要做配置存储和配置生效,但是呢配置存储前要做配置验证。因此我们可以这样设计:
任何一个功能要实现配置热加载只做3步:配置验证,配置生效,配置使用
之前的代码里,我们用utopia.lua这一个文件演示了IP黑名单功能,在这个例子里,我们实现更加接近生产级别的代码。
我们将utopia.lua重构成3个模块:
init.lua:入口文件
conf.lua:配置验证模块
http.lua:业务模块
其中热加载框已经在init.lua里实现了,开发者不用再关心,只需写自己有关的业务,以uri改写为例:
配置验证,检验是否为字符串类型:
# conf.lua
...
uri = {
type = CONF.STRING,
},
配置生效,即加载到lua模块:
# http.lua
function _M.init_conf(value)
...
if (value.uri) then
action.uri = value.uri;
end
end
配置使用,请求过来时处理:
function _M.handle(r)
...
if (action.uri) then
r.uri = action.uri;
end
end
就是这么简洁! utopia项目开源: https://github.com/hongzhidao/lua-utopia 目前是用它来展示基于nginx-http-lua-module解决nginx reload问题。它实现了配置热加载,让开发者基于它只写自己的业务功能。