本文是个科普文章,有些内容可能不精准,为了给女儿解释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的思想并不是互联网普及之后才有的,在很久之前就有这种想法,只不过应用的不广泛,没有被大家所熟知,也不成熟,不成体系,是互联网的普及推动了这些方法的发展。

从SOA 谈软件的发展的更多相关文章

  1. 软件项目发展历史<人月神话>这本书好

    几乎是计算机软件开发的发展历史     人月神话,增加人手并不一定能提高开发速度. 原因在于,有些任务是无法分解的,存在先后顺序.无法同步进行. 增加人手,增加的是沟通成本,相互牵制.可以分解的任务就 ...

  2. 从头开始写框架(一):浅谈JS模块化发展

    博客申请下来已经过去一个月了,一直不知道写点什么,毕竟我的文笔不是很好orz. 不过既然申请下来了,不写点什么总是觉得很可惜.正好最近在自己写框架,就把自己的进程和一些心得体会分享出来吧. 写在前面: ...

  3. 调研一类软件的发展演变—聊天软件( 1000-2000 words, in Chinese)

    因为本人平时对聊天软件的涉及比周边其他同学而言所涉及的是比较多的.所以说想写写这个东西.(ps本文里面的具体通讯信息的时间安排不分先后) 也许最起初的通讯信息的传达是利用.烽火狼烟这一类可以远距离视觉 ...

  4. 调研一类软件的发展演变( 1000-2000 words, in Chinese)

    WARING:大量个人观点,可靠性突出一个没有. 随着时代的发展,科技的用途也在发生着改变.最初,计算机是高端科学家用来计算导弹路线.模拟核弹爆炸用的,而现在计算机更多是平凡百姓家的一台娱乐设备.当今 ...

  5. 思迈特软件Smartbi发展再提速,完成B+轮过亿战略融资

    2021年4月,思迈特软件(Smartbi)宣布完成亿级B+轮战略融资,本轮投资方为领先的全球企业级数据分析和组织智能服务平台提供商--明略科技.此前,思迈特软件曾先后获得来自价值资本.方广资本的数千 ...

  6. Linus 谈软件开发管理经验(转载)

    转注:英文原文写于 2011 年 导读:没有人比Linus Torvalds更了解软件开发项目管理中的酸甜苦辣了.作为Linux的创建者,Torvalds在过去二十年指导了数以千计的开发者共同改进开源 ...

  7. 浅谈软件配置管理工具(github & SVN)

    1   配置管理名词定义 1.1 配置项 软件生存周期各个阶段活动的产物经审批后即可称之为软件配置项. 软件配置项包括: ①与合同.过程.计划和产品有关的文档和资料: ②源代码.目标代码和可执行代码: ...

  8. Linus 谈软件开发管理经验

    原文出处: linuxtoday   译文出处:CSDN // 伯乐在线转注:英文原文写于 2011 年 导读:没有人比Linus Torvalds更了解软件开发项目管理中的酸甜苦辣了.作为Linux ...

  9. SOA案例架构分析浅谈

    上课中讲到了SOA架构设计,自己在课下决定总结一下对于SOA架构的理解以及应用. 先总结一下SOA的定义,SOA是面向服务架构,它可以根据需求通过网络对松散耦合的粗粒度应用组件进行分布式部署.组合和使 ...

随机推荐

  1. fpga配置方式 .jic固化为ps模式

    FPGA不同下载方式的区别[扫盲]以及如何利用AS模式固化程序(转载)     主动配置方式(AS)和被动配置方式(PS)和最常用的(JTAG)配置方式: AS由FPGA器件引导配置操作过程,它控制着 ...

  2. Linux用户的基本操作1 用户相关信息 及useradd /usermod 部分

    目录 linux 用户管理 - 用户的基本操作 用户管理 用户的相关命令 linux 用户管理 - 用户的基本操作 用户管理 1.什么是用户? 用户指的是能够正常登录Linux或windows系统 2 ...

  3. Python自动化学习--Webdriver中的常用方法

    from selenium import webdriver driver = webdriver.Chrome() driver.get("https://www.baidu.com/&q ...

  4. PAT Basic 1028 人口普查 (20 分)

    某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 200 岁的老人,而今天是 2014 ...

  5. 04javascript02

    1.BOM编程 1.1入门 BOM就是浏览器对象模型编程,通过javascript引擎提供的四个浏览器对象,操作浏览器,这叫BOM编程. 1.2window对象(重点) <!DOCTYPE ht ...

  6. Candidate Generation and LUNA16 preprocessing

    在这个kernel中,我们将讨论有助于更好地理解问题陈述和数据可视化的方法. 我还将提供有用的资源和信息的链接. 此脚本是用Python编写的. 我建议人们在桌面上安装anaconda,因为here提 ...

  7. java Thread源码分析

    一.使用 java 多线程 java多线程其中两种使用方式: 1.继承 Thread 类 2.实现 Runnable 接口 public class ThreadTest { public stati ...

  8. SQL查询优化的步骤

    一.定位慢查询 SQL优化的一般步骤:先查询mysql数据库运行状况,然后定位慢查询,再分析sql的执行过程,然后进行优化 1.使用show status查询数据库的运行状况 //显示数据库运行状态 ...

  9. django之logo日志的配置和使用

    一:为什么使用日志 假如,在项目调试过程中,在某些地方加上了print()函数,输出了一些调试信息.在项目上线的时候,不要将调试信息暴露出去,但是调试信息还要用,该怎么办?项目测试运行在远端服务器上, ...

  10. Vue刷新token,判断token是否过期

    1.判断token是否过期,前端请求后,后台会返回一个状态给你.根据状态判断是否过期,刷新token 2.是否每次请求后端都会返回新的token给你.或者后端给你定义了一个刷新token的方法,那此时 ...