关于nginx:lua-resty-http:connect方法的说明

lua-resty-http:connect method clarification

我一直在实现一个kong插件,该插件需要发出HTTP请求以检索信息以与上游服务共享。

有一个很棒的库叫做lua-resty-http,可以用来发出HTTP请求。

包含所需信息的服务,该服务在代理后面配置,并且与以下路径匹配:/endpoint-providing-info.

目标是依靠代理功能来避免必须解析主机名,该主机名具有与此问题无关的某些特殊形式。

通过玩耍,我可以通过执行以下操作来达到所需的行为:

1
2
3
4
5
6
7
local ok, err = http_client:connect("127.0.0.1", ngx.var.server_port)
if not ok and err then return nil, 'there was a failure opening a connection: ' .. err
local res, err = http_client:request({
    method = 'GET',
    path = '/endpoint-providing-info'
})
//parse the response, etc...

请求被路由到上游服务,并按预期工作。

我主要关注的是以下内容:

通过连接到本地主机,我假设当前Nginx节点是参加请求的节点。这会影响性能吗?直接连接到集群是否更好/可行?


我想您为当前nginx配置一个与/endpoint-providing-info匹配的位置,使用代理模块并为集群配置上游。

如果您要使用lua-resty-http:

优点-您可以使用body_reader-一个迭代器函数,以流方式读取正文。

缺点-您的请求将通过内核边界(回送接口)。

另一种可能性是使用ngx.location.capture API发出子请求。

优点-子请求仅模仿HTTP接口,但没有额外的HTTP / TCP流量或IPC。一切都在C级别内部高效地进行。

缺点-这是完全缓冲的方法,无法有效应对较大的响应。

更新-IMO:

如果您希望上游服务器做出很大的响应,那么-lua-resty-http是您的选择。

如果您希望上游服务器提供许多小的响应,则应使用ngx.location.capture