Создать новый HTTP-вызов из Ring Request
Я хочу перенаправить веб-запрос в другой сервис. Я хочу ничего не менять в них и отправить их в другой сервис (я полагаю, что-то вроде http-clj). Результат тогда сделает тот же прыжок.
Это необходимо, потому что мы заменяем часть службы, но у нас не может быть службы вызова клиентов напрямую.
Мы разворачиваемся в кота, но обычно он должен работать для любого запроса вызова.
Есть ли элегантный способ сделать это?
Спасибо
3 ответа
Это не специфичный для Ring ответ, но я чувствую, что вам лучше использовать обратный прокси, такой как Nginx, перед вашим старым веб-сервисом и новым веб-сервисом-заменителем.
Обратный прокси-сервер может легко реагировать на различные входящие URL-адреса и прозрачно передавать их нужному веб-сервису. Это гибкий и мощный подход, который позволит использовать множество вариантов схемы секционированных URL-адресов по мере роста вашего сервиса.
В течение многих лет я делал это в тех случаях, когда запрос приходит, и он должен идти в два разных места. (здесь рассуждает очередь о микросервисах и законе непреднамеренных последствий). Обычно я остановился на схеме использования core.async с http-kit.
(handler .....
(let [output (chan)]
(http/post bakcend-url (make-new-request-options request)
#(do (async/>!! output %)
(async/close! output)))
(go (async/<! (async/timeout 2000))
(async/>! output {:status 500}))
... )
Возможно, самый простой способ - просто вернуть ответ 301 Moved Permanently с правильным заголовком Location.
Если вы действительно хотите выполнить запрос, вы в основном реализуете HTTP-прокси, и это, вероятно, очень быстро усложнит задачу, и вам лучше использовать обратный прокси-сервер, такой как Nginx, как сказал Скотт.