反模式:使用服務呼叫政策在 No Target API Proxy 中叫用後端服務

您目前查看的是 ApigeeApigee Hybrid 說明文件。
查看 Apigee Edge 說明文件。

API Proxy 是後端服務的代管門面元件。基本 API Proxy 設定包含 ProxyEndpoint (定義 API Proxy 的網址) 和 TargetEndpoint (定義後端服務的網址)。

Apigee 提供許多彈性,可讓您根據這個模式建構複雜的行為。舉例來說,您可以新增政策,控管 API 處理用戶端要求的方式,然後再將要求傳送至後端服務;也可以在轉送至用戶端前,先處理從後端服務收到的回應。您可以使用服務呼叫政策叫用其他服務,也可以新增 JavaScript 程式碼來新增自訂行為,甚至建立不叫用後端服務的 API Proxy。

反模式

在沒有目標端點路徑的 API Proxy 中,使用服務呼叫叫用後端服務在技術上可行,但會導致外部服務效能的 Analytics 資料遺失。

如果不需要將要求訊息轉送至 TargetEndpoint,不含目標路徑的 API Proxy 就非常實用。ProxyEndpoint 會執行所有必要的處理作業。舉例來說,ProxyEndpoint 可以從 API 服務的鍵/值儲存空間擷取資料,並傳回回應,不必叫用後端服務。

您可以在 API Proxy 中定義 null Route,如下所示:

<RouteRule name="noroute"/>

使用空值路徑的 Proxy 是「無目標」Proxy,因為它不會叫用目標後端服務。

從技術上來說,您可以在沒有目標 Proxy 的情況下新增服務呼叫,以叫用外部服務,如下列範例所示:

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

不過,Proxy 無法提供外部服務行為的分析資訊 (例如處理時間或錯誤率),因此難以評估外部服務的效能。

影響

  • 無法取得與外部服務互動的分析資訊 ( 錯誤代碼、回應時間、目標效能等)
  • 在叫用服務呼叫前後所需的任何特定邏輯,都會納入整體 Proxy 邏輯,因此較難理解和重複使用。

最佳做法

如果 API Proxy 只與單一外部服務互動,Proxy 應採用基本設計模式,將後端服務定義為 API Proxy 的目標端點。如果 Proxy 沒有前往目標端點的轉送規則,就不應使用 ServiceCallout 政策叫用後端服務。

下列 Proxy 設定會實作與上述範例相同的行為,但遵循最佳做法:

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

使用服務呼叫支援混搭情境,在叫用目標端點之前或之後,您想叫用外部服務。服務呼叫並非用來取代目標端點叫用。

延伸閱讀