在考虑到服务和进程可能需要跨多个协议进行交互时,设计一个有效的分布式软件系统就变得相当麻烦。
多数分布式系统都将进程内通信的协议细节包装在使用每个给定协议的进程或服务中。如果不是那样做,就是把细节内嵌在一些负责处理某一具体协议的通信的管理类(manager class)中。在需要一个新协议时,这两种机制都会引起重新设计、重新编程、重新编译和测试等问题。根据与协议有关的代码与服务本身之间耦合的数量,通常会产生一些相互依赖,从而在底层通信基础设施发生变化时需要处理一些潜在的困难的耦合。
一个面向服务的架构(SOA,service-oriented architecture)取决于服务间最少的相互依赖。这个松散耦合必须将所有方式传播给架构的协议层。因此,SOA 使用的通信基础设施应该设计为与底层协议层无关。
代码重用性是设计良好的(well-designed)、协议独立的(protocol-independent)通信框架的最主要的优点,因为使用框架的代码将不会与使用的协议绑在一样。底层协议的透明替换也是协议独立的通信框架设计的非常重要的优点。这使得新协议的部署变成比以前简单,因为避免了在重新部署中一般都会遇到的另人头痛的事情,包括重新启动服务,阻碍客户端运行等。
例子:包装(wrapper)Java Bean,用于聚集多个对象,并展现容易理解的业务接口。
例子:RMI 的 stub 类设计
例子:Java 的 Portable Object Adapter(可移值对象适配器)
例子:CORBA 的 ORB 环境
例子:RMI 的客户 socket 工厂环境
协议独立框架技术的一个最重要的内容是协议抽象层。与其它优点不同,协议抽象层允许通过多个协议同时地对服务进行访问;允许向开发人员隐藏协议细节;还使得透明协议替换变得容易。图A说明了这一概念。
图A
协议抽象层
使用 SOAP 的协议独立性
简单对象访问协议(SOAP)是一个轻量级的,基于 XML 的协议,用于在一个分散、分布式环境下交换信息。SOAP 支持远程过程调用(RPC)方式的信息交换和面向消息方式的信息交换。SOAP 是围绕很多松耦合设计的,包括协议独立性、语言独立性、平台独立性和操作系统独立性。
SOAP 规范定义一个XML 文档的结构,用于在两个实体之间通过各种其它协议交换数据。
SOAP 规范1.2定义了一个绑定框架,用于扩展将 SOAP 消息从一个节点传输到其它节点的责任。这样就使得 SOAP 处理器可以做到协议不可知和协议独立。因而,SOAP 版本1.2消息可以跨 HTTP、SMPT 或者任何其它与绑定框架兼容的绑定所用的协议来传输消息。