接口定义和SOA规范
不在这里重复SOA的定义。SOA从设计思想的角度强调将系统划分为高可复用性的服务;从技术的角度,解决的是异构接口的互通互联问题。不同技术实现的服务有着不同的接口,怎样方便地在一个服务内部调用另一个服务的接口,或者调用已有多个服务的接口实现一个新的服务? 一个自然的想法就是定义一个统一的接口规范,新开发服务的接口遵循这个接口标准,或者服务开发运行平台提供新接口到已有各种接口的转换。事实上,SOA就提供了这些功能,SOA的若干规范:SDO (Service Data Object), SCA (Service Component Architecture),BPEL (Business Process Execution Language) 都包含了接口定义的内容。
在本文中所说的接口,并不特指程序API,这里的接口独立于编程语言和操作系统。我们把一个服务系统和外界的数据交互定义为服务的接口,那么完整的接口定义要包含哪些内容呢?
(1) 数据。首先需要对在一个服务系统和外界之间交互的数据做定义。
内容 | 描述 | 附注 |
数据类型定义 | 每个编程语言都有自己的数据类型定义,XML Schema也有数据类型定义。数据类型包括基本类型和复杂类型。 |
|
数据格式 | 指在内存,文件或者线上的各种数据类型的数据如何排列存放,特别的是复杂类型的数据如何存放。C语言中的Struct对象在内存里有其自己的数据格式,Java语言的Object对象在内存里按即定的数据格式存放,XML是一个典型的使用字符描述复杂类型数据的数据格式规范。很多C/S系统定义报文格式,在线上收发二进制流。8583即是银行也常用的一种报文格式。 |
|
数据内容 | 数据内容一般划分为技术和业务两个层次。技术层面的内容一般是在服务和外界之间交互的数据报文头信息;业务层面的内容就是数据报文体信息。在业务层面,现在有越来越多的行业业务数据内容规范,例如电子商务的ebXML, 金融交易的FIX协议等。 |
|
|
|
|
(2)交互。数据有了,还需要定义服务和外界交互的方式。数据在两个系统之间交互收发,有多种的模式和规范。
内容 | 描述 | 附注 |
接口交互方式 | a. 请求应答方式。即外界客户端向服务系统先发送一条数据作为请求,服务给外界客户端返回另一条数据作为应答。 b. 推送方式。即服务向客户端先发送数据,没有反向的数据。 |
|
请求应答数据内容 | 请求即输入数据的内容定义,应答即输出数据的内容定义。输出包括正常和异常输出。 | 以下的内容都针对请求应答方式 |
有/无状态接口调用 | 接口调用是有状态接口,还是无状态接口。使用同样的输入多次调用同一个接口,输出不变的是无状态接口,否则是有状态接口。 |
|
同步,异步方式接口调用 | 对于客户端来说,同步方式指调用一个服务接口即可得到结果;异步方式调用可细分为两种实现方式:a. 客户端先调用服务的一个接口,若干时间后再调用服务的另一个接口获取前一个接口调用的结果数据;b. 客户端先调用服务的一个接口,服务执行完处理后,调用客户端提供的一个接口把结果数据发给客户端。 |
|
接口调用规范 | 接口调用的会话(Session)机制,多个接口之间的调用顺序和规则。包括同一个服务的多个接口之间的调用规则,多个服务的多个接口之间的调用规则。例如Web Service的动态绑定调用技术就是按一定的规则调用UDDI服务, 和SOAP服务的多个接口。 |
|
通信方式和通信协议 | 一般来说客户端和服务不在一个节点上,服务接口是远程接口,需要基于一定的通信方式和通信协议。例如TCP, HTTP,SOAP,MQ消息中间件等。 |
|
|
|
|
(3)其他
内容 | 描述 | 附注 |
接口调用安全策略 | 客户端和服务之间彼此需要授权和认证。 |
|
事务 | 多个服务接口调用需要包含在一个事务内,具备执行原子性。 |
|
日志 | 接口调用操作需要记录在日志中,以便管理和监控服务。 |
|
下面我们来看,SCA,SDO,BPEL三个SOA领域的规范做了哪些接口内容的定义工作。
内容 | 规范 | 附注 |
数据类型定义 | SDO规范中的SDO Data Type定义了基本类型和Object类型 |
|
数据格式 | SDO没有固定的数据格式,但是提供统一的数据访问接口。SDO服务支持各种格式的数据对象。 |
|
数据内容 | SCA服务定义中的Interface定义了服务和外界交互的业务层面数据内容。SCA Interface目前支持Java Interface和WSDL两种描述方式。 |
|
接口交互方式 | 服务接口都是请求应答方式。 |
|
请求应答数据内容 | SCA Interface定义了服务请求应答的数据内容。 |
|
有/无状态接口调用 | SCA Conversational Interface定义了有状态的接口。 |
|
同步,异步方式接口调用 | SCA Bidirectional Interface 定义了异步调用方式的接口。BPEL 中的partnerLinkType 也可以描述异步调用服务接口和与之相对应的Callback接口。 |
|
接口调用规范 | SCA Conversational Interface定义了多个接口之间的调用顺序和规范 |
|
通信方式和通信协议 | SCA Binding定义了服务接口的通信方式和通信协议。通信协议可以理解为技术层面的数据内容。SCA支持多种通信方式,如Web service binding, JMS binding 等。 |
|
接口调用安全策略 | SCA Policy 中的Security定义了接口访问安全策略。 |
|
事务 | SCA Policy 中的Transactionality 定义了接口调用的事务模式 |
|
日志 | 日志功能由服务平台内部实现 |
|
从上面可以看到,三个规范都涉及到给服务定义统一的接口规范,有了统一的接口规范,就可以方便地调用不同技术实现的服务,这就是SOA解决异构接口互联互通的中心指导思想。从技术角度上讲,这也是SOA最主要的工作。
在做SOA项目实施的时候,经常有客户问我SOA和EAI(Enterprise Application Integration)的联系和区别。如果不考虑SOA在设计思想上倡导基于分布的可复用的服务集合来构建企业信息化系统,单从技术的角度,SOA与EAI在提供统一的数据和接口定义,连接已有异构系统方面,他们的设计思想和实现方式是很相似的,甚至可以说是相同的。只是SOA使用开放的规范标准,EAI厂商都是使用自己私有的标准。 于是乎我给SOA赋予一个新的名称:企业接口集成(Enterprise Interface Integration), 或者是企业组件接口集成(Enterprise Component Interface Integration)。 关于SOA和EAI的进一步分析,我在另一篇文章里论述。呵呵且听下回分解。 :)