应用web框架模块设计三国演义篇--转至微博
从事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框架模块设计三国演义篇--转至微博的更多相关文章
- [转]轻量级 Java Web 框架架构设计
工作闲暇之余,我想设计并开发一款轻量级 Java Web 框架,看看能否取代目前最为流行的而又越来越重的 Spring.Hibernate 等框架.请原谅在下的大胆行为与不自量力,本人不是为了重造轮子 ...
- Web框架之Django基础篇
Web框架之Django基础篇 本节介绍Django 简介,安装 基本配置及学习 路由(Urls).视图(Views).模板(Template).Model(ORM). 简介 Django 是一 ...
- 09 基于模块wsgiref版web框架
09 基于模块wsgiref版web框架 模块引入 真实开发中的python web程序,一般会分为两部分: 服务器程序:负责对socket服务器进行封装,并在请求到来时,对请求的各种数据 ...
- Node.js Web 开发框架大全《路由篇》
这篇文章与大家分享优秀的 Node.js 路由(Routers)模块.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用 ...
- Node.js Web 开发框架大全《中间件篇》
这篇文章与大家分享优秀的 Node.js 中间件模块.Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用程序,编写能够处 ...
- Web框架的引入
为什么会有web框架 有了上一篇内容,静态.动态web服务器的实现,已经掌握了客户端请求到服务器处理的机制.在动态资源处理中,根据请求 .py 导入模块应用,然后调用应用入口程序实现动态处理.但是在真 ...
- go-zero之web框架
go-zero 是一个集成了各种工程实践的 web 和 rpc 框架,其中rest是web框架模块,基于Go语言原生的http包进行构建,是一个轻量的,高性能的,功能完整的,简单易用的web框架 服务 ...
- “脚踢各大Python Web框架”,Sanic真有这能耐么?
在Github上,Sanic第一句介绍语就是: "Sanic is a Flask-like Python 3.5+ web server that's written to go fast ...
- 第二百五十六节,Web框架
Web框架 Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. 举例: #!/usr/bin/env python #c ...
随机推荐
- python中unicode、utf8、gbk等编码问题
转自:http://luchanghong.com/python/2012/07/06/python-encoding-with-unicode-and-gbk-and-utf8.html 概要:编码 ...
- 看文档要看仔细,英语要加强啊... cocos2d-x 的 API 和 对应版本的 cocos2d-js 的 API 没有完全对应
/** * Sets the X rotation (angle) of the node in degrees which performs a horizontal rotational skew ...
- [itint5]Excel数转换
http://www.itint5.com/oj/#23 这里就是26进制的转换,但是要注意没有0,A就是1,Z就是26.所以要想象成从0开始,才能用原来的方法计算. //将十进制数转换为excel数 ...
- mybatis和spring3.1整合
因spring3发布时mybatis还没有出正式版本,所以spring没有整合最新的mybatis.不过社区倒是开发了一个中间件. 需要的jar包 mybatis-3.0.6.jar mybatis- ...
- Java 的 Class Path 和 Package
前言: 由于这两个问题新手问得较多, 且回答比较零散, 很难统一整理, 所以就直接写了一篇, 还请大家见谅. 正文:一, 类路径 (class path) 当你满怀着希望安装好了 java, ...
- ArcGIS Runtime for Android开发教程V2.0(3)基础篇---Hello World Map
原文地址: ArcGIS Runtime for Android开发教程V2.0(3)基础篇---Hello World Map - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NE ...
- 关于Apache Struts 2 S2-032高危漏洞的一些确认
2016年4月21日Struts2官方发布两个CVE,其中CVE-2016-3081(S2-032)官方评级为高. 主要原因为在用户开启动态方法调用的情况下,会被攻击者实现远程代码执行攻击. 具体的漏 ...
- R语言笔记:快速入门
1.简单会话 > x<-c(1,2,4) > x [1] 1 2 4 R语言的标准赋值运算符是<-.也可以用=,不过不建议用它,有些情况会失灵.其中c表示连接(concaten ...
- D3D游戏编程系列(一):DXLib的介绍
这篇文章里我准备向大家介绍下我封装的一个基础D3D库:DXLib.有了这样一个类库,可以减少很多无用功以及繁琐的工作,使我们的效率大大提高. DXLib.h #define DIRECTINPUT_V ...
- ISE综合后得到的RTL图如何与硬件对应起来,怎么知道每个element的功能
2013-06-23 21:34:03 要知道“我写的这段代码会综合成什么样的电路呢”,就要搞清楚RTL图中每个模块的功能,从而将代码与硬件对应,判断综合后的电路是否与预期的一致.如何做到? 之前查了 ...