2015-10-14 22 views
5

我有一個鈴聲應用程序,通過部署到生產作爲uberwar事情; myservice.war。在生產WAR文件被扔進碼頭的地方時,我通過雷音環本地運行遵循它的名字我可以讓lein ring server-headless在特定的servlet上下文中運行嗎?

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

,我需要它在相同的上下文中運行上下文中運行;爲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 
... 

lein ring將它部署到根環境中。

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

怎麼了?我如何直接將lein ring部署到我選擇的上下文名稱中?我需要curl -i -X GET http://localhost:10313/myservice/healthz從lein環工作

回答

1

解決此問題的一種方法是爲您的應用創建第二個(獨立)路由集。您還爲獨立案例創建第二個處理程序。然後,您可以使用Leiningen配置文件爲獨立案例和uberwar案例指定不同的處理程序。運行應用程序獨立時使用默認配置文件。在uberwar創建時使用:uberjar配置文件。因此,將戰爭部署到容器中時,將使用您的獨立處理程序與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)) 

現在,到在project.cljlein-ring配置。我們希望默認的戒指處理程序指向standalone-app。 uberwar的戒指處理程序應該指向app。在project.clj項目地圖:ring入口應該是這樣的(調整您的實際命名空間):

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

此外,合併以下到您的:profiles地圖在project.clj

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

請務必使用最新版本的lein-ring插件。版本0.9.7爲我工作。早期版本(如0.8.3)無法運行,因爲它們在運行uberwar任務時未使用:uberjar配置文件。

如果你這樣做了,並且假設你的war文件被稱爲myservice.war,那麼無論你的應用是以lein ring server-headless開頭還是在Jetty中部署war文件,URI的上下文部分都是相同的。

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

哦,我的。優秀的答案。明天我會看看它是否適合我。 –

+0

嗯。我可以看到它試圖做什麼,但是當我在Jetty中運行時,它總是找不到/ myservice/healthz。這個解決方案真的很聰明,但必須解釋2個不同的處理程序:ring vs:uberjar在代碼評論中將會是一個難題。這對我來說似乎是一個缺口,什麼?雷音環? –

+0

您看到的「未找到」回覆可能是由於uberjar配置文件在構建超級戰爭時沒有踢入。這可能是由於lein-ring插件的老版本或一些錯字造成的。如果'/ myservice/myservice/healthz'有效,那可能就是這個問題。 – ez121sl

相關問題