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.