You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 18:12:41