MVC是傳統(tǒng)web服務(wù)的常用框架,,直到出現(xiàn)新的需求:私有API,、開(kāi)放API,還有業(yè)務(wù)龐大后進(jìn)行soa拆分,,這就需要新的框架了。 關(guān)于MVC,,有一個(gè)經(jīng)典講解:http://www./jobeet/1_2/Doctrine/zh_CN/04 對(duì)這張圖進(jìn)行修改和細(xì)化: 1,、controller只支持http(s),不支持cli命令行 http參數(shù)的獲取和cli完全不一樣,,web服務(wù)用不上cli,,所以只支持http(s)。 2,、一個(gè)uri應(yīng)只支持一種http method 從安全和http規(guī)范兩個(gè)方面來(lái)說(shuō),,一個(gè)uri應(yīng)只支持一種http method,,不能讓一個(gè)請(qǐng)求即支持get又支持put、post,,所以在controller中的每個(gè)action都要指定一種http method,,如果請(qǐng)求不符合method,返回錯(cuò)誤,。 安全:假如修改個(gè)人簽名的頁(yè)面提交地址為http:///user/status,,參數(shù)為content=xxxx,用戶(hù)請(qǐng)求時(shí)驗(yàn)證本人cookie即可,。這個(gè)頁(yè)面接口應(yīng)該只支持post,,如果同時(shí)支持get,會(huì)出現(xiàn)什么問(wèn)題,?user 1發(fā)表了一張圖片<img src="http:///user/status?content=某商城促銷(xiāo),,地址xxxxx" alt="" />,很明顯這張圖片是無(wú)法顯示的,。當(dāng)user 1的所有好友user 2,、user 3看到這張圖片時(shí),瀏覽器嘗試載入圖片,,就會(huì)自動(dòng)把user 2,、user 3的簽名改成廣告。這就是典型的sns攻擊的原理,。 http規(guī)范:http://book.douban.com/subject/3094230/ 3,、MVC各層職責(zé)與禁止 index.php:職責(zé)——作為入口——根據(jù)路由規(guī)則,把uri請(qǐng)求映射到某個(gè)controller,;作為出口——接收controller層返回的數(shù)據(jù),,然后輸出 controller:職責(zé)——取http數(shù)據(jù)$_GET、$_POST,、put,、delete,然后作為參數(shù)傳遞給model層,,把model層返回的數(shù)據(jù)傳遞給view層,。一個(gè)uri只支持一種http method。禁止——使用$_REQUEST,。 model:職責(zé)——處理業(yè)務(wù),,向下調(diào)用dao(數(shù)據(jù)訪(fǎng)問(wèn)對(duì)象),由于不知道下層用的是什么sql,,所以無(wú)法寫(xiě)sql,。禁止——寫(xiě)SQL,取http數(shù)據(jù)($_GET、$_POST),。 dao:職責(zé)——根據(jù)原子業(yè)務(wù),,封裝各種存儲(chǔ)(mysql、pgsql,、mongodb,、hbase、memcache,、redis,、file)。確保當(dāng)從mysql遷移到pgsql時(shí),,對(duì)外接口輸入和輸出不變,。禁止——對(duì)外暴露用的是什么sql。 view:職責(zé)——只對(duì)數(shù)據(jù)進(jìn)行顯示格式處理,。禁止——業(yè)務(wù)邏輯,。 4、輸出 頁(yè)面返回html,,訂閱是atom。 5,、異常 經(jīng)過(guò)了PP面向過(guò)程的初級(jí)階段,,進(jìn)入中等階段class + return false的OOP,再進(jìn)入高級(jí)階段class + exception的徹底OOP,,就會(huì)發(fā)現(xiàn)OOP的簡(jiǎn)潔易于維護(hù),。 Exception從底層說(shuō)起比較清晰。 dao:catch 數(shù)據(jù)庫(kù)異常(php是PDOException),,throw 自定義錯(cuò)誤碼DaoException(打詳細(xì)log,,這種數(shù)據(jù)庫(kù)錯(cuò)誤應(yīng)由log平臺(tái)發(fā)出警報(bào)給工程師)。 model:catch DaoException,,throw 自定義錯(cuò)誤碼ModelException,。 controller:catch ModelException、catch所有Exception,,return http狀態(tài)碼,、content-type、數(shù)據(jù),、模板名稱(chēng),。如果是http狀態(tài)碼是302,還需要return uri,。 index.php:index.php作為出口,,接收到controller傳來(lái)的結(jié)果,header輸出http狀態(tài)碼,根據(jù)http status code決定是跳轉(zhuǎn)還是輸出,,根據(jù)content-type決定是輸出html,、json還是atom。 todo參考:《錯(cuò)誤碼與狀態(tài)碼》 細(xì)化之后如下圖: todo細(xì)化:view層之多模板templates,、view層之多l(xiāng)ayout與模塊化,、bigpipe MVC框架細(xì)化到這個(gè)程度,能很好的支持傳統(tǒng)web服務(wù),,直到出現(xiàn)了新的挑戰(zhàn): 1,、移動(dòng)互聯(lián)網(wǎng)的需求,官方app需要api(開(kāi)放或私有):iPhone,、Android智能手機(jī)逐漸普及,,在手機(jī)上使用互聯(lián)網(wǎng)服務(wù)更方便,各公司推出官方手機(jī)app,,需要api,。 2、開(kāi)放賬號(hào)和數(shù)據(jù)的需求,,第三方app需要api(開(kāi)放):隨著sns的興起,,各大sns社區(qū)發(fā)現(xiàn)開(kāi)放數(shù)據(jù)給開(kāi)發(fā)者app,能夠形成生態(tài)圈,,能夠盈利,,OAuth這種授權(quán)方案流行了起來(lái)。開(kāi)放的數(shù)據(jù)如果屬于用戶(hù),,那需要先開(kāi)放賬號(hào),,用戶(hù)登錄授權(quán)第三方app獲得頭像、好友列表,。如果是地圖這種自有數(shù)據(jù),,則無(wú)需開(kāi)放賬號(hào)。 3,、開(kāi)放賬號(hào)的需求:為什么到各個(gè)網(wǎng)站都要重新注冊(cè)呢,?于是出現(xiàn)了OpenID,但是使用不夠方便,,小白不容易理解,,而且OpenID只做認(rèn)證,各公司如果支持OpenID沒(méi)有什么額外的價(jià)值,。后來(lái)各社區(qū)開(kāi)放數(shù)據(jù)時(shí),,采用了OAuth,OAuth用于授權(quán)也包含了類(lèi)似OpenID的認(rèn)證功能,。所以現(xiàn)在流行用OAuth登錄,,而不是OpenID,。比如在別的網(wǎng)站上或者app里“用Google賬號(hào)登錄”、“用微博賬號(hào)登錄”,、“用QQ賬號(hào)登錄”并且授權(quán)導(dǎo)入頭像,。 4、業(yè)務(wù)龐大后,,按照soa進(jìn)行拆分,,也會(huì)面臨跨產(chǎn)品線(xiàn)(服務(wù))如何內(nèi)部調(diào)用的問(wèn)題。參考淘寶的數(shù)據(jù)拆分演進(jìn),。 框架進(jìn)化如下: soa服務(wù)拆分,,內(nèi)部各產(chǎn)品線(xiàn)之間如何調(diào)用數(shù)據(jù)? 即使只有1個(gè)業(yè)務(wù),,比如一個(gè)web提供服務(wù),,Android、iPhone app也提供服務(wù),,那web和外網(wǎng)api如何調(diào)用共同的底層,? 用http? 因?yàn)閣eb工程師經(jīng)常接觸“外網(wǎng)遠(yuǎn)程調(diào)用”,,大家都比較熟悉:以前是SOAP(http + xml),,現(xiàn)在是https + json、https rest + json,。 在“內(nèi)網(wǎng)遠(yuǎn)程調(diào)用”使用http + json不可以嗎,? 雖然內(nèi)網(wǎng)外網(wǎng)都是RPC,但外網(wǎng)要求:安全第一,、性能第二;而內(nèi)網(wǎng)要求:性能第一,、內(nèi)網(wǎng)無(wú)需考慮安全,。 用http是很簡(jiǎn)單,大家都熟悉無(wú)學(xué)習(xí)成本,,http比https性能高一些,,但性能還是太低,因?yàn)閔ttp是應(yīng)用層,,調(diào)用傳輸層的tcp,,而socket是tcp的封裝接口,所以socket比http性能高很多,。todo參考《http與socket性能比較》,。 Facebook很早就發(fā)現(xiàn)這個(gè)問(wèn)題,開(kāi)發(fā)了socket協(xié)議的跨語(yǔ)言遠(yuǎn)程服務(wù)調(diào)用框架,,這就是thift,,2008年進(jìn)入Apache開(kāi)源項(xiàng)目,。 而國(guó)內(nèi)普遍落后一些,某博用http,,因?yàn)樾阅艿?,就在web層加了memcache以保證性能。 類(lèi)似的內(nèi)部遠(yuǎn)程調(diào)用框架還有:Google Protocol Buffers,。 todo:《php thrift》 參考資料: http://www./jobeet/1_2/Doctrine/zh_CN/04 http://www./doc/guide/1.1/zh_cn/basics.mvc http://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/ http://blog.csdn.net/wdwbw/article/details/5336799 原文鏈接:http://www.cnblogs.com/sink_cup/archive/2012/09/19/mvc_rpc_thrift.html |
|
來(lái)自: 陳湖雨_毓 > 《我的圖書(shū)館》