2014-04-25 59 views
1

我目前負責使用.Net和Web Api開發一個相當複雜的REST API。Asp.Net使用負載平衡器(第4層)的Web Api版本控制

該接口後來應該被各種公共和私人(內部)客戶使用。 我讀了很多關於你應該如何版本你的API,但意見似乎非常不同。

該應用程序在多服務器環境中的負載平衡器後面運行。

現在我的問題是,負載平衡器是硬限制,只支持第4層負載平衡,所以我無法檢查傳入請求的URL /頭等路由他們到正確版本的應用。

我們不希望在我們的代碼庫中擁有版本化的api控制器,因爲我們有很多外部依賴應該經常更新,所以我們可能會破壞一些功能。

目前,它似乎是使用子域進行版本控制的唯一解決方案,例如,

ver1.api.domain.com

有反對這種做法任何事情,你有沒有其他解決辦法?

+0

即使在級別4上完成負載均衡......如果目標服務器不支持所需的服務版本,那麼將請求轉發給另一臺服務器會出現什麼問題?特別是如果l.b.完成了一些簡單的事情,比如循環賽IMO,它不會影響性能。 –

+0

所以我需要設置另一種負載均衡器(在第4層之後),它可以解析標題將請求轉發到正確的服務器。如果可能,我想避免這種情況。 – coalmee

回答

1

該版本控制方法的問題是,所有資源(包括未修改的資源)都會有重複條目。

在我看來,更好的方法是在Uri中包含一個資源版本。 讓我們來看一個具體的例子。假設有像下面的一個CarsController:

public class CarsController : ApiController 
{ 
    [Route("cars/{id}")] 
    public async Task<IHttpActionResult> Get(int id) 
    { 

     DoSomething(); 

     return Ok(result); 
    } 


} 

首次發佈後,我們引入了Get方法的第二個版本,我們可以做這樣的事情

[路線(「汽車/ {ID }/V2" )

public async Task<IHttpActionResult> GetCarsVersion2(int id) 
{ 
    DoSomethingElse(); 

    return Ok(result); 

} 

所以現有的客戶端仍引用舊的烏里/汽車/ {ID},而新的客戶端可以使用新的URI /汽車/(編號)/ V2。另外,如果兩個版本之間沒有太多差異,則可以對原始實現進行重構以滿足新的要求。這反過來又減少了代碼重複。

+0

這似乎是版本控制問題的有效答案。但是這仍然不能解決我的第4層負載平衡問題。 – coalmee