Anti-Pattern: Service-Callout-Richtlinie verwenden, um einen Backend-Dienst in einem No Target API Proxy aufzurufen.

Sie sehen die Dokumentation zu Apigee Edge.
Zur Apigee X-Dokumentation
weitere Informationen

Ein API-Proxy ist eine verwaltete Fassade für Backend-Dienste. Eine grundlegende API-Proxykonfiguration besteht aus einem ProxyEndpoint (der die URL des API-Proxys definiert) und einem TargetEndpoint (der die URL des Back-End-Dienstes definiert).

Apigee Edge bietet viel Flexibilität, um anspruchsvolles Verhalten auf diesem Muster aufzubauen. Sie können beispielsweise Richtlinien hinzufügen, um zu steuern, wie die API eine Clientanfrage verarbeitet, bevor sie an den Back-End-Dienst gesendet wird, oder die vom Back-End-Dienst empfangene Antwort ändern, bevor sie an den Client weitergeleitet wird. Sie können andere Dienste mithilfe von Richtlinien für Dienst-Callouts aufrufen, durch Hinzufügen von JavaScript-Code benutzerdefiniertes Verhalten hinzufügen und sogar einen API-Proxy erstellen, der keinen Back-End-Dienst aufruft.

Anti-Pattern

Die Verwendung von Dienst-Callouts zum Aufrufen eines Back-End-Dienstes in einem API-Proxy ohne Routen zu einem Zielendpunkt ist technisch machbar, führt jedoch zum Verlust von Analysedaten über die Leistung des externen Dienstes.

Ein API-Proxy, der keine Zielrouten enthält, kann nützlich sein, wenn Sie die Anfragenachricht nicht an den TargetEndpoint weiterleiten müssen. Der ProxyEndpoint führt stattdessen die erforderliche Verarbeitung durch. Der ProxyEndpoint könnte beispielsweise Daten aus einer Suche zum Schlüssel/Wert-Speicher des API-Dienstes abrufen und die Antwort zurückgeben, ohne einen Back-End-Dienst aufzurufen.

Sie können eine Null-Route in einem API-Proxy definieren, wie hier gezeigt:

<RouteRule name="noroute"/>

Ein Proxy, der eine Nullroute verwendet, ist ein Proxy ohne Ziel, da er keinen Ziel-Back-End-Dienst aufruft.

Es ist technisch möglich, einem Zielproxy einen Service Callout hinzuzufügen, um einen externen Dienst aufzurufen, wie im folgenden Beispiel gezeigt:

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

Der Proxy kann jedoch keine Analyseinformationen über das Verhalten des externen Dienstes bereitstellen (z. B. Verarbeitungszeit oder Fehlerraten), was es schwierig macht, die Leistung des externen Dienstes zu bewerten.

Auswirkungen

  • Es sind keine Analysedaten zur Interaktion mit dem externen Dienst (Fehlercodes, Antwortzeit, Zielleistung usw.) verfügbar.
  • Jede spezifische Logik, die vor oder nach dem Aufrufen des Service-Callouts erforderlich ist, ist Teil der gesamten Proxylogik, sodass sie schwerer zu verstehen und wiederzuverwenden ist.

Best Practice

Wenn ein API-Proxy nur mit einem einzigen externen Dienst interagiert, sollte der Proxy dem grundlegenden Designmuster folgen, bei dem der Back-End-Dienst als Zielendpunkt des API-Proxys definiert ist. Ein Proxy ohne Routingregeln zu einem Zielendpunkt sollte keinen Back-End-Dienst mit der ServiceCallout-Richtlinie aufrufen.

Die folgende Proxy-Konfiguration implementiert das gleiche Verhalten wie im obigen Beispiel, befolgt jedoch die Best Practices:

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

Verwenden Sie Service Callouts, um Mashup-Szenarien zu unterstützen, in denen Sie externe Dienste vor oder nach dem Aufruf des Zielendpunkts aufrufen möchten. Service Callouts sollen nicht den Ziel-Endpunktaufruf ersetzen.

Weitere Informationen