2013-08-27 73 views
3

我正在與我的團隊一起工作在我們工作的「核心」領域,我們有幾個DB,Webservices,Importer等等......我們通過後端WCF webservice向其他團隊公開域服務。這個web服務在幾個api(或地區)中被切斷。 我們在幾臺生產服務器(~80臺)上部署(1臺服務器< - > 1個客戶)。分支webservice api版本

問題是:有些api上市,我們必須通過許多版本維護相同的合同。其他團隊想要更多的靈活性(3內部API合同版本),因爲他們不能遵循我們的交付率(更長的週期)

其實我們只是作爲一個整體,我們正在使用經典的三分支分支/ MAIN/RELEASE'n')

我想升級我的TFS團隊收集組織處理的每個API版本定義版本的範圍:

  • API富V2(hxxp:// - 主機 -/api/foo/v2/...)
  • API Foo v3(hxxp:// - host-/api/foo/v3/...)
  • API Bar v1(hxxp:// - host-/api/bar/v1/...)
  • API Bar v2(hxxp:// - host-/api/bar/v2/...)

目前,我們有以下分支架構:

$\MyTeamCollection 
|___\DEV {Branch} 
    |___\Databases 
     |___\MyDBProj (SSDT) 
    |___\Documents 
     |___\MyWebService\MyWebSvc.Usage.docx 
    |___\Projects 
     |___\MyWebService.Core 
     |___\MyWebService.API.Bar 
     |___\MyWebService.API.Foo 
    |___\Shared 
     |___\MyDB\MyDB.DacPac, etc... 
     |___\MyWebService\MyWebsvc.Bar.Contract.Dll <-- WCF DataContract/ServiceContract 
     |___\MyWebService\MyWebsvc.Foo.Contract.Dll 
|___\MAIN {Branch} <-- This one is what is on the integration server 
|___\R1 {Branch} <-- This one went on a production server and is kept aside 
|___\R2 {Branch} 
|___\Archive 
    |___\R0 {Branch} <-- This one is obsolete but is archived here 

其實它處理一組單API版本的。 =>每個發佈船有一套最新的api版本(Foo,Bar)

我的問題是我怎麼能演變這個來處理每個版本中的多個Api版本(Foo-v1,Foo-v2,bar-v3, bar-v4) 我應該在分支內創建分支嗎?這不是一場噩夢嗎? 任何實際工作的團隊組織在你身邊?

謝謝, -Jeremy。

一些補充:

所有我的客戶都是淨,我們爲他們提供一個名爲MyWebsvc.Foo.Contract.Dll大會。該組件包含:

其由代理模式

[ServiceContract] 
public interface IFooService { 
    Foo Get(int Id); 
} 

而需要的所有數據契約(DTO +串行化)

[DataContract] 
public class Foo { 
    // ... 
} 

上的Web服務側實施

的ServiceContract接口有實際執行

public class FooServiceImpl : FooApi.IFooService { ... } 
+0

你是否考慮過在IIS上運行不同的應用程序? – Aron

+0

我已經考慮過這個問題,但問題是:我正在使用實體框架來實現數據訪問層,它與數據庫模式緊密結合。當我有模式的演變時,我必須更新所有IIS應用程序(8個apis x 3個版本x 80個客戶) –

回答

1

Jeremy,

有幾個問題需要考慮。

a)您的客戶是.net還是可以使用任何技術?WCF有一個非常好的「兼容」版本機制,但不幸的是它不是標準的,只適用於.Net客戶端。

b)您是否有能力爲客戶端如何使用服務提供一些指導?

控制此問題的唯一方法是採用「兼容」版本控制策略。正如您所指出的那樣,您希望在生產中有幾個(最多3個)主要版本,並且每次您創建一個或多個主要版本時,都希望創建兼容(次要)版本,以便每個版本始終只有一個版本主要版本的服務正在運行。

從TFS的角度來看,我會考慮每個主要版本彼此獨立,因爲從本質上講,它們是有些獨立的服務。據我所知,創建更多的工作,因爲你可以有一些適用於多個主要版本的更新,但恕我直言,嘗試優化它是不值得的,除非你正在同時積極處理所有主要版本。

要實現從一個版本到下一個版本的「兼容性」並不難,在服務端和客戶端都需要遵循許多準則。我共同撰寫這篇文章早在2008年http://www.infoq.com/articles/contract-versioning-comp2

我也寫了博客文章近日專門爲基於HTTP的API:http://www.ebpml.org/blog2/index.php/2013/04/13/formalizing-the-api-style

我想強調的是,它通常是用一個小版本一個很好的想法,由客戶端提供,以指示在構建服務時哪個版本的服務有效。這是因爲您可以通過了解兼容的服務的哪個次要版本來以兼容的方式處理小的重大更改。每個主要版本仍然有單一版本,並且變體直接由最新(次要)版本的服務處理。

版本控制是一個健康的API的關鍵,允許客戶根據自己的條件(風險,預算,資源等)進行升級,並且據我所知,「兼容版本控制」策略是可行的最好。

+0

感謝您的詳細解答和您寫的真正有趣的博客文章。我還沒有時間深入挖掘他們,我現在只是快速閱讀。 ** a&b)**我所有的客戶都是使用服務契約作爲程序集的.NET(MyWebsvc.Bar.Contract.Dll),它爲他們提供了服務接口(代理模式)的實現。接口和所有需要的類都包含在提供的程序集中。 –

2

爲了這個答案的目的,我想你已經徹底地審查了在線提供的豐富的版本控制分支和合並指南。因此,我懷疑在「更多」版本控制中可能找不到答案,而是在功能啓用並可供客戶使用的方式上進行適度調整。因此,您可能會發現實施功能切換解決方案會減少您需要維護的發佈版本的數量。 Martin Fowler撰寫的以下文章很好地概述了功能切換。

http://martinfowler.com/bliki/FeatureToggle.html

我們的開發團隊已經使用功能切換的概念,在我們的自承載WCF Windows服務,爲客戶提供完全可配置的設置,可以通過配置來啓用/禁用(及調整)端點。在這種情況下,我們通常利用客戶的數據存儲庫(數據庫,ldap等)來存儲配置值和切換開關,然後在服務運行時搜索存儲庫中的配置,然後設置並啓用接口客戶需要/希望的方式。

希望這會有所幫助。
此致敬禮。

+0

感謝您的回答。 FeatureToggle不適用於我的問題。這不是關於啓用或禁用功能。這是關於API版本化並在源代碼管理中進行管理的。順便說一下,我們通過將正確的程序集放在某個目錄中來啓用整個API。 Webservice內核尋找它們,並且api程序集在路由引擎中註冊它自己的URL。因此,刪除或添加api程序集會禁用或啓用功能。 –