背景:
- 我们的网络服务是公司内部的,但有很多不同的系统使用它们
- 我们将努力尽可能弃用/删除旧版本的 api
有很多关于 Web 服务版本控制的信息,我们决定使用以下方法对我们的 Web 服务进行版本控制:
- 在 URL 中保留版本(我知道有些人反对这一点,但主要是关于 REST 服务)
- 将版本保存在命名空间中。
但是,现在我们正在决定如何实际实现这一点,在这里我们还没有找到太多关于最佳实践的信息。我们使用(Java):
- 定义我们的 Web 服务(和 Web 服务 api)的注释
- 使用 XML 注释进行注释的 POJO bean,用于定义内容
- 用于从/转换到业务层和 Web 服务 pojo 的转换器类
- 春天
因此,要在 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 服务。在维护代码时,可能更容易错误地影响以前版本的 Web 服务
- 没有代码重复。仅将更改作为新类实现
这两种方法都不是最佳的,但我们还没有找到很多关于这方面的信息。所以,我的问题是: 你会使用这两种方法中的哪一种?或者你会采取完全不同的方法吗?