2015-10-14 4 views
5

Ich habe eine Ring-App, die durch die Produktion als uberwar Ding implementiert; meinservice.war. In der Produktion wird die WAR-Datei in Jetty geworfen, wo es in einem Kontext ausgeführt wird, der seinen NamenKann ich lein ring server-headless in einem bestimmten Servlet-Kontext ausführen lassen?

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

Wenn ich Ring laufen lokal durch lein, ich muss es laufen in diesem Zusammenhang folgt; mein Service.

$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 

Aber die gleiche Locke geht alle 404 auf mich lokal.

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

Die Lein-Ring-Sache entfaltete es auf den Wurzelkontext.

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

Was ist damit los? Wie lege ich lein ring an, um es in einen Kontextnamen meiner Wahl zu bringen? Ich brauche curl -i -X GET http://localhost:10313/myservice/healthz von Lein Ring zu arbeiten

Antwort

1

Eine Möglichkeit, um dieses Problem zu umgehen, ist die zweite (eigenständige) Reihe von Routen für Ihre App zu erstellen. Sie erstellen auch den zweiten Handler für den eigenständigen Fall. Dann können Sie Leiningen-Profile verwenden, um verschiedene Handler für den Standalone-Fall und den Uberwar-Fall anzugeben. Das Standardprofil wird verwendet, wenn die App eigenständig ausgeführt wird. Das Profil :uberjar wird verwendet, wenn der Überwar erstellt wird. Als Ergebnis wird Ihr Standalone-Handler mit lein ring server-headless verwendet und Ihr regulärer Handler wird verwendet, wenn der Krieg in einem Container bereitgestellt wird.

Es ist nicht viel zusätzlicher Code erforderlich, um den zweiten Satz von Routen zu erstellen. Sie können die vorhandenen Routen einfach in einen Kontext Ihrer Wahl einbinden. Angenommen, die folgenden sind Ihre Routen und Ring-Handler:

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

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

Weitere Routen und Handler für das Standalone-Fall würde wie folgt aussehen:

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

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

Nun, auf lein-ring Konfiguration in project.clj. Wir möchten, dass der standardmäßige Ringhandler auf standalone-app zeigt. Der Ring-Handler für den Uberwar sollte auf app zeigen. Der :ring Eintrag im Projekt Karte in project.clj soll wie folgt aussehen (für Ihren tatsächlichen Namensraum anpassen):

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

Auch fusionieren folgende in Ihre :profiles Karte in project.clj:

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

Bitte achten Sie darauf, um die neueste Version des lein-ring Plugins zu verwenden. Version 0.9.7 hat für mich funktioniert. Frühere Versionen wie 0.8.3 funktionierten nicht, da sie das Profil :uberjar bei der Ausführung der Task uberwar nicht verwendeten.

Wenn Sie all dies tun und angenommen wird, dass Ihre WAR-Datei myservice.war heißt, ist der Kontextteil des URI derselbe, unabhängig davon, ob Ihre App mit lein ring server-headless gestartet wird oder ob die WAR-Datei in Jetty bereitgestellt wird.

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

Oh mein. Ausgezeichnete Antwort. Morgen werde ich sehen, ob es für mich klappt. –

+0

Hmmm.Ich kann sehen, was es zu tun versucht, aber wenn ich in Jetty laufe, ist es immer nicht gefunden für/myservice/healthz. Diese Lösung ist wirklich clever, aber die zwei verschiedenen Handler zu erklären: Ring vs: Uberjar wird ein schwieriger Verkauf in Code-Reviews sein. Dies scheint eine Lücke zu mir in, was? Lein-Ring? –

+0

Die Antwort "Nicht gefunden", die Sie sehen, kann darauf zurückzuführen sein, dass das Uberjar-Profil beim Erstellen des Uberwars nicht angezeigt wird. Dies könnte an einer alten Version des "Lein-Ring" -Plugins oder an einem Tippfehler liegen. Wenn '/ myservice/myservice/healthz' funktioniert, ist das wahrscheinlich das Problem. – ez121sl

Verwandte Themen