背景:
- 我们的Web服务是公司内部使用的,但有很多不同的系统在使用它们
- 我们将努力尽可能废弃/删除旧版本的API
关于Web服务版本控制有很多信息,我们决定采用以下方法来对我们的Web服务进行版本控制:
- 在URL中保留版本号(我知道有些人反对这个做法,但主要是针对REST服务)
- 在命名空间中保留版本号。
但是,现在我们正在决定如何实际实现此功能,在这方面我们没有找到太多最佳实践的信息。我们使用(Java):
- 注释来定义我们的Web服务(以及Web服务API)
- 带有XML注释的POJO bean,用于定义内容
- 转换器类,用于在业务层和Web服务pojo之间进行转换
- Spring
因此,为了保留Web服务的旧版本,我们需要保留旧代码的旧版本。为此,我们基本上考虑了两种不同的方法:
1)为每个新版本制作一个完整的相关代码的副本
这种方法看起来像这样:
com.company.webservice.v3. -all of the web service classes, POJO’s and converters go here
com.company.webservice.v4. -all of the web service classes, POJO’s and converters go here
所以,这里我们有重复的代码。简而言之:
- 代码重复。将会存在多个具有相同代码的类。在Eclipse中可能会令人困惑。
- 完全隔离,易于确定特定版本的构成
- 最小化影响前几个版本服务功能的风险
2) 使用Spring只复制受更改影响的每个类
这种方法意味着使用Spring IoC,让所有版本的Web服务尽可能使用相同的代码。仅当我们进行影响行为/API的更改时,才会创建这些类的新版本。例如:
com.company.webservice.beans.MyXMLAnnotatedPOJOv3.java
com.company.webservice.beans.MyXMLAnnotatedPOJOv4.java
com.company.webservice.translators.MyXTranslatorv1.java
com.company.webservice.translators.MyXTranslatorv2.java
- 很难清楚地看到哪个版本是特定的Web服务。在维护代码时,可能会错误地影响以前的版本。
- 不会有代码重复。只有更改会被实现为新的类。
两种方法都不是最理想的,但我们没有找到太多相关信息。 那么,我的问题是: 你会选择这两种方法中的哪一种?还是采取完全不同的方法?