SOA归根到底是什么?
在日常业务中有些事物并不时常改变,比如说美国加油站一直以来都在用加仑为单位销售汽油,餐馆依然使用菜单,牙科医生还是会每六个月就销售一次清洁用品。每种业务都会有一些方面不时常变动,而这部分往往占据了是业务的绝大部分。我们就称这些为核心业务功能(_core business functions)。业务中的也存在一些常常变化的事物。价格、税率、货品分类、新产品、新市场策略、广告、新业务领域、新领域的客户等等。的确,为了生存,企业必定要变化,而且是快速的变化。不过,至关重要的是要那些变化影响不到核心业务功能。
软件开发人员早就明白变化快速的软件模块要与保持不变的部分相分离的道理。这项原则在独立的程序或系统之中有时称作是“共同封闭原则”。而运用在企业的信息管理系统之中就成了SOA。SOA是把保持不变的核心业务功能剥离成一个个独立的服务的实践。这些服务是被多个展现层程序所调用的粉饰了的方法。展现层程序是那些容易变化的程序,用来展示数据给用户或是从用户处接收数据。
我们通过思考Internet上的商铺来帮助搞明白。客户通过浏览器来与商铺站点的展现程序相交互。展现程序解析了客户的操作,然后调用一些像是获取当前分类的数据或是为注册客户要求的服务。请注意,这些服务并不知道正在与web站点交互。他们就像是与厚客户端交互,或是3270的绿屏界面(3270是IBM的一种大型机系统,其上应用程序常以绿屏的终端形式出现,因而常称作“绿屏”应用程序)。他们只是简单返回那些web系统可能会用到的数据,并将其格式标准化。
SOA其实也就是这些了,其余部分就是一些细节。在最高的抽象层面上,SOA就是将频繁变化与不常变化的元素分离,仅此而已。但为什么这一点会变得那么重要?让我们再来看看Internet上的商铺。它展现给用户一个分类,从而使得用户能够将物品移入或是移出一个购物车,并且最终实现订购。这些内容的展现却很善变,市场人士喜欢令其时常变化。比如说,他们可能会想把购物车比作是边框上的滚动栏。他们想要或多或少的在产品列表上的附加说明。他们想要不同的配色,字体和布局方式。确实他们想要applets、JStart Clients、Ajax,以及无数其他的展现选择。可是所有的这些都与封装为服务的核心业务功能毫无关系。无论展现层的风吹雨打,这些获取分类以及注册流程却固定不变。这就是为何分离显得这么重要。它确保了信息处理在展现的飘摇不定中得到保护。
不过展现并非唯一易变的,业务功能也是一样。再次考虑下我们的商铺,或许在销售产品中需要增加一种优质红酒。而销售烟酒则需要验证消费者的年龄。假定我们有了能提供验证的Service。而每当有烟酒订单的时候,这个Service就会调用到。呼叫此service的决定并非来自于展现层,当然也不属于业务。而是某种特定手续所需的业务过程。业务过程变动就像是兔子跳动那样躁动不安。如果业务成长了,他们会为其业务流程增加更多的步骤以及分支。处理过程中需要调用到的那些服务无序改变,可是处理的过程却需要。因此,我们就需要将业务过程从展现层以及业务service中分离出来。如果它出现在单一的程序中,Smalltalk语言对这样的分离有个称谓,就叫做Mode-View-Controller。
值得注意的是,这么多的技术都殊途同归的与SOA有着关联。这是因为SOA并非什么特定的技术,而是某种将优化的业务功能于易变的过程与展现相解藕的方法学。这就是企业软件的MVC。