Создать новый 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, как сказал Скотт.

Другие вопросы по тегам