关于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
相关产品推荐
相关产品推荐

