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

您正在查看 ApigeeApigee Hybrid 說明文件。
查看 Apigee Edge 說明文件。

API Proxy 是後端服務的受管理外觀。基本 API Proxy 設定包含 ProxyEndpoint (定義 API Proxy 的網址) 和 TargetEndpoint (定義後端服務的網址)。

Apigee 提供極大的彈性,可讓您在這個模式上建構複雜的行為。舉例來說,您可以新增政策來控制 API 處理用戶端要求的方式,然後再將要求傳送至後端服務,或是在將從後端服務收到的回應轉寄給用戶端前,先加以操控。您可以使用服務呼叫政策來叫用其他服務,也可以透過新增 JavaScript 程式碼來新增自訂行為,甚至可以建立不叫用後端服務的 API 代理程式。

反模式

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

如果您不需要將要求訊息轉送至 TargetEndpoint,不含目標路徑的 API Proxy 就非常實用。而是由 ProxyEndpoint 執行所有必要的處理作業。舉例來說,ProxyEndpoint 可以從查詢 API 服務的鍵/值儲存庫擷取資料,並在未呼叫後端服務的情況下傳回回應。

您可以在 API Proxy 中定義 空值路徑,如下所示:

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

使用服務呼叫來支援混合情境,也就是在叫用目標端點之前或之後叫用外部服務的情境。服務呼叫並非用來取代目標端點叫用。

延伸閱讀