【问题标题】:Accessing datastore from Golang plugin从 Golang 插件访问数据存储
【发布时间】:2023-01-22 10:29:24
【问题描述】:

在 Lua 中编写插件时,kong.db 模块可用于访问 Kong 的底层数据库。

我假设它也应该可以从用 Go 编写的插件中与数据库通信。还是我在这里错了?

如果可能的话,获取数据库驱动程序所需的连接详细信息的方法是什么?

我在 Docker 容器中运行 Kong 并通过环境变量传递所有相关配置,例如

ENV KONG_PG_HOST=host
ENV KONG_PG_USER=user
ENV KONG_PG_DATABASE=kong
ENV KONG_PG_PORT=5432

从插件中调用os.Getenv("KONG_PG_HOST") 没有返回任何结果。

【问题讨论】:

    标签: kong kong-plugin


    【解决方案1】:

    使用 Lua,您的插件在底层有很大不同。 Kong 内置了一个 Lua 解释器。使用 golang、js 或 python,使用 unix 域套接字与 Kong 通信。

    Go 插件使用 msgpack-RPC 服务器通过此套接字进行通信,我没有看到任何与数据库相关的命令以及 CmdHandleEvent 等。我认为您必须修改 go-pdk 和 kong 本身才能公开此访问权限。

    这可能不是很高效:https://github.com/Kong/go-pdk/issues/31#issuecomment-617798934

    【讨论】:

      【解决方案2】:

      因此,正如评论中提到的 @david-chandler 链接的 go-pdk 的目标之一是促进 Go 生态系统中任何库的使用。一切都很清楚,这里没有问题。

      我无法掌握的是如何将数据库连接详细信息(如主机、用户、密码等)传递给任何 Go 数据库驱动程序——在我的例子中是在 Kong 的 Docker 文件中定义的。

      深入研究 Kong 的 source code 后发现,在 pluginserver_XXX_start_cmd 配置属性下指定的任何内容都是使用 exec 命令执行的。

      知道我决定只传递我需要的所有配置作为命令参数,也就是说我的 Docker 文件会像这样:

      FROM kong
      ...
      ENV KONG_PG_HOST=...
      ENV KONG_PG_USER=...
      ...
      ENV KONG_PLUGINSERVER_NAMES=my-plugin
      ENV KONG_PLUGINSERVER_MY_PLUGIN_START_CMD="/usr/local/bin/my-plugin $KONG_PG_HOST $KONG_PG_USER
      ...
      

      从 Go 代码可以通过 os.Args 访问这些参数

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-16
        • 2013-09-07
        • 1970-01-01
        • 1970-01-01
        • 2016-08-19
        • 2016-07-27
        • 2019-04-14
        • 2021-05-05
        相关资源
        最近更新 更多