首页 > 代码库 > 第一章-设计原理及设计模式

第一章-设计原理及设计模式

    1. SOA简介 

    soa(Service-Oriented Architecture)面向服务架构,既是一种编程模式,也是软件开发的一种架构方法。根据这种架构方法,应用程序是由具有一定行为,称为服务的功能单元组成。 

    服务是一组具有相同要求和功能目标的方法。根据它们的结果,如数据,运算结果等,其他部分可以调用相应的服务来执行其逻辑。这些函数都有一个明确定义且公开的签名,因此其他代码可以把这些服务中的函数当作黑盒子那样调用。服务的具体操作是不可见的---它们与用户之间没有直接的交互,而是根据输入参数的要求来运行。SOA架构请允许用户以一定的方式组织分布式应用程序。分布式是指服务的使用都可以运行在与服务不同的计算机上。这使得业务逻辑与用户界面可以集中处理。而使用者可以分布在网络的各个位置。为了在SOA中实现这个功能,需要在计算机之前传送包含数据的结构化消息。 

     

    SOA的基本思想是构建一个松散耦合的系统,这个系统中,服务的使用者与服务的实现唯一共同拥有的东西,就是公开的服务操作列表和参数的结构定义。 

     

    客户端只知道用来描述服务函数的名称输入参数名称及类型,以及函数返回类型的签名。除此之外,不存在其他依赖性,不管是客户端还是服务,都可以采用不同的开发平台和编程语言。 

     

    显而易见,这种依赖性只是功能上的,并不基于技术基础架构,这使得不同的开发平台可以很容易与服务进行交互。SOA架构的技术基础是SOAP标准。SAOP用XML语言一定义一个服务操作所发送和接收消息的内容。 

     

    消息是由参数的值或返回值形成的,而且数据需要转换成SOAP格式。每个开发平台都有一个SOAP栈,因此服务的调用会得到很多平台的支持,支持多平台是SOA架构的主要目标。 

     

    1. SOA架构的4条原则 

    • 边界显试定义 

    在使用SOA架构开发产品时,必须显式定义用户访问实现时必须跨越的边界。边界可以用契约和地址的方式来定义,服务通过这些地址可以被访问到。没有契约和地址就无法执行服务中的逻辑。边界必需是显式定义的,是指客户端程序只需要知道服务中存在的函数,通过契约运行这些函数即可。 

    • 服务自动化 

    服务是不依赖于其他服务的行为的独立程序模块。服务不需要显式实例化就可以直接引用。服务必需经过部署,而且每个服务的版本相互独立,安装了某个服务的新版本不会影响其他服务的行为。类编译后的可执行文件中是相互耦合的,而服务则不同。服务使用用一种松散耦合的架构。 

    • 服务共享的是模式和契约,而不是类 

    模式是对服务操作的定义,它以一种独立于平台的方式来描述签名:b函数的名称,参数类型和返回值类型。契约是服务的元数据,是服务作为黑盒子的对外接口,模式则是对参数结构的定义。这条原则明确表示,类本身不可以被服务及服务的客户端共享。 

    • 基于策略的服务兼容性 

    这条原则意味着服务决定在满足什么条件的情况下才处理消息。为了通过协商确定通信中的元素,如消息的格式和对安全方面的要求,必须使用策略。策略用来进一步明确服务的语义和客户端对服务行为的期望。 

    1. 服务的内部结构 

    一个服务包含若干个方法,这些方法通过一个通道来与服务的使用者建立通信。 

    技术分享

    一方面通道是模式,契约和策略的结合;另一方面,通道在运行时就是使用的协议。消息可以在通道中双向传递。协议如http,MSMQ用来传送数据,需要得到服务实现时所在操作系统平台的支持。通道相当于一个管道,消息在其中流动。通道还需要知道服务使用者必需要实现的策略。 

     

    从更高的角度来看,服务是某生态系统中的一个有机体。来自该生态系统的一些概念组成了SOA架构的一部分。 

    应用程序由服务组成 

    服务的管理状态 

    服务不能直接调用数据库,但是在一个设计良好的架构中,服务依赖于其他层与整个数据库进行通信。 

    服务实施策略 

    契约描述了消息交换模式。消息交换模式是对消息从一方到另一方传送过程和传送方法的定义。消息交换模式确定了是同步还是异步调用服务,决定了是否需要返回结果,消息交换模式可以是: 

    请求响应模式:这是最常用的模式,每个调用都直接返回另一个消息 

    单向模式:服务调用没有返回结果,因此服务可以异步调用 

    双向模式:在调用方法的过程中,服务操作可以回调给客户端,服务操作在返回最终结果之前,可以向客户端请求更多的信息 

    契约包含模式,而模式定义消息的结构 

    模式定义了所操作参数的结构,模式采用XSD文档来描述参数。XSD是元数据语言,用来描述传入服务操作的参数和服务操作返回的结果。定义完模式之后,服务操作的使用者就可以格式化数据了,当调用时XSD能够被服务理解,因此用户可以再次访问数据。这就是所谓的序列化和反序列化。 

    交换消息是服务生态系统的最重要组成部分。交换消息意味着调用一个操作和接收来自此操作的响应。一个消息把客户端的输入参数传递给服务,另一个消息把响应传回给调用者。 

    1. 组织业务流程中的服务 

    务流程的需求构成是契约和模式定义的基础,分析这些需求是系统分析过程的第一步。 

    1. SOA的底层技术 

    • SOAP 

    简单对象访问协议是一种XML规范,用来交换消息中的结构化信息中的数据。SOAP可以标准化网络上交换的数据。一个SOAP消息只携带数据消息。一个SOAP信封包含一个消息头和一消息体。消息头包含了与底层技术基础设施有亲的信息,而与业务功能无关。消息体包括了有用的数据,因此称为有效载荷。服务操作的每个参数都以数据的序列化形成出现在消息体中。 

    • WS-*Protocols 

    WS-*是一系列标准协议,它们规定了在使用SOAP消息实现分布式消息传递时如何实现某个需求和行为。这些协议描述了如何通过SOAP消息中的头元素实现安全,可靠,事务性的消息交换。WS-*协议组中的每个协议都有各自的作用。在WCF中,利用WSHttpBinding绑定可以实现WS-*协议 

    • WSDL 

    WSDL是对契约的XML格式的定义,包括了服务接口的全部元数据,如函数的名称,参数的名称及数据类型。WSDL文档的作用是按跨平台方式定义契约,因为这些类型是用XML格式来描述的。 

    1. 契约优先原则 

    首先需要明确定义服务的契约,分析面向服务的应用程序不是绘出用户界面,也不是定义一些表格以及它们的关系图,而是先定义契约。 

    1. WCF和.NET服务如何实现 SOA模式 

    必需给接口和它们的操作签名添加元数据,这样WCF才承认他们是契约,契约是服务生态系统的一部分。这些元数据要放在代码元素的开头,它们形成了额外一层的元数据,只有WCF运行时能够理解这些元数据,WCF运行时以契约和模式的形式给出代码的意义。 

    ServiceContract,OperationContract,DataContract,DataMember 

    WCF采用了代理模式,即允许在项目中创建并使用一个使用了服务的类。这个类看起来像是一个实现,但实际上它就是一个类。它与真实逻辑的实现一样,实现了同一个共享的接口。 

     

    WCF提供了ClientBase<T>类,由这个类可以派生出代理类。这个基类拥有与服务建立通信和转换操作调用所需要的全部逻辑。使用者可以通过代理发送SOAP消息,并用定义的绑定把消息发送给服务。 

     

    ClientBase<T>类是一个泛型类,它需要知道这个接口的类型。这个类有一个保护属性,这个属性只有在派生类中才是可见的。这个属性就是通道,它属于代理使用的泛型。这意味着这个通道拥有屯服务器端相同的逻辑实现方法列表。 

     

    WCF允许同时允许同时实现多个接口,并且允许为一个服务配置多个终结点,从而支持并发契约。第个终结点的配置都有自己的地址,并能在其中一个接口中引用它,这个导致的结果是由单个服务负责实现一组来自多个接口的操作。 

     

    WCF利用消息级安全的WS-*协议栈实现了跨平台安全。还可在更高层上使用传输安全,安全级别由选取的绑定确定。 

     

    由于WCF实现了Web服务原子事务协议,因而支持事务处理。大多数据时候,服务层的事务会引发数据库层的事务,WCF通过屯数据库分布式事务协调工具的通信来建立事务。服务在事务中的行为可以由接口的操作特性TransactionFlow和实现特性OperatioBehavior来决定。 

     

    WCF支持一种更通用的跨平台错误信息传递方法,即用SOAP错误元素传递异常信息。SOAP标准定义了SOAP错误元素的传递方法及其内容的序列化和反序列化方法,并且这种方法都是跨平台的,是专为SOA设计的。通过添加FaultContract特性实现。 

     

    通信和集成是WCF中两个最重要的方面。这是WCF在软件开发领域中真正表现出其卓越性的地方,也是WCF最有价值之所在,WCF正是为这个目的而设计的,开发人叫可以充分利用WCF中的丰富功能以建立分布式应用程序,这些应用程序可以相互通信,并在彼此之间进行集成。 

     

    消息交换模式 

    单工消息处理模式:只按一个方向把消息从客户端发送到服务器,但是不等待响应,客户端甚至不记得曾经发送过消息,服务器只处理消,并不打算级客户端一个响应,也不向客户端发送一个确认消息。这种模式的最大价值是能够实现 异步通信,保证消息传送分环境的能力是这种模式的另一个最重要的优点。步骤是把操作层定义的方法的返回值定义为void,在接口中设置单工模式,把OperationContract特性的IsOneWay参数设置为True。 

    双工消息处理模式:客户端和服务器不再需要通过一种预定义的模式来交换消息。客户端向服务发送一个最初请求,并且等待一个响应,但是允许服务向客户端发送一个响应,以要求有关请求更多的信息。 

    流模式:在流模式中,客户端发起一个请求,请求一个非常大的数据集。服务把数据分割为小块,并把这些数据块逐个地发送给客户端。由于这个数据集非常大,因此服务必需按块从文件系统或数据库中读取这个数据。数据块按使用的顺序发送给客户端,这正是流视频使用的方法。 

    发布-订阅模式:应用程序定期发布数据,大量的其他应用程序可能会对这些数据感兴趣,它们可以订阅发布的数据。发布者通常不知道有哪些订阅者,也不知道他们对接收到的数据如何处理。 

    隐式顺序调用模式:隐式顺序调用模式请允许定义逻辑顺序中最后调用的方法,称这些方法为终止方法,这时客户端不能再调用其它方法,因为逻辑工作单元的执行己经结束。这种模式不是一个单纯的消息交换模式,因为对参与顺序调用的方法调用可能会使用另一种模式来实现。WCF提供了OperationContract特性,可通过它定义操作的调用顺序,只要把一个方法的IsInitiating参数设置为false,就可以启动一个会话。把IsTerminating参数设置为true,则表示调用这个方法以结束会话过程。 

    业务流程模式 

    流程管理器 

    流程管理器负责启动流程,必要时持久化流程,等待传入数据并重新启动流程 

    在工作流声明中的模式 

     

第一章-设计原理及设计模式