我的观点是,SOA对不同的需求需要不同对待。在本文中,我只关心J2EE架构方面的SOA,而我认为这意味着功能重用。其他从J2EE观点来看SOA的优点还有:
1、松耦合的组件,这是软件设计中重要的部分
2、引入ESB作为消息层意味着强制“面向接口编程,而不是实现”
3、异步消息增加了应用的伸缩性
让我们通过问三个特定的问题来看一下软件重用中更细节的问题:
1、为什么重用软件是重要的?
2、SOA是如何提出解决软件重用问题的?
3、是否SOA的允诺能够使软件重用应用到现实中?
首先,软件重用是重要的原因如下:
1、时间和花费上的效率—能够重用已经的组件来满足陈述的业务需求将节省大量的时间和金钱。
2、重要的特性包括但不限于如稳定性/性能/可管理性/文档/可配置性。因为一个组件被重用的次数越多,对这个组件的投资也越多,他的优势也越多。
3、 良好设计的可重用框架无论在哪里被使用都拥有正面的效果,而且你愿意的话可以封装更好的想法来解决通用问题。
因此我们需要重用性。那么最简单的方法是什么呢?就是打包软件作为一组良好定义的组件来满足离散的功能需求。然后,如果其他应用需要相同的组件,他就可以重用了。还有些细节需要考虑,如如何配置,但这些细节已经偏离了主题:重用任何语言编写的代码,那些代码必须被设计成一组离散的组件或重构为集合。
其次,SOA是如何解决软件重用的问题呢?是通过基于组件模型来构建和引入一个重要的强制约定:组件间的通讯要通过下发到ESB的消息来进行,而这就确保了松耦合。实际上,最广泛布署的SOA实现—Web services可以通过使消息层技术中性来缝合用不同语言开发的组件。
最后,SOA对软件重用的允诺真有实际意义吗?不,我想念如果SOA在1945(大概是和ENIAC同时代吧)被发明的话确实可以解决软件重用的问题。但没有,现存的大量代码是用不同的开发语言编写的,有COBOL/C/C++/C#和其他语言。这些代码没有作为离散的组件来编写,因此也没有SOA来解决。事实上,我认为有大量的SOA项目的工作是花费在重构相同的代码库。
现在,让我们来看一下对于J2EE应用SOA可以解决的一些问题。
SOA缺点
SOA缺点包括下面三方面:
1、 SOA自身的缺点,主要当前还没有成熟的实现
2、 SOA的复杂性
3、 厂商对SOA在更广泛的J2EE产品和方案中的位置
那么我们就心批判的眼光来看一下:
·并没有像J2EE规范那样有自己的正式规范。虽然有一个发布的规范,但那个太复杂了并且没有遵循80:20法则(80%的应用需要简单的SOA,只有20%的应用需要更强大而复杂的功能)
·有状态会话依然存在广泛争议而且现在还没有被SOA的缺省实现(Web services)所解决。而无状态会话已经是完全支持了。
·由于缺省正式或推荐的规范,Web services已经成为许多人眼里SOA的代名词了,但Web services通常是过于强大了。
·SOA增加了复杂性。可能你更喜欢硬编码和紧耦合,而不需要XML配置文件来运行简单的应用。
·SOA兼容的应用对本身来说没有什么意义。其商业价值来自于能够提供离散的功能块,通过SOA被用于其他的应用和模块。例如,如果你对订单的较验规则是通过JSP页面中的Java代码来实现的,那么你还需要重构代码将其放到服务端对象中以便于SOA调用,—但很多厂商并没有提及这一点。
·在某些情况下,厂商将SOA作为网页应用框架的替代者!我认为,WAF是SOA定义功能中的消费者,只是作为一种补充,而不存在竟争关系。
· 与厂商提供的相反,一些应用根本不需要SOA而只需要简单使用MVC框架就可以了。这很短视吗?我不这么认为,即使SOA的特性是需要的,在上面的情况下,最重要的部分是用来服务于企业服务总线的良好定义的业务逻辑层,而不是ESB自身。
虽然我不认为SOA是一颗解决现有和新建应用中问题的银弹,但我相信SOA在他相应的位置上还是有其内在的价值的。现在让我们来看一下在应用中增加有效的SOA解决方案是如何提供体现其商业价值的。
建议的SOA分类
现在,你应该对我保持事物的简单性的热忱表示感激吧。但我本质上并不是简单论者,我是一个实用主义者。对软件项目来说,我认为实用主义是一方面要平衡项目的商业和实际价值,另一方面是使用软件设计上的最佳实践。简单的说,就是在我们现有条件下构建我们所能创建的最好的系统。
一个实用主义的好例子来自于民间的工程历史。在修铁路时常修木桥,而我们知道用铁桥会更好。当铁路公司的股东想使铁路尽快开工而且初始投资要有限制时,他就是这是最好的工程方案了。是否听起来耳熟?同样的原则可以应用于软件工程。
根据实用主义的精神,我建议将SOA分为三个级别:简单/中等/复杂,衡量标准是需要满足的业务需求。如果你需要简单的SOA,那么不要浪费时间和金钱在复杂的SOA上。
文章来源于领测软件测试网 https://www.ltesting.net/