如何在Kong插件中获取另一个插件的配置信息?
在Kong插件B中获取插件A的配置方案
下面提供三种实用方案,避免重复配置字段:
方案1:通过Kong数据库API查询插件A的配置
Kong的插件配置存储在数据库中,你可以在插件B中直接调用Kong的内部数据库API,查询对应实体(路由/服务/全局)上的插件A配置。
代码示例(插件B的access函数):
function B:access(config) -- 获取当前请求关联的路由ID(如果插件A绑定在服务上,就用ngx.ctx.service.id) local entity_id = ngx.ctx.route.id local entity_type = "route" -- 可选值:route/service/consumer,全局插件用nil -- 查询插件A的配置 local plugin_a, err if entity_type then plugin_a, err = kong.db.plugins:select_by_name_and_entity("A", { [entity_type] = { id = entity_id } }) else -- 查询全局插件A plugin_a, err = kong.db.plugins:select_by_name("A") end if plugin_a then -- 成功获取到插件A的配置 local a_config = plugin_a.config -- 使用a_config中的字段,比如 a_config.your_target_field else if err then kong.log.err("获取插件A配置失败: ", err) else kong.log.warn("当前实体未配置插件A") end end end
注意事项:
- 需要确保插件A和B绑定在同一实体(路由/服务)上,或者明确查询全局插件。
- 数据库查询存在一定性能开销,高并发场景建议结合缓存使用。
方案2:通过ngx.ctx传递插件A的配置
利用Nginx的请求上下文ngx.ctx,在插件A的access阶段将配置存入上下文,插件B直接从上下文读取。这种方法性能最优,但需要调整插件执行顺序。
步骤1:修改插件A的access函数,存入配置到上下文
function A:access(config) -- 将插件A的配置存入请求上下文 ngx.ctx.plugin_a_config = config end
步骤2:修改插件B的access函数,读取上下文配置
function B:access(config) -- 从请求上下文获取插件A的配置 local a_config = ngx.ctx.plugin_a_config if a_config then -- 使用a_config中的字段 else kong.log.warn("插件A未在当前请求中执行,或优先级低于插件B") end end
注意事项:
- 必须确保插件A的执行优先级高于插件B:在插件A的schema中设置更高的
priority值(数值越大,执行越早),比如插件A设priority = 1000,插件B设priority = 900。 - 仅适用于插件A和B在同一请求链中执行的场景(即两者都作用于当前请求的实体)。
方案3:使用共享字典缓存插件A的配置
如果插件A是全局配置,或者需要频繁访问其配置,可以利用Kong的共享字典(shared dict)缓存配置,减少数据库查询开销。
步骤1:在Kong配置中定义共享字典
在kong.conf中添加:
lua_shared_dict plugin_a_cache 1m;
步骤2:插件A初始化时缓存配置
function A:init_worker() -- 定期刷新缓存(比如每5分钟) local function refresh_cache() local plugin_a, err = kong.db.plugins:select_by_name("A") if plugin_a then kong.cache.set("plugin_a_config", plugin_a.config) end -- 5分钟后再次刷新 ngx.timer.at(300, refresh_cache) end -- 首次初始化缓存 refresh_cache() end
步骤3:插件B读取缓存中的配置
function B:access(config) local a_config, err = kong.cache:get("plugin_a_config") if a_config then -- 使用a_config中的字段 else kong.log.err("获取插件A缓存配置失败: ", err) end end
注意事项:
- 适合全局插件场景,需要处理缓存失效逻辑(比如配置更新后手动刷新缓存)。
- 共享字典内存有限,仅缓存必要的配置字段可节省空间。
内容的提问来源于stack exchange,提问作者Adibov
相关产品推荐
相关产品推荐

