应用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 ...
随机推荐
- fork与vfork的区别
fork()与vfock()都是创建一个进程,那他们有什么区别呢?总结有以下三点区别: 1. fork ():子进程拷贝父进程的数据段,代码段 vfork ( ):子进程与父进程共享数据段 ...
- POJ 3786 Adjacent Bit Counts (DP)
点我看题目 题意 :给你一串由1和0组成的长度为n的数串a1,a2,a3,a4.....an,定义一个操作为AdjBC(a) = a1*a2+a2*a3+a3*a4+....+an-1*an.输入两个 ...
- Java 向Hbase表插入数据异常org.apache.hadoop.hbase.client.HTablePool$PooledHTable cannot be cast to org.apache.client.HTable
出错代码如下: //1.create HTablePool HTablePool hp=new HTablePool(con, 1000); //2.get HTable from HTablepoo ...
- 在其他的电脑上配置绿色Jre+tomcat运行环境
其他的同事要使用我们的web程序(基于tomcat的web程序).所以要求是对方的电脑任何程序都不需要安装,把我们的包拷贝过去,直接执行批处理就可以运行. 经过了一番摸索,实现方式如下: 1,准备jr ...
- POJ2632——Crashing Robots
Crashing Robots DescriptionIn a modernized warehouse, robots are used to fetch the goods. Careful pl ...
- 一步一步制作yaffs/yaffs2根文件系统(四)---构建etc、dev等剩余目录
开发环境:Ubuntu 12.04 开发板:mini2440 256M NandFlash 64M SDRAM 交叉编译器:arm-linux-gcc 4.4.3点此可下载 BusyBox版本: ...
- java事务管理(二)
数据库事务和Spring事务是一般面试都会被提到,很多朋友写惯了代码,很少花时间去整理归纳这些东西,结果本来会的东西,居然吞吞吐吐答不上来. 下面是我收集到一些关于Spring事务的问题,希望能帮助大 ...
- Miles per gallon to kilometers per liter
Miles per gallon to kilometers per liter 1 Imperial Gallon = 4.54609188 litres 1 Mile = 1.609344 kil ...
- struts2关于package 的 namespace
namespace决定了action的访问路径,默认为"",可以接收所有路径的actionnamespace可以写为/ ,或者/xxx,或者/xxx/yyy,对应的action访问 ...
- bzoj3237
首先我们可以把没有询问过的边处理掉,重构图 当然这样也不影响复杂度 考虑到每次询问要删除的边很少,我们完全可以整体处理 把询问划分成两个集合,在前半部分询问未出现边我们可以整体处理掉,缩点重编号(询问 ...