6

में एपीआई गेटवे का उपयोग करते समय हैटओएएस पथ अमान्य हैं, मेरे पास दो स्प्रिंग बूट एप्लिकेशन हैं, जिनमें से एक एपीआई गेटवे के रूप में कार्य कर रहा है (जैसा कि Spring Example पर चर्चा की गई है)। दूसरा जो वायर्ड है, वसंत-डेटा-आराम (वसंत-डेटा-नियो 4j-rest) का उपयोग करके प्रोफ़ाइल सेवा का खुलासा कर रहा है।स्प्रिंग बूट ऐप

पहले आवेदन पोर्ट 8080 पर शुरू कर रहा है और दूसरे के लिए रास्ते में अनुरोध करने के लिए zuul उपयोग कर रहा है इस प्रकार है:

zuul: 
    routes: 
    profiles: 
     path: /profiles/** 
     url: http://localhost:8083/profiles/ 

यह सब ठीक काम करता है और http://localhost:8080/profiles करने के लिए अनुरोध दूसरा app से कार्य किया जा रहा है। समस्या यह है कि प्रतिक्रिया में हैटओएएस लिंक गलत हैं। कि दूसरी सेवा को कॉल करने से प्रतिक्रिया सही हैं:

{ 
    "_links": { 
     "self": { 
      "href": "http://localhost:8083/profiles{?page,size,sort}", 
      "templated": true 
     }, 
     "search": { 
      "href": "http://localhost:8083/profiles/search" 
     } 
    }, 
    "_embedded": { 
     "profiles": [ 
      { 
       "name": "Andrew Rutter", 
       "_links": { 
        "self": { 
         "href": "http://localhost:8083/profiles/0" 
        } 
       } 
      }, 
      { 
       "name": "Andrew Rutter", 
       "_links": { 
        "self": { 
         "href": "http://localhost:8083/profiles/1" 
        } 
       } 
      } 
     ] 
    }, 
    "page": { 
     "size": 20, 
     "totalElements": 2, 
     "totalPages": 1, 
     "number": 0 
    } 
} 

लेकिन जब यह मेरी एपीआई गेटवे में वापस आता है, लिंक

{ 
    "name": "Andrew Rutter", 
    "_links": { 
    "self": { 
     "href": "http://localhost:8080/profiles/profiles/0" 
    } 
    } 
} 

फिर से लिखा जा रहा है प्रवेश द्वार पथ उर्फ ​​प्लस वास्तविक सेवा है कौन सा बेस उरी क्या मुझे उस व्यवहार को अक्षम करने के लिए एक zuul विकल्प गुम है और मेजबान समायोजन के साथ नफरत यूरी को बस छोड़ दें। या गेटवे के पीछे मेरी सेवा के लिए एक तरीका है/इसके बजाए/प्रोफाइल के डिफ़ॉल्ट संसाधन समापन बिंदु (इस मामले में) जो अवांछित पथ में जोड़ा जा रहा है, इससे बचने के लिए

धन्यवाद!

उत्तर

5

जुउल या स्प्रिंग-क्लाउड सभी अग्रेषित अनुरोधों के लिए "एक्स-फॉरवर्डेड-होस्ट" हेडर जोड़ता है, जो स्प्रिंग-नफरो का सम्मान करता है और लिंक को उचित रूप से संशोधित करता है। स्प्रिंग-क्लाउड डॉक्स से उद्धरण के लिए:

एक्स-फॉरवर्डेड-होस्ट हेडर डिफ़ॉल्ट रूप से अग्रेषित अनुरोधों में जोड़ा गया। इसे बंद करने के लिए zuul.addProxyHeaders = false सेट करें। उपसर्ग पथ डिफ़ॉल्ट रूप से छीन लिया गया है, और बैकएंड के लिए अनुरोध शीर्षलेख "X-Forwarded-Prefix" ("/ myusers" उपरोक्त उदाहरणों में) उठाता है।

आप की सिफारिश ठीक है, जो/प्रोफाइल contextPath को zuul.addProxyHeaders=false

+0

सुझाव के लिए धन्यवाद। झूठ बोलने का नतीजा यह है कि लौटाए गए लिंक बैकएंड सेवा के सीधा लिंक हैं जो अवांछित हैं। मैंने देखा कि वसंत-नफरत संस्करण 0.16.0 में लाया गया था इसलिए इस निर्भरता को वर्तमान तक बदलने की कोशिश की लेकिन कोई खुशी नहीं। चीजों को और स्पष्ट करने के लिए मैंने गेटवे में एपीआई पथ/xyz को बदल दिया था। जब मैं एक विशिष्ट प्रोफ़ाइल/xzy/0 के रूप में अनुरोध करता हूं, तो इसे आंतरिक रूप से/प्रोफाइल/0 पर भेजा जाता है लेकिन प्रतिक्रिया में घृणित लिंक/xyz/प्रोफाइल/0/प्रोफाइल/0 –

0

Zuul आगे स्थापित करने के लिए प्रयास कर सकते हैं।

विन्यास के रूप में इस सेट करके देखें:

zuul: 
    routes: 
    profiles: 
     path: /profiles/** 
     url: http://localhost:8083/ 
+0

धन्यवाद होता है, मैंने पहले ही कोशिश की थी और मूल अनुरोध से संदर्भ पथ सेवा में पारित नहीं किया गया है। उपर्युक्त उदाहरण में, मुझे 404 मिलते हैं कि स्प्रिंग डेटा रेस्ट इस मॉडल के लिए मॉडल/प्रोफाइल/* के आधार पर एंडपॉइंट्स का खुलासा नहीं करता है, लेकिन गेटवे स्वचालित रूप से –

+0

पर पारित नहीं होता है क्या आपने zuul की कोशिश की है : मार्ग: प्रोफाइल: पथ:/** यूआरएल: http: // localhost: 8083/प्रोफाइल/ ? –

0

एक ही समस्या के साथ कुछ समय संघर्ष करने के बाद, अंत में मैं zuul.addProxyHeaders = true की कोशिश की है और यह काम करता है! लिंक अब और नहीं टूटे हैं।

0

डेमो ऐप में मैंने स्प्रिंग डेटा रीस्ट के बारे में मेरी बात में स्प्रिंगऑन के लिए उपयोग किया था, मेरे पास यूआरआई रीराइट्स को संभालने के साथ-साथ उपसर्ग हेडर्स को व्यवस्थित करने के लिए निम्न कॉन्फ़िगरेशन भी है।

zuul: 
    routes: 
    api: 
     path: /api/** 
     serviceId: spring-a-gram-backend 
     stripPrefix: false 
    files: 
     path: /files/** 
     serviceId: spring-a-gram-mongodb-fileservice 
     stripPrefix: false 

https://github.com/gregturn/spring-a-gram/blob/master/spring-a-gram-frontend/src/main/resources/application.yml#L23-L32

3

मैं बिल्कुल वैसा ही समस्या थी पर पूरा करते हुए देखें।इस प्रकार अपने config बदलें:

zuul: 
    routes: 
    profiles: 
     path: /profiles/** 
     url: http://localhost:8083 
     stripPrefix: false 

इस मार्गों सभी अनुरोधों को "/ प्रोफाइल/**" अपनी पीठ अंत सर्वर "http://localhost:8083" के लिए प्रवेश द्वार मिलान करने के लिए जा रहा है और ("/ प्रोफाइल" के बाद से अपने मामले में उपसर्ग छोड़ देता है यही वह मार्ग है जो मार्ग से मेल खाता है)।