2020-09-25 分類(lèi): 網(wǎng)站建設(shè)
重構(gòu)系統(tǒng)是一項(xiàng)非常具有挑戰(zhàn)性的事情。通常來(lái)說(shuō),在我們的系統(tǒng)是第二個(gè)系統(tǒng)的時(shí)候才需要重構(gòu),即這個(gè)系統(tǒng)本身已經(jīng)很臃腫。我們花費(fèi)了太量的時(shí)間在代碼間的邏輯,開(kāi)發(fā)新的功能變得越來(lái)越慢。這不僅僅可能只是因?yàn)槲覀冎暗募軜?gòu)沒(méi)有設(shè)計(jì)好,而且在我們開(kāi)發(fā)的過(guò)程中沒(méi)有保持著原先設(shè)計(jì)時(shí)的一些原則。如果是這樣的情況,那么這就是一個(gè)復(fù)雜的過(guò)程。
還有一種情況是我們發(fā)現(xiàn)了一種更符合我們當(dāng)前業(yè)務(wù)的框架。
動(dòng)態(tài)CMS
CMS簡(jiǎn)介
CMS是Content Management System的縮寫(xiě),意為"內(nèi)容管理系統(tǒng)".它可以做很多的事情,但是總的來(lái)說(shuō)就是Page和Blog——即我們要?jiǎng)?chuàng)建一些頁(yè)面可以用于寫(xiě)一些About US、Contact Me,以及持續(xù)更新的博客或者新聞,以及其他子系統(tǒng)——通常更新不活躍。通過(guò)對(duì)這些博客或者新聞進(jìn)行分類(lèi),我們就可以有不同的信息內(nèi)容,如下圖:
CMS是政府和企業(yè)都需要的系統(tǒng),他們有很多的信息需要公開(kāi),并且需要對(duì)其組織進(jìn)行宣傳。在我有限的CMS交付經(jīng)驗(yàn)里(大學(xué)時(shí)期),一般第一次交付CMS的時(shí)候,已經(jīng)創(chuàng)建了大部分頁(yè)面。有時(shí)候這些頁(yè)面可能直接存儲(chǔ)在數(shù)據(jù)庫(kù)中,后來(lái)發(fā)現(xiàn)這不是一個(gè)好的方案,于是很多頁(yè)面變成了靜態(tài)頁(yè)面。隨后,在CMS的生命周期里就是更新內(nèi)容。
因而,CMS中起其主導(dǎo)的東西還是Content,即內(nèi)容。而內(nèi)容是一些持續(xù)可變的東西。這也就是為什么WordPress這么流行于CMS界,它是一個(gè)博客系統(tǒng),但是多數(shù)時(shí)候我們只需要更新內(nèi)容。除此不得不提及的一個(gè)CMS框架是Drupal,兩者一對(duì)比會(huì)發(fā)現(xiàn)Drupal比較強(qiáng)大。通常來(lái)說(shuō),強(qiáng)大的一個(gè)負(fù)作用就是——復(fù)雜。
WordPress和Drupal這一類(lèi)的系統(tǒng)都屬于發(fā)布系統(tǒng),而其后臺(tái)可以稱(chēng)為編輯系統(tǒng)。
一般來(lái)說(shuō)CMS有下面的特點(diǎn):
CMS一直就是這樣一個(gè)緊耦合的系統(tǒng)。
CMS架構(gòu)與Django
說(shuō)起來(lái),我一直是一個(gè)CMS黨。主要原因還在于我可以隨心所欲地去修改網(wǎng)站的內(nèi)容,修改網(wǎng)站的架構(gòu)。好的CMS總的來(lái)說(shuō)都有其架構(gòu)圖,下圖似乎是Drupal的模塊圖
一般來(lái)說(shuō),其底層都會(huì)有:
我一直在使用一個(gè)名為Django的Python Web框架,它最初是被開(kāi)發(fā)來(lái)用于管理勞倫斯出版集團(tuán)旗下的一些以新聞內(nèi)容為主的網(wǎng)站的,即是CMS(內(nèi)容管理系統(tǒng))軟件。它是一個(gè)MTV框架——與多數(shù)的框架并沒(méi)有太大的區(qū)別。
層次職責(zé) 模型(Model),即數(shù)據(jù)存取層 處理與數(shù)據(jù)相關(guān)的所有事務(wù):如何存取、如何驗(yàn)證有效性、包含哪些行為以及數(shù)據(jù)之間的關(guān)系等。 模板(Template),即表現(xiàn)層 處理與表現(xiàn)相關(guān)的決定: 如何在頁(yè)面或其他類(lèi)型文檔中進(jìn)行顯示。 視圖(View),即業(yè)務(wù)邏輯層 存取模型及調(diào)取恰當(dāng)模板的相關(guān)邏輯。模型與模板之間的橋梁。
從框架本身來(lái)上看它和別的系統(tǒng)沒(méi)有太大的區(qū)別。
但是如果我們已經(jīng)有多外模塊(即Django中app的概念),那么系統(tǒng)的架構(gòu)就有所不同了。
這就是為何我喜歡用這個(gè)CMS的原因了,我的每個(gè)子系統(tǒng)都以APP的形式提供服務(wù)——博客是一個(gè)app,sitemap是一個(gè)app,api是一個(gè)app。系統(tǒng)直接解耦為類(lèi)似于混合服務(wù)的架構(gòu),即不像微服務(wù)一樣多語(yǔ)言化,又不會(huì)有宏應(yīng)用的緊耦合問(wèn)題。
編輯-發(fā)布分離
我們的編輯和發(fā)布系統(tǒng)在某種意義上緊耦合在一起了,當(dāng)用戶訪問(wèn)量特別大的時(shí)候,這樣會(huì)讓我們的應(yīng)用變得特定慢。有時(shí)候編輯甚至發(fā)布不了新的東西,如下圖引示:
或者你認(rèn)識(shí)出了上圖是源自Martin Folwer的編輯-發(fā)布分離
編輯-發(fā)布分離是幾年前解耦復(fù)雜系統(tǒng)游來(lái)開(kāi)來(lái)帶來(lái)的一個(gè)成果。今天這個(gè)似乎已經(jīng)很常見(jiàn)了,編輯的時(shí)候是在后臺(tái)進(jìn)行的,等到發(fā)布的時(shí)候已經(jīng)變成了一個(gè)靜態(tài)的HTML。
已經(jīng)有足夠多的CMS支持這樣的特性,運(yùn)行起來(lái)似乎特別不錯(cuò),當(dāng)然這樣的系統(tǒng)也會(huì)有緩存的問(wèn)題。有了APP這后,這個(gè)趨勢(shì)就更加明顯了——人們需要提供一個(gè)API。到底是在現(xiàn)有的系統(tǒng)里提供一個(gè)新的API,還是創(chuàng)建一個(gè)新的API。
這時(shí)候,我更愿意選擇后者——畢竟緊耦合一個(gè)系統(tǒng)總會(huì)在后期帶來(lái)足夠多的麻煩。而且基于數(shù)據(jù)庫(kù)構(gòu)建一個(gè)只讀的RESTful API并不是一個(gè)復(fù)雜的過(guò)程,而且也危險(xiǎn)。這時(shí)候的瓶頸就是數(shù)據(jù)庫(kù),但是似乎數(shù)據(jù)庫(kù)都是多數(shù)系統(tǒng)的瓶頸。人們想出了各種各樣的技術(shù)來(lái)解決這個(gè)瓶頸。
于是之前我試著用Node.js + RESTify將我的博客重構(gòu)成了一個(gè)SPA,當(dāng)然這個(gè)時(shí)候CMS還在運(yùn)行著。出于SEO的原因我并沒(méi)有在最后采用這個(gè)方案,因?yàn)槲揖W(wǎng)站的主要流量來(lái)源是Google和是百度。但是我在另外的網(wǎng)站里混合了SPA與MPA,其中的性能與應(yīng)用是相當(dāng)?shù)?,除了第一次加載頁(yè)面的時(shí)候會(huì)帶來(lái)一些延時(shí)。
除了Node.js + RESTify,也試了試Python + Falcon(一個(gè)高性能的RESTful框架)。這個(gè)API理論上也應(yīng)該可以給APP直接使用,并且可以直接拿來(lái)生成靜態(tài)頁(yè)面。
網(wǎng)站欄目:Repractise架構(gòu)篇一:CMS的重構(gòu)與演進(jìn)
分享網(wǎng)址:http://www.rwnh.cn/news5/86705.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)公司、自適應(yīng)網(wǎng)站、外貿(mào)建站、面包屑導(dǎo)航、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容