2015-10-14 7 views
5

Ho un'app Ring che si distribuisce in produzione come una cosa uberwar; myservice.war. Nella produzione del file WAR viene gettato in Jetty dove si corre in un contesto che segue il suo nomeÈ possibile eseguire l'esecuzione headless del server lein ring su uno specifico contesto servlet?

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

Quando ho eseguito a livello locale attraverso l'anello Lein, ho bisogno di correre nello stesso contesto; 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 

Ma lo stesso ricciolo va su tutti i 404 su di me localmente.

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

La cosa del lein ring lo ha implementato nel contesto radice.

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

Che dire? Come faccio a dirigere le lein ring per la distribuzione in un nome di contesto da me scelto? Ho bisogno di curl -i -X GET http://localhost:10313/myservice/healthz per lavorare da lein ring

risposta

1

Un modo per ovviare a questo problema è creare il secondo set di percorsi (standalone) per la tua app. Si crea anche il secondo gestore per il caso indipendente. Quindi puoi usare i profili di Leiningen per specificare diversi gestori per il caso standalone e il caso uberwar. Il profilo predefinito viene utilizzato quando si esegue l'applicazione autonoma. Il profilo :uberjar viene utilizzato quando viene creato il uberwar. Di conseguenza, il tuo gestore standalone verrà utilizzato con lein ring server-headless e il tuo gestore regolare verrà utilizzato quando la guerra viene distribuita in un contenitore.

Non è necessario molto codice aggiuntivo per creare la seconda serie di percorsi. Puoi semplicemente racchiudere le rotte esistenti in un contesto di tua scelta. Supponiamo che i seguenti sono le rotte e il gestore anello:

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

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

percorsi aggiuntivi e gestore per il caso standalone sarebbe simile a questa:

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

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

Ora, sulla lein-ring configurazione project.clj. Vogliamo che il gestore dell'anello predefinito indichi standalone-app. Il gestore dell'anello per l'uberwar dovrebbe puntare a app. La voce :ring nella mappa progetto in project.clj dovrebbe assomigliare a questo (regolare per lo spazio dei nomi reale):

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

Inoltre, unire il seguente nella vostra :profiles mappa in project.clj:

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

Si prega di essere sicuri utilizzare l'ultima versione del plug-in lein-ring. La versione 0.9.7 ha funzionato per me. Le versioni precedenti, come 0.8.3, non funzionavano perché non utilizzavano il profilo :uberjar quando eseguivano l'attività uberwar.

Se fate tutto questo, e supponendo che il file si chiama guerra myservice.war, la parte contesto della URI sta per essere lo stesso se la vostra applicazione viene avviata con lein ring server-headless o se il file di guerra viene distribuito in Jetty.

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

Oh mio. Ottima risposta Domani vedrò se funziona per me. –

+0

Hmmm.Posso vedere cosa sta cercando di fare, ma quando corro in Jetty è sempre Not Found per/myservice/healthz. Questa soluzione è davvero intelligente, ma dovendo spiegare i 2 diversi gestori in: ring vs: uberjar sarà una dura vendita nelle revisioni del codice. Mi sembra una lacuna, cosa? Lein-anello? –

+0

La risposta "Not Found" che si è vista potrebbe essere dovuta al fatto che il profilo uberjar non si avvia durante la costruzione di uberwar. Ciò potrebbe essere dovuto ad una vecchia versione del plugin 'lein-ring' o ad alcuni errori di battitura. Se '/ myservice/myservice/healthz' funziona, probabilmente questo è il problema. – ez121sl

Problemi correlati