3

我正在与我的团队一起处理我们工作的“核心”域,我们有几个 DB、Web 服务、导入器等……我们通过后端 WCF Web 服务向其他团队公开域服务。这个 web 服务被分成几个 api(或区域)。我们将其部署在多个生产服务器(~ 80)(1 个服务器 <-> 1 个客户)上。

问题是:一些 api 公开,我们必须在许多版本中保持相同的合同。其他团队想要更大的灵活性(3 个内部 api 合同版本),因为他们无法遵循我们的交付率(更长的周期)

实际上,我们只是将其作为一个整体来服务,并且我们使用的是经典的三分支分支 (DEV/MAIN/RELEASE'n')

我正在尝试升级我的 TFS 团队集合组织以处理每个 API 版本的定义版本范围:

  • API Foo v2 (hxxp://-host-/api/foo/v2/...)
  • API Foo v3 (hxxp://-host-/api/foo/v3/...)
  • API 栏 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)我应该在分支内创建分支吗?这不会是一场噩梦吗?你身边有任何实际的工作团队收集组织吗?

谢谢,-杰里米。

一些补充:

我所有的客户都是 .Net,我们为他们提供了名为 MyWebsvc.Foo.Contract.Dll 的程序集。该程序集包含:

ServiceContract 接口,由代理模式实现

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

并且需要所有数据合约(DTO + 序列化)

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

在 Web 服务端有实际的实现

    public class FooServiceImpl : FooApi.IFooService { ... }
4

2 回答 2

2

出于此答案的目的,我想您已经彻底审查了在线提供的大量版本控制分支和合并指南。因此,我怀疑答案可能不会在“更多”版本控制中找到,而是在功能启用和可供客户使用的方式的适度转变中找到。因此,您可能会发现实施功能切换解决方案将减少您需要维护的发布版本的数量。Martin Fowler 的以下文章很好地概述了功能切换。

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

我们的开发团队在我们的自托管 WCF Windows 服务中利用了功能切换的概念,以提供一组完全可配置的端点,可以通过配置启用/禁用(和调整)。在这种情况下,我们通常利用客户的数据存储库(数据库、ldap 等)来存储配置值和切换开关,然后当服务运行时,它会在存储库中搜索配置,然后设置并启用接口客户需要/想要的方式。

希望这可以帮助。
问候。

于 2013-09-05T12:12:00.673 回答
1

杰里米,

您需要考虑几个问题。

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 的关键,它允许客户根据自己的条件(风险、预算、资源……)进行升级,据我所知,“兼容的版本控制”策略是最有效的策略。

于 2013-09-04T07:03:38.493 回答