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

您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件
資訊

API Proxy 是後端服務的代管途徑。基本的 API Proxy 設定由 ProxyEndpoint (定義 API Proxy 的網址) 和 TargetEndpoint (定義後端服務網址) 組成。

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

反模式

就技術上來說,如果在 API Proxy 中透過服務呼叫叫用後端服務,就不會有導向目標端點的路徑,但這麼做會遺失外部服務效能的分析資料。

不含目標路徑的 API Proxy 是不需要將要求訊息轉送至 TargetEndpoint 時相當實用。而 ProxyEndpoint 會改為執行所有必要的處理作業。舉例來說,ProxyEndpoint 可以在 API 服務的鍵/值存放區中進行查詢時擷取資料,並在不叫用後端服務的情況下傳回回應。

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

<RouteRule name="noroute"/>

使用空值路徑的 Proxy 即為「沒有目標」的 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 無法提供外部服務行為的數據分析資訊 (例如處理時間或錯誤率),因此難以評估外部服務的效能。

影響程度

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

最佳做法

如果 API Proxy 只與單一外部服務互動,Proxy 應遵循基本設計模式,其中後端服務的定義為 API Proxy 的目標端點。如果 Proxy 沒有轉送規則至目標端點,就不應使用 Service 稱 政策叫用後端服務。

下列 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>

您可以使用服務呼叫支援混搭情境,也就是您想在叫用目標端點之前或之後叫用外部服務的情況。服務呼叫無法取代目標端點叫用,

其他資訊