2015-10-14 2 views
5

У меня есть приложение «Кольцо», которое разворачивается до производства как вещь uberwar; myservice.war. В производстве файл WAR получает бросил в Jetty, где он работает в контексте, который следует названиеМогу ли я запускать бегущий сервер без заголовка в конкретный контекст сервлета?

$ curl -i -X GET http://myservice.qa1.example.com:8080/myservice/healthz 
HTTP/1.1 200 OK 
... 

Когда я бегу локально через LEIN кольцо, мне это нужно, чтобы работать в том же контексте; MyService.

$lein ring server-headless 
2015-10-14 14:04:03,457 level=INFO [main] Server:271 - jetty-7.6.13.v20130916 
2015-10-14 14:04:03,482 level=INFO [main] AbstractConnector:338 - Started [email protected]:10313 
Started server on port 10313 

Но тот же самый локоть идет на всех 404 на меня локально.

$ curl -i -X GET http://localhost:10313/myservice/healthz 
HTTP/1.1 404 Not Found 
... 

Кольцо с изгибом развернуло его в корневом контексте.

$ curl -i -X GET http://localhost:10313/healthz 
HTTP/1.1 200 OK 
... 

Что это? Как я могу привязать кольцо лейн к разворачиванию в имя контекста по своему выбору? Мне нужно curl -i -X GET http://localhost:10313/myservice/healthz для работы с lein ring

ответ

1

Один из способов обойти эту проблему - создать второй (автономный) набор маршрутов для вашего приложения. Вы также создаете второй обработчик для отдельного случая. Затем вы можете использовать профили Leiningen для указания разных обработчиков для отдельного случая и случая uberwar. Профиль по умолчанию используется при автономном выполнении приложения. Профиль :uberjar используется при создании uberwar. В результате ваш автономный обработчик будет использоваться с lein ring server-headless, и ваш обычный обработчик будет использоваться, когда война будет развернута в контейнер.

Не требуется дополнительного кода для создания второго набора маршрутов. Вы можете просто обернуть существующие маршруты в выбранном вами контексте. Предположим, что следующие ваши маршруты и кольцо обработчик:

(defroutes app-routes 
    (GET "/healthz" [] "Hello World") 
    (route/not-found "Not Found")) 

(def app 
    (wrap-defaults app-routes site-defaults)) 

Дополнительные маршруты и обработчик для автономного случае будет выглядеть следующим образом:

(defroutes standalone-routes 
    (context "/myservice" req app-routes) 
    (route/not-found "Not Found")) 

(def standalone-app 
    (wrap-defaults standalone-routes site-defaults)) 

Теперь, на lein-ring конфигурации в project.clj. Мы хотим, чтобы обработчик кольца по умолчанию указывал на standalone-app. Кольцевой обработчик для uberwar должен указывать на app. :ring запись в карте проекта в project.clj должен выглядеть следующим образом (настроить для фактического пространства имен):

:ring {:handler myservice.handler/standalone-app} 

Кроме того, объединить следующие в вашей :profiles карте в project.clj:

:uberjar {:ring {:handler myservice.handler/app}} 

Пожалуйста, убедитесь, что для использования последней версии плагина lein-ring. Версия 0.9.7 работала для меня. Более ранние версии, такие как 0.8.3, не работали, потому что они не использовали профиль :uberjar при запуске задачи uberwar.

Если вы сделаете все это и считаете, что ваш файл войны называется myservice.war, контекстная часть URI будет одинаковой, независимо от того, запущено ли ваше приложение с lein ring server-headless или если военный файл развернут в Jetty.

$ curl http://localhost:[port]/myservice/healthz 
+0

О, мой. Отличный ответ. Завтра я посмотрю, получится ли это для меня. –

+0

Хммм.Я вижу, что он пытается сделать, но когда я запускаю Jetty, он всегда не найден для/myservice/healthz. Это решение действительно умное, но для объяснения двух разных обработчиков в: ring vs: uberjar будет жесткой продажей в обзорах кода. Кажется, это пробел для меня, что? Lein кольцо? –

+0

Ответ «Не найден», который вы видите, может быть вызван профилем uberjar, который не срабатывает при создании убервара. Это может быть связано с старой версией плагина «lein-ring» или некоторой опечаткой. Если '/ myservice/myservice/healthz' работает, то это, вероятно, проблема. – ez121sl