एंटीपैटर्न: 'कोई टारगेट एपीआई नहीं' प्रॉक्सी में बैकएंड सेवा शुरू करने के लिए, सेवा कॉलआउट की नीति का इस्तेमाल करें

Apigee Edge दस्तावेज़ देखा जा रहा है.
Apigee X दस्तावेज़ पर जाएं.
जानकारी

एपीआई प्रॉक्सी, बैकएंड सेवाओं के लिए मैनेज किया जा रहा एक हिस्सा है. एपीआई के बुनियादी कॉन्फ़िगरेशन में एक ProxyEndpoint (एपीआई प्रॉक्सी का यूआरएल) और एक TargetEndpoint (बैकएंड सेवा का यूआरएल तय करता है) शामिल होता है.

Apigee Edge, इस पैटर्न के साथ-साथ, बेहतर व्यवहार करने में भी मदद करता है. उदाहरण के लिए, किसी क्लाइंट अनुरोध को बैकएंड सेवा को भेजने से पहले, एपीआई उसके प्रोसेस के तरीके को कंट्रोल करने के लिए नीतियां जोड़ें. इसके अलावा, क्लाइंट को फ़ॉरवर्ड करने से पहले, बैकएंड सेवा से मिले रिस्पॉन्स में बदलाव किया जा सकता है. सेवा कॉलआउट की नीतियों का इस्तेमाल करके, अन्य सेवाएं शुरू की जा सकती हैं, JavaScript कोड जोड़कर कस्टम व्यवहार जोड़ा जा सकता है, और एक ऐसा एपीआई प्रॉक्सी भी बनाया जा सकता है जो बैकएंड सेवा का इस्तेमाल नहीं करता.

एंटीपैटर्न

सेवा कॉलआउट का इस्तेमाल करके, एपीआई प्रॉक्सी में ऐसी बैकएंड सेवा शुरू की जा सकती है जिसके लिए टारगेट एंडपॉइंट पर कोई रूट न हो. हालांकि, इससे बाहरी सेवा की परफ़ॉर्मेंस के आंकड़ों का डेटा मिट सकता है.

ऐसा एपीआई प्रॉक्सी जिसमें टारगेट रूट शामिल नहीं होते, आपके लिए उन मामलों में मददगार हो सकते हैं जहां आपको अनुरोध मैसेज को TargetEndpoint पर भेजने की ज़रूरत न हो. इसके बजाय, प्रॉक्सीEndpoint सभी ज़रूरी प्रोसेसिंग करता है. उदाहरण के लिए, ProxyEndpoint एपीआई सेवा के कुंजी/वैल्यू स्टोर के लिए, लुकअप से डेटा हासिल कर सकता है और बिना बैकएंड सेवा के रिस्पॉन्स दे सकता है.

आप एपीआई प्रॉक्सी में शून्य रूट तय कर सकते हैं, जैसा कि यहां दिखाया गया है:

<RouteRule name="noroute"/>

शून्य रूट का इस्तेमाल करने वाली प्रॉक्सी, "कोई टारगेट नहीं" प्रॉक्सी होती है, क्योंकि यह किसी टारगेट बैकएंड सेवा को शुरू नहीं करती.

किसी बाहरी सेवा को शुरू करने के लिए, सेवा कॉलआउट को 'कोई टारगेट प्रॉक्सी नहीं' में जोड़ना तकनीकी रूप से संभव है, जैसा कि इस उदाहरण में दिखाया गया है:

<!-- /antipatterns/examples/service-callout-no-target-1.xml -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProxyEndpoint name="default">
    <Description/>
    <FaultRules/>
    <PreFlow name="PreFlow">
        <Request>
            <Step>
                <Name>ServiceCallout-InvokeBackend</Name>
            </Step>
        </Request>
        <Response/>
    </PreFlow>
    <PostFlow name="PostFlow">
        <Request/>
        <Response/>
    </PostFlow>
    <Flows/>
    <HTTPProxyConnection>
        <BasePath>/no-target-proxy</BasePath>
        <Properties/>
        <VirtualHost>secure</VirtualHost>
    </HTTPProxyConnection>
    <RouteRule name="noroute"/>
</ProxyEndpoint>

हालांकि, प्रॉक्सी सर्वर, बाहरी सेवा के काम करने के तरीके (जैसे कि प्रोसेसिंग में लगने वाला समय या गड़बड़ी की दरें) के बारे में आंकड़ों की जानकारी नहीं दे सकता. इससे बाहरी सेवा की परफ़ॉर्मेंस का आकलन करना मुश्किल हो जाता है.

असर

  • बाहरी सेवा के साथ इंटरैक्शन के बारे में Analytics की जानकारी उपलब्ध नहीं है. जैसे, गड़बड़ी कोड, जवाब देने में लगने वाला समय, टारगेट परफ़ॉर्मेंस वगैरह
  • सेवा कॉलआउट शुरू करने से पहले या बाद में ज़रूरी कोई भी लॉजिक, कुल प्रॉक्सी लॉजिक के हिस्से के तौर पर शामिल होता है. इससे इसे समझने और दोबारा इस्तेमाल करने में मुश्किल होती है.

सबसे सही तरीका

अगर कोई एपीआई प्रॉक्सी सिर्फ़ एक बाहरी सेवा से इंटरैक्ट करता है, तो प्रॉक्सी को बेसिक डिज़ाइन पैटर्न का पालन करना चाहिए, जहां बैकएंड सेवा को एपीआई प्रॉक्सी के टारगेट एंडपॉइंट के तौर पर तय किया जाता है. जिस प्रॉक्सी सर्वर के पास टारगेट एंडपॉइंट के लिए रूटिंग का कोई नियम नहीं है उसे सर्विसकॉलआउट नीति का इस्तेमाल करके, बैकएंड सेवा शुरू नहीं करनी चाहिए.

नीचे दिया गया प्रॉक्सी कॉन्फ़िगरेशन, ऊपर दिए गए उदाहरण की तरह ही काम करता है. हालांकि, इसके लिए सबसे सही तरीके अपनाएं:

<!-- /antipatterns/examples/service-callout-no-target-2.xml -->
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProxyEndpoint name="default">
    <Description/>
    <FaultRules/>
    <PreFlow name="PreFlow">
        <Request/>
        <Response/>
    </PreFlow>
    <PostFlow name="PostFlow">
        <Request/>
        <Response/>
    </PostFlow>
    <Flows/>
    <HTTPProxyConnection>
        <BasePath>/simple-proxy-with-route-to-backend</BasePath>
        <Properties/>
        <VirtualHost>secure</VirtualHost>
    </HTTPProxyConnection>
    <RouteRule name="default">
        <TargetEndpoint>default</TargetEndpoint>
    </RouteRule>
</ProxyEndpoint>

मैशअप की स्थितियों में मदद के लिए, सेवा कॉलआउट का इस्तेमाल करें. ऐसा तब करें, जब आपको टारगेट एंडपॉइंट पर कॉल करने से पहले या बाद में बाहरी सेवाएं शुरू करनी हों. सेवा कॉलआउट, टारगेट एंडपॉइंट के शुरू किए जाने की जगह तय करने के लिए नहीं हैं.

इसके बारे में और पढ़ें