`
zhangziyueup
  • 浏览: 1169791 次
文章分类
社区版块
存档分类
最新评论

关于三种主流WEB架构的思考

 
阅读更多

做WEB好几年了,各种语言和技术都稍有涉猎。今天心血来潮,突然想总结一下。其实不论什么技术,什么需求,通常WEB开发就是通过WEB前端管理一个或大或小或独立或分布式的关系型数据库,很多东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并非OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。

以下想法主要以PHP实现为示例,但很多体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引起无数人关注的Delphifo PHP的评测

WEB程序的架构基本上可以分成以下三类:

(一) 基于“WEB页面/文件”,例如CGI和PHP/ASP程序。程序的文件分别存储在不同的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,然后由该文件来处理请求,并返回响应结果。

比如http://www.website.conm/news/readnews.php?id=1234

可以想像,我们在站点根目录的news目录下放置一个readnews.php文件。

这种开发方式最自然,最易理解,也是PHP最常用的方式。要注意产生的URL对搜索引擎不友好,不过你可以用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。

(二) 基于“动作”(Action)。这是MVC架构的WEB程序所采用的最常见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),ZendFramework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动作(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式一样,都是请求/响应驱动的方案,离不开HTTP。

比如 http://www.website.com/news/read/id/1234

可以想像在实际代码中,我们会有一个控制器newsController,其中有一个readAction。不同框架可能默认实现方式稍有不同,有的是一个Controller一个文件,其中有多个Action,有的是每个Action一个文件。当然这些你都可以自己控制,题外话。

这种方式的URL通常都很漂亮,对搜索引擎友好,因为很多框架都自带有URL重写功能。可以自由规定URL中controller、action及参数出现的位置。

另外,还有更直接的基于URL的设计方案,那就是REST。通过人为规定URL的构成形式(比如Action限制成只有几种)来促进网站之间的互相访问,降低开发的复杂性,提高系统的可伸缩性。REST对于WebServices来说是一个创新。

虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通讯问题,但REST的出现,会对单个项目的架构造成影响(很显然你在开发时就要构造规范的URL)。将来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,ZendFramework也提供了Zend_Rest来支持REST,包括Server和Client。

(三) 基于“组件”(Component ,GUI设计也常称控件)、事件驱动的架构,最常见的是微软的.NET。基本思想是把程序分成很多组件,每个组件都可以触发事件,调用特定的事件处理器来处理(比如在一个HTML按钮上设置onClick事件链接到一个PHP函数)。这种设计远离HTTP,HTTP请求完全抽象,映射到一个事件。

事实上这种设计原本最常应用于传统桌面GUI程序的开发,例如Delphi,JavaSwing等。所有表现层的组件比如窗口,或者HTML表单都可以由IDE来提供,我们只需要在IDE里点击或拖动鼠标就能够自动添加一个组件,并且添加一个相应的事件处理器。

这种开发方式有几个优点:

·复用性-代码高度可重用。

·易于使用 -通常只需要配置控件的属性,编写相关的事件处理函数。

我个人也挺喜欢这种方式,PEAR就提供了相当强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还可以与Smarty等模板引擎相结合。这对于项目开发来说是一个补充性的功能,在项目中的某些部份使用QuickForm,有时可以大大加快开发。

而完全基于组件和事件驱动的开发框架对于PHP来说也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来说很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为什么呢?

我觉得主要有以下两个问题:

(1)效率问题

这里指的不是开发效率,而是代码的执行效率。众所周知,正常情况下,PHP的执行是相当高效的。但是目前这种基于控件的框架效率都成问题。Prado本身提供了一个缓存机制来缓解这个问题。如果不采用缓存,可以说很多站点根本不能使用Prado这样的框架,比如门户网站,大型论坛等。

但ASP.NET不太一样,因为它是编译型的框架,最后生成的代码是编译生成的,不需要再次进行中间过程的诸多处理,所以在第一次执行之后速度会很快,执行效率还是很高的。 这是语言层次的功能,Prado无法通过代码层次的努力完全弥补。

(2)没有强大的IDE支持

设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工作。.NET的强大就在于它把程序员从重复的工作中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。

总之,这种基于控件的框架比较适合于用户交互较多的,需要对页面中的很多组件设置不同处理操作,但对于性能要求不高的应用。另外,带有组件支持的框架通常对AJAX的支持都较好,比如.NET和Rubyon Rails。

综上,三种架构基本上可以代表目前的所有主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。

目前PHP开发的状况和未来的趋势:

平时做PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,我们最常用的是基于“文件”的架构,其实也就是一种“面向过程”的开发方式。通常我们写PHP程序的目的就是“快点上线,让程序跑起来”。而且大多数PHP程序员还要和HTML、CSS做近身搏斗,所以如果程序太抽象,调整视觉效果就比较困难。所以对于小项目,这是一个最好的选择。

但越来越多人认识到,面向对象和MVC框架更能促进代码的复用和分享,而且程序易于扩展,随着程序复杂性的增加这个趋势越明显。所以OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和ZendFramework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,而且主动模仿和吸收RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP原本开发社区的庞大人数,将来也许又会再产生出一些行业性的标 准。

这种选择适合于中大型项目,特别是需要较大的团队合作和需要长期维护和二次开发情况。个人认为这是将来PHP开发的趋势。

而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。但是也有不少人在做这方面的努力,例如Codegear的Delphifor PHP,就吸引了很多人的关注。如果有强大的商业支持,也许将来在开发市场也会占一席之地。

我会在下一篇文章介绍D4P的新特性并作评测。

WEB开发的未来展望:

随着更贴近HTTP的REST的流行,我觉得像.NET和Java中的抽象组件的方式会受到冲击。因为这些组件并不如它们所承诺的那么方便。未来MVC+REST+RIA的模式应该会比较流行。

AJAX是一把双刃剑,尽管事件驱动的架构看起来非常适合于处理异步的请求(可以想像页面中存在几个组件,每个组件都可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要满足各种浏览器的兼容性要求,还要能够自己进行扩展,以满足项目中千奇百怪的需求。很多时候我更倾向于使用一些JS框架如Prototype来自己开发各种效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,因为你并不知道真正发生了什么。

(一点牢骚也贴上来)

关于WEB开发的个人疑惑:

l为了让开发更简单,我们不得不学习使用复杂的开发工具和框架,这到底是一个进步,还是退步?

lIDE让程序员变聪明还是变傻? 当我们在服务器代码里面就可以设计客户端界面,这是一个进步还是退步?

举 个例子说,微软的ASP.NETAJAX,让我们可以在服务器端设计各种异步的控件。那么程序员甚至可以不会Javascript,不懂AJAX就设计出各种客户端效果。要是哪一天项目需要设计稍复杂的效果,靠IDE和框架无法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年之后,你会发现自己除了各种IDE之后,真正精通的技术很少,脱离了IDE你写一个小程序都要查半天API手册,因为你平时都是依赖“自动补齐”来写代码的!这样的情景,我想没有人愿意发生。

也许对于短期开发的项目来说,是一个进步,但对于程序员个人的成长来说,这并不是好事。对工具的依赖,导致了我们对于底层和核心技术的不求甚解,限制了个人的成长。

分享到:
评论

相关推荐

    ASP.NET Web API 2框架揭秘

    本书可以作为讲设计架构的书来读,因为其以经过长期检验的经典架构作为学习素材,可很好地启发深度思考。讲原理的书同样足够实用。了解ASP.NETAPI框架的运行原理,才能写出迎合框架的高效程序,才能找到解决具体项目...

    基于面向服务体系架构SOA和ROA的业务组件模型

    当前IT技术迅猛发展,SOA、Web2.0、3G、三网融合等正逐步成为主流,如何整合 PC、手机、电视、特有设备等各种终端,综合利用Flex、JSP、HTML、ASP.NET等多种客户端技术成为大家关注的问题。本文以 J2EE作为服务器端...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    所使用的应用服务器是jboss 5.1和weblogic 11g,详细介绍了这两种应用服务器的安装和使用,以及如何在两大主流服务器上安装、部署java ee应用。  本书内容主要包括三部分,第一部分介绍java ee开发的基础知识,...

    大数据行业分析报告.doc

    主要可分 为:数据采集、数据存取、基础架构、数据处理、统计分析、数据挖掘、模型预测和结 果呈现等8种技术。同时,由这几种技术形成了批处理、流处理和交互分析三种计算模式 。 4、大数据的应用 大数据的应用范围...

    大数据行业分析报告DOC.doc

    主要可分 为:数据采集、数据存取、基础架构、数据处理、统计分析、数据挖掘、模型预测和结 果呈现等8种技术。同时,由这几种技术形成了批处理、流处理和交互分析三种计算模式 。 4、大数据的应用 大数据的应用范围...

    Hadoop实战中文版.PDF

    1568.11 多用户作业的调度 1578.11.1 多个JobTracker 1588.11.2 公平调度器 1588.12 小结 160第三部分 Hadoop也疯狂第9章 在云上运行Hadoop 1629.1 Amazon Web Services简介 1629.2 安装AWS 1639.2.1...

    测试培训教材

    软件测试的度量是测试管理必须仔细思考的问题。缺乏尺度会让测试失去平衡,缺乏标准会让测试工作难以衡量。 2、如何搭建测试管理平台? 首要问题是流程的规范化。 (1) 测试进入和退出标准。 (2) 协作流程。 (3...

Global site tag (gtag.js) - Google Analytics