本文是个科普文章,有些内容可能不精准,为了给女儿解释SOA所写。要深刻理解SOA,必须了解软件的发展过程。互联网上有大量的这方面的文章可以参考。
软件与计算机
软件这个概念很年轻,也就不到70年。 软件software 是和 硬件hardware相对而言。是从计算机出现时开始出现的一个词。 计算机是大约20世纪40年代出现的(冯.诺依曼体系的计算机)。计算机抽象来讲是个状态自动机,根据条件,由一个状态变化到另外一个状态。说到底,计算机就是这么一台机器,他可以根据指令执行特定的电路转换,这些指令以二进制编码的形式存在与计算机的存储设备中(纸带,磁带,内存,硬盘,CMOS),这些特定的电路转换,体现在使用者面前可能就是在屏幕上显示了个点,一个图形,喇叭发出声音,向另外一台电脑发送了一些数据等等。从电路转换到你看到这些现象,中间有很多步骤,有很多电子元件参与,我们不讲这个,你只要能理解肯定是可以的就是了,就项你按了电梯的上箭头,电梯就能过来接你一样理所当然。 我们回过来说软件,前面说过计算机能接受指令,执行特定的操作,完成任务。如果要完成更复杂的任务,一系列的更复杂的任务,就要给计算机更多的指令,这些更多的指令,我们称之为程序(program),软件(software)。 当初的程序很短,实现的功能也很简单,比如计算100个数字的合,平均值,排序等等。这些程序以二进制码的形式打印在纸带上,计算机通过读这些纸带,转换为计算机的二进制格式。
(https://baike.baidu.com/item/%E7%A9%BF%E5%AD%94%E7%BA%B8%E5%B8%A6/1234150?fr=aladdin)
当时也没有计算机语言,写程序就是 0/1的组合。只有非常专业的人才能做这个工作,很难普及起来,后来才发明了计算机语言(汇编语言,c语言,fortan,cobol,basic,foxbase,到现在的 java,c#,python,javaScript等等),每种语言都有自己的特定和优点,适合不同的专业领域,有的擅长数据计算,有的擅长统计,有的擅长图形处理。不过现在的语言大多是通用语言,通过编写函数库,程序包的形式来实现特定领域的功能。
随着计算机语言更佳好用,计算机逐渐普及起来,应用也越来广泛,实现的功能也越来越复杂,程序规模越来越大,参与的人也越来越多。这样就得考虑编程序的方法,编程思想。比如,开发过程中,如何分工,程序如何划分模块,模块如何组成一个大的程序,我的程序怎么调用你的程序,怎么互相共享开发成果。
第一个阶段,纸带阶段
程序非常简单,没有模块,没有共享,程序的所有代码都在纸带上。程序就是一卷卷的纸带。没有变成语言,只有010101
第二个阶段,汇编语言
把每条指令对应一个单词,比如 +1这个指令,汇编语言是 INC,+:ADD等等。 汇编语言就不是打印在纸带上了,而是以文件的形式,存放在计算机的存储设备上。 计算机使用“编译程序”将汇编语言翻译成二进制指令(0101010),存储到存储设备上,计算器逐条读取执行。 这时候情形和第一阶段差不多,前进了一小步。
第三个阶段,各种语言百花齐放阶段
fortran,c,cobol,等等。这些语言也都是要翻译成二进制语言。 这个时候,程序的规模就慢慢大了,应用也广了,大的软件需要很多人参与了。一个程序就要几十K,上百K。 这时候就有人开发了一些公共的功能,给大家来使用。怎么使用呢? 以前的程序都是单机程序,运行在一台电脑上,所有的程序也都安装在同一台电脑上,如果你要用某某开发的数据统计的功能,就要把他的程序拿过来,放到你的程序里边,作为你程序的一部分。 但是拿过来是有条件的,一般是要使用同一个语言开发的才行,所有有很多限制。比如你做了一个效率很高的排序的程序,我要用,我就得把你的程序拿到我的程序里来。如果后来你的程序优化了,效率更高了,我要是想用,还必须再拿过来,但是假设,你新的程序不用java写了,用c#写了,那我要是用就很麻烦了,需要额外的处理才行。 这个阶段,网络还没有出现。所有的程序还是单机运行,不和其他电脑发生关系。
第四个阶段,进入网络阶段。
大约80年代后期 这个时候,有各种网络系统,比如novel网等等,但是先期还是局域网,没有互联网。 计算机之间可以通过网络进行通讯,互相访问了。访问的方式有各种各样,初步有了 服务器 和客户端的概念(发起访问的称为客户端,接收访问的称为服务器),但二者的主次地位还不是非常鲜明,常常身份互换。 网络是个伟大的发现。你想一下,一旦两台电脑能通讯,那么可做的工作就非常多了。深入到程序内部,程序就是计算机指令,一组实现某个一个固定功能的指令,可以称之为函数。这里的函数,和数学上的函数是一个概念,就是接受参数,返回函数运算的结果。参数和结果,从计算机的角度看,就是数据。数据的有很多种,数字,一段文字,或者以某种形式组织的一堆数据(各种类型的数据混在一起)。而这些数据在计算机中都是以二进制表示的,都是一样的。网络之间通讯也是传递的数据,那么。。。 我能不能把一个函数的程序放在A计算机上,另一个函数的程序放在B计算机上,二者互相通过网络互相调用呢?显然“通过某种约定好的方式”是可以的。这样想,程序的概念,就扩大了,程序不再存在于独立的一台电脑上,它可以“分布”在很多电脑上,通过一定的方式,组成一个很大的“逻辑上”的程序(这就是分布式部署的概念)。 局域网里,计算机一般位于一个房间,一个大楼,总之局限于有限大小的某个区域内。 现在互联网出现了,计算机可以分布在世界的各个角落,这就为世界上的计算机进行协作提供了可能。 你可以想一下,我写一个主程序(主控制程序),它可以调用世界上任何一台电脑上的子程序,这样,主程序 和 非常多的子程序,其实就是一个大的系统。从这个概念上讲,现在的程序已经颠覆了以前的程序的概念。
服务的概念
每个子程序,实现固定的功能,比如接收一组数字,进行排序,或者接受一个图片,识别出来图片上的文字(OCR)。换个名词,我们称这些子程序的功能为可以对外提供的“服务”,如果这个服务是开放的,那么任何电脑上的程序,都可以“请求“这个服务,得到自己想要的结果。那么主控程序调用这些服务,处理服务返回的数据。如果把提供服务的计算机或者程序称为服务器(server)或者服务(service),调用这些服务的计算机或者程序称为客户端(client)或者服务订阅者,这就是所说的 C-S结构的程序。我可以部署一个oracle数据库,对外提供数据存储和查询服务,这是比较低级的服务,我不关心客户在我的数据库里存放什么数据。如果我提供一个数据库,我在数据库中存放了世界上所有股票的交易数据,然后开发一个程序,提供查询的功能,让别人来查,那么我就实现了个一股票数据查询的服务,比简单提供数据存储更高级了。我还可以部署一个车牌识别的程序在我的机器上,对外提供服务,调用我服务的人,给我一个图片,程序识别后,返回给他识别的内容(文本),这也是个服务。现在百度,阿里,腾旭等都提供这些类似的服务来盈利。
SOA
基于这种思想来开发系统,我们称之为面向服务的架构,SOA。
这种架构用到了计算机网络,客户端与服务器之间需要传递数据。我们需要对数据格式做个约定,让两边都能理解,这个约定就是调用协议。国际标准化组织ISO,制定了很多通用协议标准,让大家来遵守,比如RPC协议,HTTP协议,SOAP协议,RESTFul协议。 基于soa的设计好处就是,
1,我不用关心你用什么语言开发的,只要你约定好调用的协议,参数,我就能使用。
2,调用的方式是符合国际标准的,http,soap,restful等等。在以前单机程序时代,不同的语言开发的程序不能很方便集成,一个原因就是因为调用的方式不统一,java有java的调用格式,c有c的调用方式。因为他们最终“编译”后的程序文件的组织格式不一样。互相不能识别。
3,系统扩展性好。如果你的数据量增加了,我只要升级下服务所在的机器的配置就可以了,程序不用动(因为机器的ip,没有变化,调用方式没有变化,参数规定也没有变化),客户端除了感觉到性能提高了,他感觉不到其他的任何变化。
其实SOA的思想并不是互联网普及之后才有的,在很久之前就有这种想法,只不过应用的不广泛,没有被大家所熟知,也不成熟,不成体系,是互联网的普及推动了这些方法的发展。