06月 6th, 2008 | by 邓芝 |

闲话SOA服务化之–接口和协议

在系统SOA化之后,不可避免的就遇到接口的问题,在Java环境使用XFire。常遇到:接口不匹配,服务依赖者不能动态切合等问题。

后来不知如何,就说起了银行的系统:多平台,多语言,物理分布,有购买的产品,有多开发商开发的产品,业务负责,存在协议(多是核心金融业务)、接口调用等多种方式。很是佩服之。随就接口方式和协议方式进行了一些比较。

【术语:

  1. 协议 — 协议包含了数据格式,同时规定了行为等方面的内容,例如邮件协议,RPC协议。
  2. 格式 — 对信息的编码。例如:XML格式。
  3. 接口方式 — 指程序接口调用实现业务交换的方式。例如:java API调用。
  4. 协议方式 — 通过某种报文(信息是满足格式的)实现业务交换的方式。例如:收邮件,发邮件。

比较点 基于接口 基于协议
开发人员编程期的易用性 容易理解

使用方便

可以直接编程

较难理解

使用较麻烦

不能直接编程

架构从单系统到多系统变迁的过程 平滑迁移 修改协议相关的代码
支持工具的方便、稳定性 有现成的工具,如xfire

稳定性很好

不需要考虑序列化问题

与Spring整合的非常好,程序员不需要关注序列化,传输,安全等问题

外界维护工具

可以使用xml binding1等工具1

需要考虑序列化问题

缺少一个类似这样的完整工具,让程序员爽

需要自己维护工具

自我校验 基于接口校验,例如
验证

工具自动支持

很容易自动方式检测不匹配性

编译时检查

基于协议校验,例如
schema验证

缺少工具自动支持

运行时检查

方法名称变更 需要变更,甚至重新发布系统(可以通过配置文件来避免重新发布) 不需要变化

通常协议内部包含着业务指令号;
rpc方式的方法名,类似指令的作用

方法参数变化(增加,减少) 需要变更,重新发布系统 没有方法参数概念
方法参数类型变化(具体值得内涵没有变化,例如
123,从int变为string)
可能会失败 没有方法参数概念
参数是对象类型,对象属性变化(增加,减少) 增加不会失败,是否变化,依赖业务需求。如果业务上兼容该协议,那么也不需要变化;否则需要重新发布系统

这也是风险点(但可评估)

减少没有测试

没有对象参数概念
协议变化(增加,减少协议项)

(与)

没有协议概念 可能会失败,依赖业务需求。

如果是技术上的一个协议项变化,那么可以不变化,也不会失败

如果业务上兼容该协议,那么也不需要变化;否则需要重新发布系统

这也是风险点(但可评估)

增加方法 可能在自检查的时候系统级别失败

业务级别会失败

相当于增加了一个业务指令

系统级别不会失败

业务级别会失败

存在同名方法(参数类型不同,但相似)如(
int和double
会失败 没有该概念
工作流类、
JS类产品与业务结合的时候
需要引入多个接口

或使用动态
API模式

直接操作协议
一个业务的多个操作时的表示,例如:增,删,修改,查 通常是多个方法来表示不同业务 一个协议
+指令就可以解决

缺点:需要细心,别用错了指令(测试阶段可以解决)

运行期稳定性问题 测试和系统检查可以确保运行起稳定性 需要很细心的测试和部分系统检查来确保运行期稳定性
接口变动太随意 由于容易,且是基于操作的,所以每个程序员都可以自由使用 由于复杂,而且是基于业务的,需要清晰、仔细的定义,反而因祸得福
管理方面 SOA的相关支持工具,比如服务仓库,能够使用一种元语言完整地定义服务的契约,再根据这些元定义生成
一系列东西
缺少这方面的支持

需要自己开发相关工具

但产品经理可以通过业务层的管理来管理协议,从而约束开发

版本问题 解决较为麻烦 解决较为容易
与路由概念配合 较为麻烦 由于基于协议,与路由结合起来反而容易
投入成本
学习成本 较高
从实施工程的角度看 组织的软件成熟能力度要求低,项目管理要求中.开发人员人员水平偏低,更需要强约束的框架或者实现方式。 组织的软件成熟能力度高,项目管理要求中高

【说明:】虽然SOAP也定义了文档格式,但在实际使用中,使用者很少。毕竟,文档格式方式的WS走到是协议思路。

【闲话杂聊】

最近看到REST方式,它非常流行,很多网站的OpenAPI都基于它来搞,我们也准备尝试之。看了深入浅出REST一文,初步了解了一下它的资源概念,还是有些不知所措;又看到Building Web Services the REST Way一文,其中一句话“REST - An Architectural Style, Not a Standard”,指出了本质,原来我们可以在它的框架下使用接口方式,也可以使用协议方式。

结合它的目标是描述资源—互联网资源,我们就会发现,互联网界的大部分内容都是用协议来描述的,例如:HTTP协议,HTML协议等。 再看看google的RESTful API Specification,虽然是API,也基本是用半个协议的方式进行描述(它的JS标准部分,完全是接口的方式,毕竟这个时候不存在整合的需求。Facebook的API,也基本上接口方式,输入参数按照HTTP提交方式,输出部分到部分定义了格式。)

在开放互联网界使用的Rest + 格式方式 ==?协议吗【注:我看到axis在搞 Rest (序列化部分用XML格式),这东西和非Rest 的WS有哪些本质区别?】在企业内部是否依然也有很强的生命力?— 留给实践来检验吧。

【后感】

接口:内存调用 –〉RPC调用 –〉IDL系列(COM+,corba,RMI等)-〉SOAP系列 ,这一条发展线路基本是程序员主导。从抽象的角度看,程序员是不关心业务的,因此尽可能的让集成方法远离业务层,从系统层面解决之。

协议:EDI,ebXML系列,信用卡数据交换协议,国人搞得cebXML等等,这条线路基本是业务专家主导。从抽象的角度看,业务专家不关心系统如何实现,它更关注业务的标准化。

接口和协议看似两个简单的概念,但它们代表了两种系统整合思想,两种架构思路。他们有时候是对立的,有时候又是糅合的,很有些哲学的味道,对立统一规律(辩证法)。

Post a Comment