您正在查看 Apigee 和 Apigee 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>
使用服務呼叫來支援混合情境,也就是在叫用目標端點之前或之後叫用外部服務的情境。服務呼叫並非用來取代目標端點叫用。