因为SOA概念是源自当前已有的技术,如Web service,但又高于技术本身,因为其是架构问题,是设计问题,必定表明人在里面的重要作用,基础设施再好也只是把程序员从重复、复杂、底层的工作中解脱出来,软件成败的关键在于设计。SOA由来已久,本身就是技术的集大成者,概念、理念自然就多,同时对概念也没有一个标准的一致性。以下是我个人在学习过程中,总结的几个容易混淆的概念,现拿出来梳理,一是对自己学习的总结,二也希望帮助后学者少走不必要的弯路。
(一)编排与编导
我们知道,SOA最重要的思考就是复用服务,那么复用服务,是靠组合现有的服务来达到快速响应变化,增加企业敏捷性的。服务的组装并不是服务的简单堆砌,服务间是需要协调才能更好地共同完成一定的功能。
编排(orchestration)和编导(choreography)是常用于描述“服务协调”的术语。虽然它们在中文的含义中区别并不大,但其实区别挺大的。
编排涉及到服务协同,整个服务间的关系如下:
咋一看还以为是网络的星型连接图吧,编排涉及到的是服务调度的安排,其中编排服务做为中央的总控机构,犹如局域网中的Hub,各个被协调的服务间的消息传递都要经过它来进行转发或被该Hub修改,才能通讯.
而编导则相对来说服务间的通讯更分散,每个被协调服务不需要将消息都往Hub.这种处理基于某种每个被协调服务都知晓的规则,并且可能对于每个被协调服务来说都建立了本地的配置文件.其交互图如下:
这就是两者的区别.下面我将进一步从稍微低层来学习Web service中的Endpoint,但不一定就绝对正确,这是因为SOA本身比较凌乱,同一个概念在不同的上下文,在不同的人理解中都有不同的意思,所以本人也只能从自己的角度来阐述这些概念而已.
Endpoint,其实就是一个定位服务的信息,在运行时提供了访问服务所必须的地址细节.如果某个服务在两台机子上,那么它就有两个Endpoint.这种情形下,可以认为Endpoint与service的位置一致.Endpoint同时又与实现无关,这里涉及到OS(操作系统)的工作了,当在endpoint处OS接收到进入的数据时,OS会将数据发向实现代码,可以看做是实现代码在该endpoint监听.而当OS接受到出去的数据时,它将这些数据传输到指定的服务去。
既然谈到服务,必然会与服务的设计相关联,服务一般来说要是stateless的,这个与Spring之父在《Expert One-on-One J2EE Development without EJB》