clojure/lein/ring: у меня есть два обработчика кольца, которые делают разные вещи, как мне обернуть это в сервлет?

У меня есть проект clojure/ring, в котором два разных приложения / обработчика работают на разных портах (один для API и один для веб-интерфейса). У них много общего кода, но у каждого есть свое пространство имен, в котором он выполняет всю работу, связанную с этим интерфейсом. Теперь я хочу развернуть это как сервлет, работающий в tomcat или что-то подобное (на самом деле он должен работать в любом контейнере сервлета). У меня возникли проблемы, потому что кажется, что lein-ring предполагает, что в сервлете будет только один обработчик. Например, в моем project.clj у меня есть эта строка:

:ring {:handler caribou.api/app
       :servlet-name "caribou"
       :init caribou.api/init}

Это отлично подходит для API, но теперь как насчет фронтэнда? Нужно ли мне сделать еще один проект, включающий этот, чтобы он мог иметь свой собственный обработчик и сервлет? Всегда ли сервлет работает на одном порту?

Есть две вещи, в которых я не уверен в принципе: я не из java, поэтому я не уверен, что происходит с подходом сервлета и какие у него ограничения, и мне неясно, как именно clojure переводится в парадигмы сервлета достаточно, чтобы структурировать этот проект в общем виде.

Любая помощь приветствуется, спасибо!

1 ответ

Решение

Все сервлеты в одном и том же контейнере обслуживаются с одного сервера и, следовательно, с одного и того же порта. Обычно вы идентифицируете разные сервлеты, назначая им разные префиксы URI, такие как /servlet1 или же /my/servlet,

Я не знаю, есть ли что-то, что мешает вам создавать отдельные сервлеты с помощью Ring, но в целом не очень хорошая идея, если все ваше приложение основано на Clojure. Как минимум, как вы указали, плагин lein-ring обеспечивает использование только одного сервлета для веб-приложения.

Одна вещь, которую вы можете сделать, - это создать родительский обработчик, который делегирует обработчикам приложения или API на основе URI. Это, по сути, дает вам контроль без необходимости делегировать логику сервлету API.

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