17

背景:

  • 我们的网络服务是公司内部的,但有很多不同的系统使用它们
  • 我们将努力尽可能弃用/删除旧版本的 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 服务
  • 没有代码重复。仅将更改作为新类实现

这两种方法都不是最佳的,但我们还没有找到很多关于这方面的信息。所以,我的问题是: 你会使用这两种方法中的哪一种?或者你会采取完全不同的方法吗?

4

1 回答 1

6

从 Java 生成 wsdls 时,我会使用包解决方案:

com.company.webservice.v3.  

它存在代码重复问题,但是 POJO 和转换器在版本之间可能存在差异,因此代码重用毕竟可能不太可行。主要优点是,如果您想摆脱旧版本,只需删除相关包即可。

我会在 URL 中保留版本号,因为无论如何你都不在做 REST。此外,如果某些版本仍在使用,您可以检查访问日志。

于 2012-12-13T12:21:50.037 回答