从事web开发已经10年时间,近几年也一直从事微博应用产品的研发。从原生php写网站到使用cms bbs整合的大型站点,从使用各种流行的开源开发框架到成熟稳定的平台级框架下做研发。这期间对应用型web开发框架设计有一些自己的理解和见解,在这里和大家一起分享交流一下。

为了让大家对框架的各个模块有较深的理解,我对模块职能角色匹配了三国人物,在这里纯属为了增加大家的趣味性理解,如有不同见解可以在后面使劲得拍砖:)。

一个较成熟的框架图如下:

三国人物和各个模块角色匹配如下:

一、单一入口(index.php)---门神关羽

一夫当关、万夫莫开。这也是为啥诸葛亮把关羽安排在荆州这个战略要地的原因。因为所有的请求都得经过它。它对请求安全、框架整体型起到至关作用。

二、路由(Router)--引路人徐庶

徐庶的成名之作就是把诸葛亮引荐给了刘备,从此使刘备的事业蒸蒸日上。其实这里最主要说说他的“引路”的作用。一个项目的代码往往要承载各种的业务职能(PC、H5、Api、Manage等等)需要。部署肯定是只有一个物理目录,只不过需要配置不同的主机头和别名,或者同一个域名下Uri 需要映射到不同规则的Controler。引路的路由模块对系统的迁移升级和适应业务扩展起到关键作用。但同时提醒一下,这个地方也是经常是因为变更而导致线上故障问题点。所以设计时保持大模块划分下,细节尽量保持简单

三、控制层(Controler)--掌柜曹操

曹操就不需要过多文字对他画像了。识人、决策、控制这些是Controler工作职能三要素。首先它要对所有的(GET、POST)传入参数做验证,安全过滤、合法性(识人品),然后进行业务判断(决策)、需要调用哪个业务方法(控制),最后响应按不同格式输出(json、html、二进制)。基本干这些活就够了。大体上就是客户带着买卖来了,掌柜的先看看人咋样,人靠谱、具备买卖达成的条件、前柜收钱后柜出货,买卖成交。这一层注意的地方就是不要有太多的业务逻辑在里面否则后柜的业务模型层的诸葛亮会很尴尬,搞的自己一堆业务逻辑在里面,代码看起来很混乱,基本是自己找累。所以设计控制层一定要明确自己的三个职责。

四、业务模型层(Business Model)--劳模诸葛亮

Business Model 这个职能非诸葛亮莫属,诸葛亮在三国演义中绝对是一位日理万机的劳模。整个项目的业务里外大小事务均得有它来完成,所以这一层需要对各种的业务需求有深刻理解后再进行代码编写,写好的类与函数既要抽象可重用也要满足不同的业务场景需要。对于这一层虽然抽象和重用很重要,但是最重要的是条例清晰阅读性好。产品需求变更和开发人员的变化在这一层体现非常明显。

五、表示层(View)--战神吕布

这一层基本是模板渲染了,有很部分框架使用smart模板,也有部分框架使用自己的模板语法。微博目前使用的是yaf框架模板引擎,它书写语法是和原生php编写是一样的,书写起来直接简单,性能也超优,值得推荐给大家使用。

六、异步处理(Queue、Cron)--幕后英雄赵云

大型网站特别是像微博这样高并发请求的产品。异步处理肯定是必要的,运行方式有两种:1、队列处理、2、定时任务执行。赵云经常是在诸葛亮授意下默默的去完成一些看不见但又是绝对重要的任务。这块应该有注意二点:队列监控、日志收集。它们对线上提前发现问题和解决问题提供有力的保障。

七、接口层(Api)--外交官鲁肃

一个平台级产品在技术支撑上部门和人员需要拆解,每个部门和每个业务都会有自己独立的服务模块。他们之间是需要相互依赖、相互调用的,友好、桥梁这就是鲁肃外交官的作用,同是也是接口层(Api)设计的理念和原则。作为项目自身Api层的编写需要内接口声明和注释说明清晰、对外需要保证双方的调用稳定性。孙、刘两家联合据曹鲁肃功不可没。

八、数据层(Data)--后方夏侯敦

兵马未动,粮草先行。在我每次启动新项目研发时有个习惯:就是首先把数据层设计封装好。存储类型选择(mysql、redis、其它),如何分库、分表,缓存的策略和命中率评估、crud接口设计。数据层质量高低对以后需求变更和系统扩容影响很大,同时它也是强有力的后方保障层。

九、缓存层(MC)--良将张辽

张辽是一位不可多得良将正如Memcach读写性能一样。这一层基本和数据层统一做设计和规划,除了数据库数据缓存、也可以做接口缓存、业务数据缓存。但每份缓存最好有统一的更新和清除接口,虽然多谢几行代码但管理起来很方便。

十、通用类库(Class Library)--谋士郭嘉

郭嘉也算是谋士智囊团的代表人物。各种的类库都可以放在里面例如:DB、MC、HTTP、字符串处理、安全过滤、类型转换、登录验证等等。

经过了人物演义后形成如下阵型结构:

阵容队形精英组合在三国打天下也无敌了,哈哈......

聊完了演义,最后还想和大家分享一下我对一款优秀的WEB开发框架特性理解和期待,总结有几点:

1.框架结构清晰、书写代码简单易上手

2.框架定义规范,降低出错的概率

3.良好的可运维性

4.对第三方友好兼容

5.性能优越

6.强大功能集成

总之,“人力”和“电力”是互联网公司最大的成本,一款优秀的开发框架可以把这两个指标降到最低,并且让每位程序员工作身心愉悦、编程能力神速提升,同时公司方面也能有很多的技术沉淀和积累。一举多得、各方受益,岂不美哉。

应用web框架模块设计三国演义篇--转至微博的更多相关文章

  1. [转]轻量级 Java Web 框架架构设计

    工作闲暇之余,我想设计并开发一款轻量级 Java Web 框架,看看能否取代目前最为流行的而又越来越重的 Spring.Hibernate 等框架.请原谅在下的大胆行为与不自量力,本人不是为了重造轮子 ...

  2. Web框架之Django基础篇

    Web框架之Django基础篇   本节介绍Django 简介,安装 基本配置及学习  路由(Urls).视图(Views).模板(Template).Model(ORM). 简介 Django 是一 ...

  3. 09 基于模块wsgiref版web框架

    09 基于模块wsgiref版web框架 模块引入 真实开发中的python web程序,一般会分为两部分:       服务器程序:负责对socket服务器进行封装,并在请求到来时,对请求的各种数据 ...

  4. Node.js Web 开发框架大全《路由篇》

    这篇文章与大家分享优秀的 Node.js 路由(Routers)模块.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用 ...

  5. Node.js Web 开发框架大全《中间件篇》

    这篇文章与大家分享优秀的 Node.js 中间件模块.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用程序,编写能够处 ...

  6. Web框架的引入

    为什么会有web框架 有了上一篇内容,静态.动态web服务器的实现,已经掌握了客户端请求到服务器处理的机制.在动态资源处理中,根据请求 .py 导入模块应用,然后调用应用入口程序实现动态处理.但是在真 ...

  7. go-zero之web框架

    go-zero 是一个集成了各种工程实践的 web 和 rpc 框架,其中rest是web框架模块,基于Go语言原生的http包进行构建,是一个轻量的,高性能的,功能完整的,简单易用的web框架 服务 ...

  8. “脚踢各大Python Web框架”,Sanic真有这能耐么?

    在Github上,Sanic第一句介绍语就是: "Sanic is a Flask-like Python 3.5+ web server that's written to go fast ...

  9. 第二百五十六节,Web框架

    Web框架 Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 举例: #!/usr/bin/env python #c ...

随机推荐

  1. nagios plugins之 check_http

    nagios下的check_http ZT具体参数是一个比较重要的点,我带大家来看看.. //显示版本 #./check_http -V check_http v2053 (nagios-plugin ...

  2. URAL 1146 Maximum Sum & HDU 1081 To The Max (DP)

    点我看题目 题意 : 给你一个n*n的矩阵,让你找一个子矩阵要求和最大. 思路 : 这个题都看了好多天了,一直不会做,今天娅楠美女给讲了,要转化成一维的,也就是说每一列存的是前几列的和,也就是说 0 ...

  3. [itint5]支持删除的后继查询

    http://www.itint5.com/oj/#49 这一题一开始想到是用HashSet+链表来做,链表记录prev和next.这样也可以,后来看到都是连续的整数,而且交流了一下觉得可以用类似并查 ...

  4. 解决浮层弹出如何加上datepicker,并且浮动在上面

    最近在做一个弹出层上弹出的对话框中能弹出一个截止时间的选择框,这个选择框使用datepicker来做. 效果大致是这样的: 但是在做的时候,遇到一个问题,datepicker在弹出层的时候,时间选择框 ...

  5. HeadFirst设计模式之单例模式

    一. 1.The Singleton Pattern ensures a class has only one instance, and provides a global point of acc ...

  6. 关于haproxy hdr_reg(host) 的一些解释

    I've recently taken over an environment using HAProxy, and I'm attempting to learn the config and wh ...

  7. NFC(6)NFC编程的几个重要类,NFC硬件启动android应用原理

    用于NFC编程的几个重要类 Tag NFC 标签 NfcAdapter Nfc 的适配类 NdefMessage 描述NDEF格式的信息 NdefRecord 描述NDEF信息的一个信息段,类似tab ...

  8. C++静态成员变量和静态成员函数小结

    静态类成员包括静态数据成员和静态函数成员两部分. 一 静态数据成员: 类体中的数据成员的声明前加上static关键字,该数据成员就成为了该类的静态数据成员.和其他数据成员一样,静态数据成员也遵守pub ...

  9. sublime打开文件时自动生成并打开.dump文件

    GBK Encoding Support 没有安装前打开ASNI格式编码文件会乱码,安装成功重启则可以打开正常 关于.dump文件生成的解释: 当打开一个非utf-8格式且包含汉字的文件时,subli ...

  10. volicety常用方法

    1.volicety得到某个元素的个数 $extendsInfos.size() 2.volicety 布尔值判断: 如果a为null,#if($a) ,产生的判断值是false  等同于#if(fa ...