维护多个WebService API版本的方法


类型:Java,创建时间:Dec. 31, 2011, 1:33 a.m.

标题无“转载”即原创文章,版权所有。转载请注明来源:http://hgoldfish.com/blogs/article/17/。

随着软件系统的不断发展,与其相配套的API也必定会发生着不断的变化。如何降低API变化对外部系统的影响是大多数软件系统都要面对的挑战。

在设计指令集、SDK或者API时,向后兼容可以说是最基本的道德,这已经被无法的例子所验证。不过随着软件系统功能的不断增加,维持原来的API往往是不可能的。两相权宜,只能选择有条件的向后兼容。通常的做法是保留原来的函数,然后增加新的函数。比如CreateWindow(String className),如果要新增了一个参数,名为style,那么我们可以再新增一个函数如CreateWindowEx(String className, String style)。显而易见,这种方法是最简便的,却可能不是最好的。利用高级语言的特性可以把它修改为具有默认参数的函数如:CreateWindow(String className, String style="default"),或者简单地再创建一个新的同名函数:CreateWindow(String className, String style)。虽然不能指定默认参数的值,但是Web Service支持前一种做法。

比如,原来的参数是:

<complexType name="reateWindowRequest">
    <xsd:sequence>
        <xsd:element name="className" type="xsd:string"/>
    </xsd:sequence>
</complexType>

那新的具有默认参数的函数可以是:

<complexType name="CreateWindowRequest">
    <xsd:sequence>
        <xsd:element name="className" type="xsd:string"/>
        <xsd:element name="style" type="xsd:string" minOccurs="0"/>
    </xsd:sequence>
</complexType>

可以注意到style参数拥有minOccurs="0"这样的属性。如果使用旧版本的客户端程序进行调用,服务器端将会得到一个值为nullstyle参数。

可能难以理解的是,为什么还可以使用旧版本的客户端程序进行调用呢?这是因为Web Service程序根据WSDL文档生成SOAP消息,前后两个版本的WSDL生成的SOAP消息其实是一样的,Web Service服务器不会注意到客户端程序的不同。

那如果碰到必须指定参数值的情况该怎么办呢?上述三种方法都不能用上,就只好老老实实地修改CreateWindow函数了,新的函数是:CreateWindow(String className,String style)。如果我们使用WebService的话,修改过的WSDL是:

这样的WSDL文档使用旧的客户端程序调用,在服务器就会立即提示解析SOAP消息出错,style元素是空的。这里实际上碰到了一个经典的问题:新的软件系统已经被建造出来,要如何才能替换掉旧的软件系统呢?有两种方案:停止旧的软件系统,直接换上新的软件系统;或者同时运行两个系统,待新的软件系统验收通过的话,停止旧的软件系统。前者简单易行,花费低,后者则稳妥可靠,耗费人力。不过,对于需要与众多外部系统交互的软件系统,后者是最佳的方案。

考虑CreateWindow函数,我们可以分别为新旧两个WSDL文档创建对应的URL以及对应的实现方式。尽量让旧的实现方式保留下来。比如:

旧:http://api.example.com/gui/v1

新:http://api.example.com/gui/v2

这样的话,旧的客户端就可以继续运行。这也正是Google解决这个问题的方法。非常适用于API的大更新

标题无“转载”即原创文章,版权所有。转载请注明来源:http://hgoldfish.com/blogs/article/17/。


暂时还没有任何评论。


何不来发表一下您对本文的看法(使用Markdown语法,分段空两行):