在Infoq的文章SOA的十大原则
,专门提到了松耦合。松耦合是老生常谈了,不过这篇文章则用了好几个维度来描述:
时间
:当参与者在时间上是松耦合时,它们不需要在同一时间启动并进行通讯。这要求两者之间采用某种缓冲或队列机制,尽管这种机制与松耦合无关。当参与的一方向另一方发送消息时,交互的继续不依赖于逻辑上或物理上能否立即返回应答消息。
在互联网时代,这个需求逐渐明显,因为我们已经习惯了各种网络应用,例如我自己深度依赖Gmail, Google Docs。然而一旦断网,就只能干瞪眼。幸好Google推出Gear
,成功将互联网应用与浏览器松耦合,极大的扩充了互联网应用的可用性。
另外在企业应用中,同一时段会收到不同类型的用户请求。如果某些请求的及时性要求不迫切的话,将其置入队列中,就能在在保证业务功能完整的情况下,无需其他投资而提高了应用的性能。
位置
:如果一方参与者查询与之通信的另一方参与者的地址,另一方的地址可以透明地进行变更,不需要重新编程、重新配置或者甚至不需要通信伙伴的重新启动。这意味着查找(lookup)过程采用某种目录或地址来存储服务终端的地址。
这里提到不需要“重新配置”,在企业应用中我觉得需要商榷。因为这的确就以为需要一个目录服务,而且目录服务本身的位置永远不能改变。而应用每次访问服务之前都要执行一次查找动作是否值得呢?我可以倾向于可以重新配置,但是要做到动态配置,即无需重启应用。
类型
:同静态与动态,弱类型与强类型这些编程的概念类似,参与者既可以全部依赖也可以部分依赖文档结构来实现它的功能。
在ESB的项目中这倒是比较常见,我们使用的是Oracle Service Bus
,一般采用xml作为交换格式。既然实际格式是文本,那么两边应用的具体类型就无所谓了,例如字符串“2009-03-06 21:24:20”,在服务端是日期类型,而在客户端是字符类型。
版本
:参与者可以依赖服务接口的特定版本,也可以兼容某个范围内的版本。所需匹配的版本越确切,参与者在这个方面上的松耦合性就越差。一个好的原则是遵循
Postel法则
(译
者注:Postel’s Law——“Be liberal in what you accept, and conservative in
what you
send.”):服务提供者应尽可能兼容许多不同的版本,这将使它更加健壮(可能甚至需要容错),服务使用者应尽可能遵循精确的语法和文档类型。这将增加
整个系统的稳定性和灵活性。
在SOA的首期项目,根本没有所谓的“版本”问题,而随着项目的渐渐演变,版本问题就渐渐暴露出来了。尽管基于Oracle Service Bus
的丰富特性可以应付一些版本问题,但还是服务接口的初始设计其决定作用。我觉得解决“版本”问题,SOA的十大原则
提到的“面向文档”是一个很好的工具,因为面向文档能够灵活应对接口的变化。
这里的Postel’s Law——“Be liberal in what you accept, and conservative in what you send
"
,中文意思应该就是我们常常说的“严以待己,宽以待人
”。服务端的程序设计必须严格遵循相应的架构规范、设计模式和最佳实践,但是就要允许客户端以各种古灵精怪、不合逻辑的方式进行交互,这样的服务端就会更将强壮,而版本变化则不在话下了。
基数
:服务消费者和提供者可能是1对1的关系,尤其是在请求或响应交互发生时,或队列被明确使用的情况下。在别的情况下,服务使用者(在这种情况下,称作“消息发送者”或“事件源”更为合理)可能既不知道也不关心有多少人接受了消息。
这段文字有点不容易读,我理解为交互双方是一对一,或者一对多的关系。现在一般都是通过“主题队列”的订阅机制来实现一对多的关系。
查找
:参与者打算调用服务时,既可以依赖服务提供者的物理名或逻辑名,也可以先通过一组功能描述来执行查找(lookup)操作。这意味着存在一个注册表和(或)仓库,对存储其中的使用者需求和提供者能力进行直接或间接的匹配。
这段话讲的不够直白,我的理解就是如果应用要使用一个天气预报的服务,那么应用可以首先到某个地方查找能够提供天气预报能力的服务,然后使用它。说实话,
我还从来没有看过能够在“运行时”做到这一点的,曾经有一些SOA的项目标书提到这个特性,除了让销售多买一些Repository
Server外,就不曾在项目实施中出现过了。
对于将使用者需求和提供者能力进行直接或间接的匹配
,我认为只是应该在“设计时”进行,而且当企业部署了上百个服务后是很有必要的。不过我这里着重的是企业应用,不晓得互联网应用中有否在运行时进行功能查找的真实案例。
接口
:参与者可能要绑定到一个特定的服务接口或是支持一个通用的接口。如果使用通用接口,所有该接口的使用者都能与所有该接口的提供者进行交互。尽管可能乍看起来这有些笨拙,但单一通用(统一)接口的原则就是WWW架构的核心
通用接口的确是WWW的核心,不同产商的浏览器可以自如的和不同产商的Web服务器进行交互,这就是通用接口带来的奇迹。不过我对通用接口的理解还不够深
刻,这几天在看一些关于REST的争论也常常提到统一接口的问题,需要做进一步了解。我对如何在企业应用中的采用单一通用接口比较感兴趣。
---------------------------感想分割线
---------------------------
其实松耦合真的是老生常谈,但这种多维度的分析还是让人眼前一亮的。将问题进行分解,然后分别描述是一种简单而有效的方法。在讨论问题的时候,容易泛泛而谈没有重点,或者紧紧揪住某个细节陷入其中,这个时候,如果有人说“这个问题嘛,应该分成几个方面来看,……
”,这个人往往会被大家佩服。
其实也是,当我们开始试图从多个角度看待一个问题时,就更加能够看清问题的真相,找到相应的解决方法,而如果能够做到麦肯锡所倡导的“相互独立,完全穷尽
”就更加完美了。
分享到:
相关推荐
GNSS/SINS紧组合和松组合导航系统,matlab仿真程序,亲手写的
Loose-GNSS-IMU-master
babel-runtime-loose Babel运行时的宽松版本,减小最终捆绑包的大小。 USE WITH CAUTION 用法 Webpack: { " module " : { " alias " : { " babel-runtime " : " babel-runtime-loose " } } }
GPS/SINS松组合/紧组合MATLAB仿真验证代码(GPS/SINS loose /tight integration MATLAB simulation verification code)
presentation attributes and elements that W3C expects to phase out as support for style sheets matures.... DTD when possible, but may use the Transitional DTD when support for presentation ...
var parse = require('loose-json'); var x = parse("{abc: 'hello'}"); // You dont have to use double quotes console.log(JSON.stringify(x)); // {"abc": "hello"} // comments are ok, it is safe
react-loose-forms.examples 每个子目录都是一个示例。 只需打开它的index.html文件即可观看它的运行情况。 要进行更改,只需运行以下命令: $ npm i $ npm start 这将监视js文件并在您保存更改时进行重建。 ...
IEC 60068-2-55-2013 最新版 Loose cargo testing including bounce
资源来自pypi官网。 资源全名:loose_server-0.4-py3-none-any.whl
资源分类:Python库 所属语言:Python 资源全名:django-loose-fk-0.5.2.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
my file5 hfss design for EM analysis
今天读《High Performance MySQL》,发现一个“Loose index scan”,之前完全没有听说过。网上查了些资料,这个叫松散的索引扫描(Loose index scan)
web site style modal
11.【课堂笔记】activiti.pdf
此日历支持html标头为 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd"> js内有使用方法。
严格源路由选路(命令参数Strict): 宽松源站路由选路(命令参数为Loose):
unicode-loose-match是JavaScript实现,即Unicode标准中定义的符号值的松散匹配算法。 它基于并且可以识别和。 安装 要以编程方式使用unicode-loose-match ,请通过将其安装为依赖项: $ npm install unicode-...
各种资料关于loose index scan的解释很拗口,其实等同于oracle的index skip scan。今天我们就来详细看看loose index scan的使用
Django Loose CMS是基于django框架的简单cms。 特征 分层页面 模板页面 SEO友好的URL 建立引导网格 编辑插件的样式表(没有全部功能) 具有自定义模型字段的文件管理器 要求 宽松的CMS需要: Django 1.8版 ...