可配置插件设计

fago网关的插件管理

需要设计一个方案,可以动态的插拔插件,每个插件代表不同的功能.

/usr/local/openresty/lualib/fago/目录

设计一个方便可插拔的插件,在文档目录结构方面进行这样的设计

--fago    #网关fago主目录
---lib       #存放第三方类库
---common    #存放一些工具类库
---conf      #存放配置文件
-----fago.conf    #定义fago网关的一些相关配置
---plugins   #存放所有插件的目录
-----base_plugin.lua     #插件基类
-----XXXX    #某个插件的目录名
-------handler.lua   #某个插件的实现类,统一命名为handler,这个是用目录名区分插件,这样的设计有特别用途

一)首先设计一个基础插件类

-------------------------base_plugin.lua-------------------------

local utils = require("fago.common.utils")
local Object = require("fago.lib.classic")

local BasePlugin = Object:extend()

function BasePlugin:new(name)
    self._name = name
    utils.debug_log("BasePlugin executing plugin \""..self._name.."\": new")
end

function BasePlugin:get_name()
    return self._name
end

function BasePlugin:init_worker()
    utils.debug_log("BasePlugin executing plugin \""..self._name.."\": init_worker")
end

function BasePlugin:redirect()
    utils.debug_log("BasePlugin executing plugin \""..self._name.."\": redirect")
end

function BasePlugin:rewrite()
    utils.debug_log("BasePlugin executing plugin \""..self._name.."\": rewrite")
end

function BasePlugin:access()
    utils.debug_log("BasePlugin executing plugin \""..self._name.."\": access")
end

function BasePlugin:header_filter()
    utils.debug_log("BasePlugin executing plugin \""..self._name.."\": header_filter")
end

function BasePlugin:body_filter()
    utils.debug_log("BasePlugin executing plugin \""..self._name.."\": body_filter")
end

function BasePlugin:log()
    utils.debug_log("BasePlugin executing plugin \""..self._name.."\": log")
end

return BasePlugin

其中的lib.classic,我们在fago目录下新建了lib目录,下面存放了公共的类库 classic脚本使用了object的基类,类似java的object类; 以后我们所设计的类,只要在此类上面进行扩展即可

此基类object,大家不需要完全了解,只需要知道此脚本类似于object基类就行

我们为了方便,在新建一个utils工具类,新建一个common目录,在此目录下创建的是一些公共方法脚本类

新建一个签名验证的插件

在plugins目录下新建sign_auth目录 在sign_auth目录下新建handler.lua

到此插件已经设计完成,现在我们需要设计配置文件,有哪些可以配置

conf/fago.conf

设计到这里,基本雏形已经完成

Last updated

Was this helpful?