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

关于lua-resty-http库connect方法的澄清及Kong插件开发问询

使用lua-resty-http的connect方法通过Kong代理访问后端服务

我刚好做过类似的Kong插件开发,你的需求核心就是借助Kong的代理能力跳过特殊主机名解析,用lua-resty-http的connect方法直接复用Kong对后端服务的配置逻辑就行,下面给你具体的实现思路和代码示例:

核心思路

不用自己去处理特殊格式的主机名解析,直接让Kong帮我们做这件事:通过connect方法连接到Kong已配置的后端服务主机,然后发起请求到目标路径/endpoint-providing-info,最后把获取到的信息传递给上游服务(比如通过请求头)。

完整代码示例

local http = require "resty.http"
local kong = kong

-- 封装获取后端信息的函数
local function fetch_shared_info()
    -- 初始化http客户端
    local httpc = http.new()

    -- 关键:用connect连接到Kong配置中的后端服务主机
    -- 这里的host填你在Kong里配置的后端服务主机名,不用自己解析特殊格式
    local ok, err = httpc:connect("your-backend-service-host", 80)
    if not ok then
        kong.log.err("连接后端服务失败: ", err)
        return nil, err
    end

    -- 如果后端是HTTPS服务,需要添加SSL握手步骤
    -- local ok, err = httpc:ssl_handshake(nil, "your-backend-service-host", false)
    -- if not ok then
    --     kong.log.err("SSL握手失败: ", err)
    --     httpc:close()
    --     return nil, err
    -- end

    -- 发起请求到目标路径
    local res, err = httpc:request({
        method = "GET",
        path = "/endpoint-providing-info",
        headers = {
            -- 必须指定Host头,匹配Kong路由配置中的Host规则
            ["Host"] = "your-backend-service-host"
        }
    })

    if not res then
        kong.log.err("发送请求失败: ", err)
        httpc:close()
        return nil, err
    end

    -- 读取响应体
    local body, err = res:read_body()
    httpc:close() -- 关闭连接

    if err then
        kong.log.err("读取响应体失败: ", err)
        return nil, err
    end

    return body, nil
end

-- 在Kong插件的access阶段执行逻辑
local function access_handler()
    local shared_info, err = fetch_shared_info()
    if shared_info then
        -- 将获取到的信息通过请求头传递给上游服务
        kong.service.request.set_header("X-Shared-Backend-Info", shared_info)
    else
        kong.log.err("获取后端信息失败: ", err)
        -- 这里可以根据业务需求选择返回错误,或者允许请求继续
    end
end

return {
    access = access_handler
}

关键细节说明

  • httpc:connect(host, port):这里的host直接用你在Kong中配置的后端服务主机名即可,Kong会自动处理该主机名的解析(包括特殊格式的),不需要你自己去处理解析逻辑。
  • SSL握手:如果后端是HTTPS服务,一定要调用ssl_handshake方法,第二个参数要填和后端证书匹配的主机名。
  • Host头:请求中的Host头必须和Kong路由配置中的Host规则一致,这样Kong才能正确把请求路由到/endpoint-providing-info路径。
  • 信息传递:示例中用请求头传递信息,你也可以根据需求用其他方式(比如修改请求体),但请求头是最简单直接的方式。

最后别忘了在Kong中正确配置后端服务和对应的路由,确保/endpoint-providing-info路径能被正确匹配到。

内容的提问来源于stack exchange,提问作者Andrés Soto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:11:32