SOA 是面向服务的架构,即企业的 IT 系统是由服务构成的,也即企业的各个应用系统是由许多尺度的服务件“组装”起来的,构成应用系统中的各个服务之间是一种非常松耦合的关系。
服务基于简朴的“问/答”模型——我问你问题,你给我答案,那么对于“我”来说,“你”就是“服务”。但是答案反馈有同步和异步之分,同步就是我问你问题并在线等待你答复,而异步就是我问完你问题就去忙其他事情了,你有了答案之后再通知我。
在软件行业,基于这种服务的编程头脑最早表现为函数,即把经常用到的代码块界说成一个函数并取一个函数名,再用函数名更换步伐中原先的代码块(称为函数调用)。
比如通过三条边计算三角形的面积,这个任务包含复杂的数学公式,涉及很多条指令,我们可以把它界说为函数 sane(x,y,z),然后在步伐需要计算三角形面积时直接调用这个函数即可。比如 sane(10,20,25),就会返回边长为 10、20、25 的三角形的面积。
后来人们以为函数还不够灵活,就提出了模块,模块比函数功能更强,步伐就是由模块组装起来的。当然,编写具体的模块时会继续采用函数。模块本质上就是一组类库(一个类库文件包含若干界说好了的功能较为强盛的函数),允许软件开发人员调用类库中的函数。
一些好的面向特定应用领域的模块以开源大概贸易模式对外发布,世界各地的其他开发人员可以直接利用这些模块来开发自己的应用步伐,从而淘汰大量重复性的代码编写工作,如许的模块人们风俗称之为框架。例如,利用 Python 语言开发网站的框架 Django,它就是一组类库,编程人员必须掌握需要用到的每个类库函数的界说,才能快速开发网站。
无论是函数还是模块,都要求在步伐运行前“组装”好。一旦“组装”完成,函数或模块就静态地捆绑在一起了,所以人们还是以为不够灵活,于是又提出了运行库的概念(关于运行库的介绍可拜见《IT系统构成》教程)。
Gartner 公司在 1996 年进一步提出了 SOA 的概念,意为面向服务的架构,本质上是面向服务的头脑在企业 IT 架构方面的应用。面向服务的头脑,是面向对象头脑之后的一种新的头脑模式,其焦点特性就是以松耦合、粗粒度的服务单元来构建软件。作为一种头脑,SOA 不涉及任何具体的实现技术细节,但是头脑终归要落地才会带来社会效益。
人们发现,企业服务总线(简称为 ESB)是实现 SOA 的重要技术之一,于是 ESB 也就成为 SOA 的焦点技术底子。当然,不用 ESB 也不能说你的系统就不是 SOA,比如如今盛行的微服务就是 SOA 的一种具体实现,它采用容器对服务打包。SOA 所实现产品的焦点任务是管理企业中的服务单元,具体的任务可分解为:服务单元的登记、服务单元的调用、服务单元的运行、服务单元的摆设、用户管理界面,以及安全控制等。
服务与模块的重要区别在于:模块相称于汽车发动机的零配件,而服务就相称于发动机自己,发动机可以独立运转,而零件就不行。
函数一样平常由开发语言编译器的公司提供,如 C 语言编译器有微软的 Visual C++、Borland 公司的 Borland C、开源组织提供的 GCC 等,框架一样平常由软件开发厂商或开源组织提供,如 Django、Drupal、JSON、Spring、jQuery 等,而服务一样平常由运营商提供。
企业的软件应用系统和服务的关系像极了人类社会中的项目和人的关系,企业要实施一个项目,先去人才网站雇用各种人员组建团队,然后团队成员各司其职,共同完成项目。
求职者事先要在人才雇用网站注册并发布简历,然后等待雇用电话。那么在 SOA 中,也有一个类似人才网站的机构,服务必须先在这个机构里注册,当有需求的时候,其他服务大概应用系统就会在这个机构里搜索能满足需求的服务,并且调用这些服务来完成某个任务。服务像孙悟空一样具备分身术,即同一个服务能分身出很多个体,这些个体分别被其他服务调用,这一点又与实际生活中的求职者不同。
服务是无状态的,即服务在被调用前后自己没有变化,且同一个服务允许同时在多台计算机上运行,如许就能轻松实现高可用性计算及负载均衡集群,表示图如图 1 所示。
图 1 SOA
最终我们可以想象一下,企业的很多台服务器上运行着各种各样的尺度服务,众多的应用系统对应各自的服务调用关系描述表,“组装”一个应用软件由公司文员即可快速轻松地完成。
在云端,由于应用繁多且由一家公司运营,所以云运营公司是采用 SOA 的最佳场所。可以预计,在云计算期间,SOA 将得到广泛应用。在业界,也有人认为云计算将是 SOA 的闭幕者,这个观点把不同条理的东西等量齐观,云计算不是新的技术和头脑,它只是人们使用计算资源的一种模式,而 SOA 是一种全新的软件构架头脑。
ESB 是实现 SOA 的重要技术之一,SOA 是组建大型云端的重要头脑之一。SOA 的概念已经提出了十几年,之前在传统的企业很难落地生根,根本缘故起因就是一家企业的各种软件系统每每是由不同的软件公司开发的,而这些软件公司具备竞争关系,各自为政,很难协调划一地推出符合 SOA 尺度的通用办理方案。
SOA 的实施就是以步伐员的视角把公司的业务拆分成一个个服务尺度件,然后再选择符合的尺度件“组装”成各种应用软件系统。有了肯定规模的服务尺度件库后,“组装”应用系统就显得异常简朴快捷了。在一个高度智能化的 SOA 环境中,“组装”自己也是自动化的。
一个公司的软件应用系统越多、越复杂,实施 SOA 就越有代价,因为每个服务尺度件得到重复使用的概率就越高;相反,如果一个公司只有一个软件系统,而且以后也不会使用更多的应用系统,那么根本没须要采用 SOA。
“拆分”工作是实施 SOA 乐成与否的关键,拆分视角、拆分原则和拆分粒度(服务尺度件的巨细)必须事先科学规划。最小的拆分粒度就是一个服务对应某种编程语言的一条语句,这时“组装”软件系统就是传统的软件开发,由软件开发工程师来完成;最大的拆分粒度就是一个应用系统对应一个服务,这时“组装”软件系统就是安装一个应用软件系统,由系统管理员来完成。
科学的拆分粒度介于这两种拆分粒度之间,拆分出来的服务尺度件既具备肯定的可重用性,又能大大简化“组装”步伐的复杂性。通行的做法是,先在软件系统的传统“三层”分层布局的底子上,纵向划分出更多的条理,然后对每一层结合企业的业务特点横向划分出多个“块”,每个“块”完成少量的业务逻辑,如许的“块”就是一个服务尺度件。拆分的过程是一个不停进化的动态过程,也是一个由粗粒度到细粒度不停演化的过程。
软件的传统“三层”分层布局是指显现层、业务逻辑层和数据层。为了理解它们,请看下面的例子。
王老师打开学校的测验网站,然后检察张宇法同砚的“云计算”课程综合考评分数,屏幕上显示 89 分,如图 2 所示。