Antipattern: utilizzare il criterio callout di servizio per richiamare un servizio di backend in un proxy API senza target

Stai visualizzando la documentazione di Apigee e Apigee hybrid.
Visualizza la documentazione di Apigee Edge.

Un proxy API è una facciata gestita per i servizi di backend. Una configurazione di proxy API di base è composta da un ProxyEndpoint (che definisce l'URL del proxy API) e da un TargetEndpoint (che definisce l'URL del servizio di backend).

Apigee offre molta flessibilità per creare comportamenti sofisticati in base a questo pattern. Ad esempio, puoi aggiungere criteri per controllare il modo in cui l'API elabora una richiesta del client prima di inviarla al servizio di backend o manipolare la risposta ricevuta dal servizio di backend prima di inoltrarla al client. Puoi richiamare altri servizi utilizzando i criteri di callout dei servizi, aggiungere un comportamento personalizzato aggiungendo codice JavaScript e persino creare un proxy API che non richiama un servizio di backend.

Antipattern

L'utilizzo di callout di servizio per richiamare un servizio di backend in un proxy API senza route a un endpoint di destinazione è tecnicamente fattibile, ma comporta la perdita dei dati di analisi sulle prestazioni del servizio esterno.

Un proxy API che non contiene route target può essere utile nei casi in cui non è necessario inoltrare il messaggio di richiesta a TargetEndpoint. Al contrario, ProxyEndpoint esegue tutta l'elaborazione necessaria. Ad esempio, ProxyEndpoint potrebbe recuperare i dati da una ricerca nell'archivio chiavi/valori del servizio API e restituire la risposta senza richiamare un servizio di backend.

Puoi definire una route null in un proxy API, come mostrato di seguito:

<RouteRule name="noroute"/>

Un proxy che utilizza una route null è un proxy "senza target", perché non richiama un servizio di backend di destinazione.

È tecnicamente possibile aggiungere un callout di servizio a un proxy senza target per richiamare un servizio esterno, come mostrato nell'esempio seguente:

<!-- /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>

Tuttavia, il proxy non può fornire informazioni di analisi sul comportamento del servizio esterno (ad esempio tempo di elaborazione o tassi di errore), rendendo difficile valutare il rendimento del servizio esterno.

Impatto

  • Le informazioni di analisi sull'interazione con il servizio esterno ( codici di errore, tempo di risposta, prestazioni target e così via) non sono disponibili
  • Qualsiasi logica specifica richiesta prima o dopo l'invocazione del callout del servizio è inclusa come parte della logica complessiva del proxy, rendendo più difficile la comprensione e il riutilizzo.

Best practice

Se un proxy API interagisce con un solo servizio esterno, deve seguire il pattern di progettazione di base, in cui il servizio di backend è definito come endpoint di destinazione del proxy API. Un proxy senza regole di routing per un endpoint di destinazione non deve richiamare un servizio di backend utilizzando il criterio ServiceCallout.

La seguente configurazione del proxy implementa lo stesso comportamento dell'esempio precedente, ma segue le best practice:

<!-- /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>

Utilizza i callout di servizio per supportare scenari di mashup, in cui vuoi richiamare servizi esterni prima o dopo aver richiamato l'endpoint di destinazione. I callout di servizio non sono pensati per sostituire l'invocazione dell'endpoint di destinazione.

Per approfondire