设为首页
优惠IDC
收藏本站
六狼博客
六狼论坛
开启辅助访问
切换到窄版
用户名
Email
自动登录
找回密码
密码
登录
立即注册
只需一步,快速开始
只需一步,快速开始
快捷导航
门户
首页
BBS
云计算
大数据
手机
移动开发android,ios,windows phone,windows mobile
编程
编程技术java,php,python,delphi,ruby,c,c++
前端
WEB前端htmlcss,javascript,jquery,html5
数据库
数据库开发Access,mysql,oracle,sql server,MongoDB
系统
操作系统windows,linux,unix,os,RedHat,tomcat
架构
项目管理
软件设计,架构设计,面向对象,设计模式,项目管理
企业
服务
运维实战
神马
搜索
搜索
热搜:
php
java
python
ruby
hadoop
sphinx
solr
ios
android
windows
centos
本版
帖子
用户
六狼论坛
»
首页
›
项目管理
›
架构设计
›
互联网创业的准备——框架:从MVC到开放API ...
返回列表
查看:
247
|
回复:
0
互联网创业的准备——框架:从MVC到开放API
[复制链接]
sink_cup
sink_cup
当前离线
积分
214
窥视卡
雷达卡
升级
4.67%
当前用户组为
举人
当前积分为
214
, 升到下一级还需要 286 点。
64
主题
64
主题
64
主题
举人
举人, 积分 214, 距离下一级还需 286 积分
举人, 积分 214, 距离下一级还需 286 积分
积分
214
发消息
楼主
|
发表于 2013-1-4 02:19:21
|
显示全部楼层
|
阅读模式
<div id="cnblogs_post_body">《互联网创业的准备》系列文章&mdash;&mdash;
http://cnblogs.com/sink_cup/
《
互联网创业的准备&mdash;&mdash;后勤:电脑、邮箱、会议
》
http://www.cnblogs.com/sink_cup/archive/2012/09/14/pc_mac_linux.html
《
互联网创业的准备&mdash;&mdash;架构
》
http://www.cnblogs.com/sink_cup/archive/2012/09/14/web_arch.html
《
互联网创业的准备&mdash;&mdash;带宽与CDN
》
http://www.cnblogs.com/sink_cup/archive/2012/09/14/web_bandwidth.html
MVC是传统web服务的常用框架,直到出现新的需求:私有API、开放API,还有业务庞大后进行soa拆分,这就需要新的框架了。
关于MVC,有一个经典讲解:
http://www.symfony-project.org/jobeet/1_2/Doctrine/zh_CN/04
对这张图进行修改和细化:
1、controller只支持http(s),不支持cli命令行
http参数的获取和cli完全不一样,web服务用不上cli,所以只支持http(s)。
2、一个uri应只支持一种http method
从安全和http规范两个方面来说,一个uri应只支持一种http method,不能让一个请求即支持get又支持put、post,所以在controller中的每个action都要指定一种http method,如果请求不符合method,返回错误。
安全:假如修改个人签名的页面提交地址为http://example.com/user/status,参数为content=xxxx,用户请求时验证本人cookie即可。这个页面接口应该只支持post,如果同时支持get,会出现什么问题?user 1发表了一张图片<img src="http://example.com/user/status?content=某商城促销,地址xxxxx" alt="" />,很明显这张图片是无法显示的。当user 1的所有好友user 2、user 3看到这张图片时,浏览器尝试载入图片,就会自动把user 2、user 3的签名改成广告。这就是典型的sns攻击的原理。
http规范:
http://book.douban.com/subject/3094230/
3、MVC各层职责与禁止
index.php:职责&mdash;&mdash;作为入口&mdash;&mdash;根据路由规则,把uri请求映射到某个controller;作为出口&mdash;&mdash;接收controller层返回的数据,然后输出
controller:职责&mdash;&mdash;取http数据$_GET、$_POST、put、delete,然后作为参数传递给model层,把model层返回的数据传递给view层。一个uri只支持一种http method。禁止&mdash;&mdash;使用$_REQUEST。
model:职责&mdash;&mdash;处理业务,向下调用dao(数据访问对象),由于不知道下层用的是什么sql,所以无法写sql。禁止&mdash;&mdash;写SQL,取http数据($_GET、$_POST)。
dao:职责&mdash;&mdash;根据原子业务,封装各种存储(mysql、pgsql、mongodb、hbase、memcache、redis、file)。确保当从mysql迁移到pgsql时,对外接口输入和输出不变。禁止&mdash;&mdash;对外暴露用的是什么sql。
view:职责&mdash;&mdash;只对数据进行显示格式处理。禁止&mdash;&mdash;业务逻辑。
4、输出
页面返回html,订阅是atom。
5、异常
经过了PP面向过程的初级阶段,进入中等阶段class + return false的OOP,再进入高级阶段class + exception的彻底OOP,就会发现OOP的简洁易于维护。
Exception从底层说起比较清晰。
dao:catch 数据库异常(php是PDOException),throw 自定义错误码DaoException(打详细log,这种数据库错误应由log平台发出警报给工程师)。
model:catch DaoException,throw 自定义错误码ModelException。
controller:catch ModelException、catch所有Exception,return http状态码、content-type、数据、模板名称。如果是http状态码是302,还需要return uri。
index.php:index.php作为出口,接收到controller传来的结果,header输出http状态码,根据http status code决定是跳转还是输出,根据content-type决定是输出html、json还是atom。
todo参考:《错误码与状态码》
细化之后如下图:
todo细化:view层之多模板templates、view层之多layout与模块化、bigpipe
MVC框架细化到这个程度,能很好的支持传统web服务,直到出现了新的挑战:
1、移动互联网的需求,官方app需要api(开放或私有):iPhone、Android智能手机逐渐普及,在手机上使用互联网服务更方便,各公司推出官方手机app,需要api。
2、开放帐号和数据的需求,第三方app需要api(开放):随着sns的兴起,各大sns社区发现开放数据给开发者app,能够形成生态圈,能够盈利,OAuth这种授权方案流行了起来。开放的数据如果属于用户,那需要先开放帐号,用户登录授权第三方app获得头像、好友列表。如果是地图这种自有数据,则无需开放帐号。
3、开放帐号的需求:为什么到各个网站都要重新注册呢?于是出现了OpenID,但是使用不够方便,小白不容易理解,而且OpenID只做认证,各公司如果支持OpenID没有什么额外的价值。后来各社区开放数据时,采用了OAuth,OAuth用于授权也包含了类似OpenID的认证功能。所以现在流行用OAuth登录,而不是OpenID。比如在别的网站上或者app里&ldquo;用Google帐号登录&rdquo;、&ldquo;用微博帐号登录&rdquo;、&ldquo;用QQ帐号登录&rdquo;并且授权导入头像。
4、业务庞大后,按照soa进行拆分,也会面临跨产品线(服务)如何内部调用的问题。参考淘宝的数据拆分演进。
框架进化如下:
soa服务拆分,内部各产品线之间如何调用数据?
即使只有1个业务,比如一个web提供服务,Android、iPhone app也提供服务,那web和外网api如何调用共同的底层?
用http?
因为web工程师经常接触&ldquo;外网远程调用&rdquo;,大家都比较熟悉:以前是SOAP(http + xml),现在是https + json、https rest + json。
在&ldquo;内网远程调用&rdquo;使用http + json不可以吗?
虽然内网外网都是RPC,但外网要求:安全第一、性能第二;而内网要求:性能第一、内网无需考虑安全。
用http是很简单,大家都熟悉无学习成本,http比https性能高一些,但性能还是太低,因为http是应用层,调用传输层的tcp,而socket是tcp的封装接口,所以socket比http性能高很多。todo参考《http与socket性能比较》。
Facebook很早就发现这个问题,开发了socket协议的跨语言远程服务调用框架,这就是thift,2008年进入Apache开源项目。
而国内普遍落后一些,某博用http,因为性能低,就在web层加了memcache以保证性能。
类似的内部远程调用框架还有:Google Protocol Buffers。
todo:《php thrift》
参考资料:
http://www.symfony-project.org/jobeet/1_2/Doctrine/zh_CN/04
http://www.yiiframework.com/doc/guide/1.1/zh_cn/basics.mvc
http://www.biaodianfu.com/oauth-openid.html
http://zh.wikipedia.org/wiki/OAuth
http://zh.wikipedia.org/wiki/OpenID
http://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/
http://blog.csdn.net/wdwbw/article/details/5336799
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
显身卡
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
本版积分规则
发表回复
回帖后跳转到最后一页
Copyright © 2008-2020
六狼论坛
(https://it.6wolf.com) 版权所有 All Rights Reserved.
Powered by
Discuz!
X3.4
京ICP备14020293号-2
本网站内容均收集于互联网,如有问题请联系
QQ:389897944
予以删除
快速回复
返回顶部
返回列表