Я внедряю плагин kong, который должен делать HTTP-запросы для получения информации, чтобы поделиться ею с вышестоящими службами.
Существует отличная библиотека под названием lua-resty-http, которую можно использовать для выполнения HTTP-запросов.
Служба, которая содержит необходимую информацию, настроена за прокси и соответствует пути: /endpoint-providing-info.
Цель состоит в том, чтобы полагаться на возможности прокси, чтобы избежать необходимости анализировать имя хоста, имеющее определенную форму, не имеющую отношения к этому вопросу.
Играя, я смог добиться желаемого поведения, выполнив следующие действия:
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...
Запрос направляется в вышестоящую службу и работает должным образом.
Меня больше всего беспокоит следующее:
Подключившись к localhost, я предположил, что текущий узел Nginx обслуживает запрос. Повлияет ли это на производительность? Лучше / возможно ли подключиться к кластеру напрямую?
Я предполагаю, что вы настраиваете для текущего nginx расположение, соответствующее /endpoint-providing-info
, используете модуль прокси и настраиваете восходящий поток для кластера.
Если бы вы использовали lua-resty-http:
Плюсы - вы можете использовать body_reader - функцию итератора для чтения тела в потоковом режиме.
Минусы - ваш запрос будет проходить через границу ядра (интерфейс обратной связи).
Другая возможность - отправить подзапрос с помощью ngx.location.capture API.
Плюсы - подзапросы просто имитируют интерфейс HTTP, но не задействованы ни дополнительный трафик HTTP / TCP, ни IPC. Внутри все работает качественно, на уровне C.
Минусы - это полностью буферизованный подход, не будет работать эффективно при больших откликах.
Обновление - ИМО:
Если вы ожидаете от вышестоящего сервера больших ответов, -lua-resty-http - ваш выбор.
Если вы ожидаете от вышестоящего сервера много мелких ответов - следует использовать ngx.location.capture
.
Я добавил свое мнение в свой ответ
lua-resty-http намного удобнее. Но мне все еще интересно, могут ли перечисленные вами минусы вызвать некоторые потенциальные проблемы. Я предполагаю, что это не так, поскольку мы просто добавляем дополнительный запрос к тому же узлу, который его посещает.