反模式:使用服務呼叫政策在 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 服務的查詢, 的值,並在不叫用後端服務的情況下傳回回應。

您可以定義 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 無法提供外部服務行為的分析資料 (例如處理時間或錯誤率),因此難以評估外部服務的效能。

影響

  • 外部服務互動的 Analytics 資訊 (錯誤代碼、回應時間、 目標成效等
  • 叫用服務摘要之前或之後所需的任何特定邏輯,均包含在 部分的值,導致使用者難以理解及重複使用。

最佳做法

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

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

使用服務呼叫來支援混搭內容,也就是您想先叫用外部服務的情況 或在叫用目標端點後服務呼叫不會取代目標端點 呼叫。

延伸閱讀