您正在查看 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>
您可以使用服務呼叫支援混搭情境,也就是您想在叫用目標端點之前或之後叫用外部服務的情況。服務呼叫無法取代目標端點叫用,