2015-10-14 3 views
5

मेरे पास एक रिंग ऐप है कि uberwar चीज़ के रूप में उत्पादन के लिए तैनाती के माध्यम से; myservice.war। उत्पादन में युद्ध फ़ाइल घाट में फेंक दिया जाता है जहां यह एक संदर्भ जब मैं lein अंगूठी के माध्यम से स्थानीय स्तर पर चलने वाले अपने नामक्या मैं एक विशिष्ट सर्वलेट संदर्भ पर लीन रिंग सर्वर-हेडलेस रन बना सकता हूं?

$ 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 
... 

लीन रिंग चीज इसे रूट संदर्भ पर तैनात किया गया।

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

इसके साथ क्या चल रहा है? मैं अपने चयन के संदर्भ नाम में तैनात करने के लिए लीन रिंग को कैसे निर्देशित करूं? मुझे लीन रिंग

उत्तर

1

इस समस्या के आसपास काम करने का एक तरीका है अपने ऐप के लिए दूसरे (स्टैंडअलोन) मार्गों का निर्माण करना है। आप स्टैंडअलोन मामले के लिए दूसरा हैंडलर भी बनाते हैं। फिर आप स्टैंडिनोन केस और उबेरवार मामले के लिए अलग-अलग हैंडलर निर्दिष्ट करने के लिए लीनिंगेन प्रोफाइल का उपयोग कर सकते हैं। ऐप स्टैंडअलोन चलाते समय डिफ़ॉल्ट प्रोफ़ाइल का उपयोग किया जाता है। :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.clj में lein-ring विन्यास पर निम्न मान लीजिए कि आपके मार्गों और अंगूठी हैंडलर हैं। हम डिफ़ॉल्ट रिंग हैंडलर को standalone-app पर इंगित करना चाहते हैं। उबेरवार के लिए रिंग हैंडलर को app पर इंगित करना चाहिए। इसके अलावा

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

, project.clj में अपने :profiles नक्शे में निम्नलिखित विलय: project.clj में परियोजना के नक्शे में :ring प्रविष्टि इस तरह दिखना चाहिए (आपका वास्तविक नाम स्थान के लिए समायोजित)

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

कृपया सुनिश्चित करें lein-ring प्लगइन के नवीनतम संस्करण का उपयोग करने के लिए। संस्करण 0.9.7 मेरे लिए काम किया। पहले संस्करण, जैसे 0.8.3, काम नहीं करते थे क्योंकि uberwar कार्य चलाते समय उन्होंने :uberjar प्रोफ़ाइल का उपयोग नहीं किया था।

यदि आप यह सब करते हैं, और मानते हैं कि आपकी युद्ध फ़ाइल को myservice.war कहा जाता है, तो यूआरआई का संदर्भ हिस्सा वही होगा जैसा आपका ऐप lein ring server-headless के साथ शुरू हुआ है या यदि जेट फ़ाइल जेटी में तैनात की गई है।

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

ओह मेरा। उत्कृष्ट जवाब कल मैं देखूंगा कि यह मेरे लिए काम करता है या नहीं। –

+0

हम्म।मैं देख सकता हूं कि यह क्या करने की कोशिश कर रहा है, लेकिन जब मैं जेटी में चलता हूं तो यह हमेशा/myservice/healthz के लिए नहीं मिलता है। यह समाधान वास्तव में चालाक है, लेकिन इसमें 2 अलग-अलग हैंडलर समझाएंगे: रिंग बनाम: uberjar कोड समीक्षाओं में एक कठिन बिक्री होने जा रहा है। यह मेरे लिए एक अंतर लगता है, क्या? lein रिंग? –

+0

"नहीं मिला" प्रतिक्रिया जो आप देखते हैं वह uberjar प्रोफ़ाइल के कारण हो सकता है जो उबेरवार के निर्माण में लात मार रहा है। यह 'लीन-रिंग' प्लगइन या कुछ टाइपो के पुराने संस्करण के कारण हो सकता है। यदि '/ myservice/myservice/healthz' काम करता है, तो शायद यह समस्या है। – ez121sl

संबंधित मुद्दे