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

Sie lesen gerade die Dokumentation zu Apigee und Apigee Hybrid.
Apigee Edge-Dokumentation aufrufen.

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

Apigee bietet ein hohes Maß an Flexibilität für die Erstellung eines differenzierten Verhaltens auf diesem Muster. 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 vor dem Weiterleiten an den Client bearbeiten. Sie können andere Dienste mithilfe von Service-Callout-Richtlinien aufrufen, benutzerdefiniertes Verhalten hinzufügen, indem Sie JavaScript-Code hinzufügen und sogar einen API-Proxy erstellen, der keinen Back-End-Dienst aufruft.

Anti-Pattern

Die Verwendung von Service-Erweiterungen mit Zusatzinformationen zum Aufrufen eines Back-End-Dienstes in einem API-Proxy ohne Routen zu einem Zielendpunkt ist technisch möglich, führt jedoch zu einem Verlust von Analysedaten der 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 zum Beispiel Daten aus einem Lookup zum Schlüssel/Wert-Speicher des API-Dienstes abrufen und die Antwort zurückgeben, ohne einen Back-End-Dienst aufzurufen.

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

<RouteRule name="noroute"/>

Ein Proxy mit einer Nullroute ist ein „Kein Ziel“-Proxy, 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 Analysedaten über das Verhalten des externen Dienstes bereitstellen (z. B. Verarbeitungszeit oder Fehlerrate), sodass es schwierig ist, 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 einzelnen externen Dienst interagiert, sollte der Proxy dem grundlegenden Designmuster folgen, wobei der Back-End-Dienst als Zielendpunkt des API-Proxys definiert ist. Ein Proxy ohne Routingregeln zu einem Zielendpunkt darf keinen Back-End-Dienst mithilfe 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