可以免費學習藍調(diào)的網(wǎng)站
BS與CS架構(gòu)
在很久以前,有web網(wǎng)頁的時候,有服務器和瀏覽器 這兩個東西是構(gòu)建我們?yōu)g覽互聯(lián)網(wǎng)的輔助工具,瀏覽器是我們?yōu)g覽互聯(lián)網(wǎng)的主要入口,而這只是我們常用的一種方式,除了瀏覽器我們?yōu)g覽互聯(lián)網(wǎng)還可以通過客戶端,也就是我們常用的exe程序,而服務器就是我們?yōu)g覽的內(nèi)容,這些內(nèi)容不是憑空產(chǎn)生的是存在大型服務器里的,服務器和我們普通的電腦硬件(PC)內(nèi)容上沒什么,主要是操作系統(tǒng)會用一些開源的linux系統(tǒng),它的穩(wěn)定性會更好,更新也會更及時。綜合上述我們的這也就分成了瀏覽利用互聯(lián)網(wǎng)的兩個重要流派:
-
BS架構(gòu) -> Browser - Server -> 瀏覽器 - 服務器 e.g:大型網(wǎng)站 新聞門戶
2.png
優(yōu)缺點:
- B/S客戶端的計算機電腦配置要求較低
- B/S最大的優(yōu)點就是不用安裝任何專門的軟件,只要有一個瀏覽器就可以
- B/S客戶端不必安裝及維護
-
CS架構(gòu) -> Client - Server ->客戶端 - 服務器 e.g:QQ 網(wǎng)絡游戲 騰訊視頻(所有可以聯(lián)網(wǎng)的exe程序)
1.png
優(yōu)缺點:
- C/S客戶端的計算機電腦配置要求較高
- C/S每一個客戶端都必須安裝和配置專用的軟件
- C/S每一個客戶端都要進行升級和維護
- C/S一般面向相對固定的用戶群,它可以對權(quán)限進行多層次校驗,提供了更安全的存取模式,對信息安全的控制能力很強。一般高度機密的信息系統(tǒng)應采用C/S結(jié)構(gòu)
PS: 隨著互聯(lián)網(wǎng)的不斷發(fā)展 移動端逐漸興起,App-IOS,Android是手機端的重要瀏覽方式,
在發(fā)展中前端框架google開發(fā)的augular的出現(xiàn)讓web開發(fā)出現(xiàn)了重大變革,他讓web瀏覽器
通過http鏈接第一次訪問直接下載服務器程序(他就相當于本地存儲也就是一個app)瀏覽
方式還是通過url鏈接去訪問網(wǎng)站但現(xiàn)在是混合開發(fā),瀏覽器訪問也相當于app訪問,他們倆
畫了一個等號?!径@個時候前后端分離有了變化】。
前后端分離歷史與歷程
前后端未分離時代:
前后端耦合時代,這時候有個技術(shù)模型叫做mvc,我們開發(fā)web網(wǎng)站都尊崇這個模式開發(fā)直到現(xiàn)在都是。
MVC: M->MODEL;V->VIEW;C->CONTROLLER
而開發(fā)的時候,很久以前的技術(shù)view層用jsp技術(shù),control用servlet,mode用javabean
6.jpg
7.png
大致就是,所有的客戶端請求都被發(fā)送給作為控制器的Servlet,它接收請求,并根據(jù)請求信息將它們分發(fā)給適當?shù)腏SP來響應。同時,Servlet還根據(jù)JSP的需求生成JavaBeans的實例并輸出給JSP環(huán)境。JSP可以通過直接調(diào)用方法或使用UseBean的自定義標簽得到JavaBeans中的數(shù)據(jù)。需要說明的是,這個View還可以采用Velocity、Freemarker等模板引擎。使用了這些模板引擎,可以使得開發(fā)過程中的人員分工更加明確,還能提高開發(fā)效率。
開發(fā)形式:

這種方式已經(jīng)逐漸淘汰。主要原因有兩點:
1.前端在開發(fā)過程中嚴重依賴后端,在后端沒有完成的情況下,前端根本無法干活。
2.由于趨勢問題,會JSP、懂Velocity和曉Freemarker等模板引擎的前端越來越少。
前后端半分離時代:
走過了前后端未分離的時代,來到了前后端半分離的時代。在這個時代,前端負責開發(fā)頁面,通過接口(AJAX)獲取數(shù)據(jù),采用DOM操作對頁面進行數(shù)據(jù)綁定,最終是由前端把頁面渲染出來,這也就是AJAX與SPA應用(單頁應用)結(jié)合的方式.
8.png
1.瀏覽器請求,CDN返回HTML頁面。
2.HTML中的JS代碼以AJAX的方式請求后臺的RESTFUL API接口。
3.接口響應并返回JSON數(shù)據(jù),頁面解析JSON數(shù)據(jù)后通過DOM操作渲染頁面。
這里后端提供的都是以JSON為數(shù)據(jù)格式的API接口供Native端使用,同樣提供給WEB的也是JSON數(shù)據(jù)格式的API接口,那么就意味著WEB的工作流程是:
1.打開WEB瀏覽器,加載基本資源,如CSS、JS和圖片等。
2.使用JS發(fā)起一個AJAX請求到服務端請求數(shù)據(jù),同時展示LOADING(加載中)。
3.得到JSON格式的數(shù)據(jù)后再根據(jù)邏輯選擇模板渲染出DOM字符串。
4.將DOM字符串插入頁面中WEB VIEW渲染出DOM結(jié)構(gòu)。
這些步驟都由用戶所使用的設備中逐步執(zhí)行,也就是說用戶的設備性能與APP的運行速度緊密聯(lián)系,換句話說,如果用戶的設備很低端,那么APP打開頁面的速度就會很慢,極度影響用戶體驗。
為什么說是半分離的呢,因為不是所有頁面都是單頁面應用。在多頁面應用的情況下,前端因為沒有掌握Controller層,前端需要和后端討論頁面是要同步輸出還是異步JSON渲染。而且即使在這個時期,通常也是一個工程師搞定前后端所有的工作。因此在這個階段只能算半分離。
這個時代比起上一個時代還是有進步的,首先前端不會嵌入任何后臺代碼,前端專注于HTML、CSS、JS的開發(fā),不依賴于后端。自己還能夠模擬JSON數(shù)據(jù)來渲染頁面,發(fā)現(xiàn)BUG也能迅速定位出是誰的問題。
然而在這種架構(gòu)下還是存在明顯的弊端的,最明顯的有如下幾點:
1.JS存在大量冗余,在業(yè)務復雜的情況下,頁面的渲染部分的代碼非常復雜。
2.在JSON返回的數(shù)據(jù)量比較大的情況下,渲染非常緩慢,會出現(xiàn)頁面卡頓的情況。
3.SEO(Serach Engine Optimization,搜索引擎優(yōu)化)非常不方便。由于國內(nèi)的搜索引擎的爬蟲無法爬下JS異步渲染的數(shù)據(jù),導致這樣的頁面SEO會存在一定的問題。
4.資源消耗嚴重,在業(yè)務復雜的情況下,一個頁面可能要發(fā)起多次HTTP請求才能將頁面渲染完畢??赡苡腥瞬环?,覺得PC端建立多次HTTP請求也沒啥,但是移動端建立一次HTTP請求的消耗十分巨大。
真是因為如上的缺點,我們在亟需真正的前后端分離架構(gòu)
前后端分離時代:
這個時候是淘寶進行的首次項目開發(fā),他開創(chuàng)性的運用了node.js做中間層。前端負責View和Controller層,后端只負責Model層和Service層。Controller層要怎么實現(xiàn)呢?NodeJS適合運用在高并發(fā)、I/O密集、少量業(yè)務邏輯的場景。他利用了谷歌瀏覽器v8引擎,速度非常的快,最重要的一點是,前端不用再學一門其它語言了,美滋滋??梢园袾odeJS當成跟前端交互的API。
3.png
- NodeJS路由的實現(xiàn)邏輯是把前端靜態(tài)頁面代碼當成字符串發(fā)送到客戶端(例如瀏覽器),簡單理解可以理解為路由是提供給客戶端的一組API接口,只不過返回的數(shù)據(jù)是頁面代碼的字符串而已。
- 用NodeJS來作為橋梁架構(gòu)服務端API輸出的JSON能帶來優(yōu)異性能。后端處于性能和別的原因,提供的接口所返回的數(shù)據(jù)格式也許不太適合前端直接使用,前端所需的排序功能、篩選功能以及到了視圖層的頁面展現(xiàn),也許都需要對接口所提供的數(shù)據(jù)進行二次處理。這些處理雖然是可以放在前端來執(zhí)行,但如果數(shù)據(jù)量一大,便會浪費瀏覽器性能,更會降低頁面渲染速度,影響用戶體驗。因而如今增加NodeJS中間層是一種良好的解決方案。
- 增加了NodeJS中間層之后,瀏覽器(Webview)便不再直接請求服務端的API,而是瀏覽器先去請求服務端的NodeJS,由NodeJS對服務端的API發(fā)起HTTP請求,NodeJS收到服務端的API響應返回的JSON后就去渲染HTML頁面,然后NodeJS直接將HTML頁面flush到瀏覽器。這樣,瀏覽器得到的就是普通的HTML頁面,不再用發(fā)AJAX去請求服務器之后再在瀏覽器進行頁面渲染了。
增加NodeJS中間層主要有以下優(yōu)點:
適配性提升。我們在開發(fā)過程中,經(jīng)常會給PC端、Mobile、App端各自研發(fā)一套前端。其實對于這三端來說,大部分業(yè)務邏輯是一樣的,唯一的區(qū)別就是交互展現(xiàn)邏輯的不同。如果Controller層在后端手里,后端為了這些不同端頁面展現(xiàn)邏輯,自己維護這些Controller,模板無法重用,徒增與前端溝通成本。如果增加了NodeJS層,每種前端的界面展示邏輯由NodeJS層自己維護。產(chǎn)品經(jīng)理在中途如果想要改動界面,可以由前端自己維護,無需后端操心。前后端各司其職,后端專注于自己的業(yè)務邏輯開發(fā),前端專注于產(chǎn)品效果開發(fā)。
9.png
2.響應速度提升。有的時候會遇到后端返回給前端得數(shù)據(jù)太簡單了,需要前端對這些數(shù)據(jù)進行邏輯處理。那么在數(shù)據(jù)量比較小得時候,對其做運算分組等操作,并無影響。但是當數(shù)據(jù)量大的時候,會有明顯的卡頓效果。這時候,NodeJS中間層其實可以將很多這樣的代碼放入NodeJS層處理,也可以替后端分擔一些簡單的邏輯、又可以用模板引擎自己掌握前臺的輸出。這樣做,靈活度、響應度都有較大的提升。
3.性能得到提升。大家應該都知道單一職責原則,從該角度來看,我們請求一個頁面,可能要響應很多個后端接口,請求變多了,自然速度就變慢了,這種現(xiàn)象在Mobile端更加嚴重。采用NodeJS作為中間層,將頁面所需要的多個后端數(shù)據(jù)直接在內(nèi)網(wǎng)階段就拼裝好,再統(tǒng)一返回給前端,會得到更好的性能。
4.異步與模板統(tǒng)一。淘寶首頁就是由幾十個HTML片段(每個片段一個文件)拼裝成的。之前PHP同步加載這幾十個片段,一定是串行的,換成NodeJS之后就可以實現(xiàn)異步加載,讀文件可以并行,一旦這些片段中也包含業(yè)務邏輯,異步的優(yōu)勢就很明顯了,真正做到哪個文件先渲染完就先輸出顯示。前端機的文件系統(tǒng)越復雜,頁面的組成片段越多,這種異步的提速效果就越明顯。前后端模板統(tǒng)一在無線領域很有用,PC頁面和WIFI場景下的頁面適合前端渲染(后端數(shù)據(jù)通過AJAX返回到前端),2G/3G弱網(wǎng)絡環(huán)境則適合后端渲染(數(shù)據(jù)隨著頁面一起返回給前端),所以同樣的模板,在不同的條件下走不同的渲染渠道,模板只需要一次開發(fā)。
前后端分離的缺點:
1.人員問題。宣傳這種架構(gòu)的公司一般都是很高級別的公司,一般的中小型公司沒有這樣的前端資源來支撐這樣的架構(gòu)。如果強推前后端分離的架構(gòu)可能會導致很多問題 ,比如后端被逼著去學VueJS,NodeJS這些,白白增加后端的負擔,甚至會造成后端開發(fā)紛紛離職的情況。
2.產(chǎn)品迭代周期的問題。中小型的軟件公司一般需要一個比較快的軟件迭代周期。采用前后端分離架構(gòu)的話,增加了一個接口指定流程和前后端聯(lián)調(diào)流程。從本質(zhì)上來說放慢了迭代的周期。
3.前端需要學習業(yè)務知識。本來前端只需要掌管視覺交互的部分?,F(xiàn)在因為Controller層也歸前端管了,前端必須對公司的業(yè)務流程有深入的了解,才能準確地寫出顯示邏輯。不過這樣會讓后端覺得前端奪權(quán),前端在混KPI。前端雖然必須要去學無聊的業(yè)務,但是有得必有失,前端也因此能夠站穩(wěn)腳跟。也許正是因為前后端分離架構(gòu)的出現(xiàn),前端可以朝著架構(gòu)師進軍.






