日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

1、前言

”前后端分離“已經成為互聯網項目開發的業界標桿,通過Tomcat+Ngnix(也可以中間有個Node.js),有效地進行解耦。并且前后端分離會為以后的大型分布式架構、彈性計算架構、微服務架構、多端化服務(多種客戶端,例如:瀏覽器,車載終端,Android/ target=_blank class=infotextkey>安卓,IOS等等)打下堅實的基礎。前后端分離(解耦)的核心思想是:前端html頁面通過Ajax調用后端的RestFul API并使用Json數據進行交互。一般只有Web服務器才能被外網訪問,應用服務器只能內網訪問。

2、為什么前后端分離

一般公司后端開發人員直接兼顧前端的工作,一邊實現API接口,一邊開發頁面,兩者互相切換著做,而且根據不同的url動態拼接頁面,這也導致后臺的開發壓力大大增加。前后端工作分配不均。不僅僅開發效率慢,而且代碼難以維護。

而前后端分離的話,則可以很好的解決前后端分工不均的問題,將更多的交互邏輯分配給前端來處理,而后端則可以專注于其本職工作,比如提供API接口,進行權限控制以及進行運算工作。而前端開發人員則可以利用nodejs來搭建自己的本地服務器,直接在本地開發,然后通過一些插件來將api請求轉發到后臺,這樣就可以完全模擬線上的場景,并且與后臺解耦。前端可以獨立完成與用戶交互的整一個過程,兩者都可以同時開工,不互相依賴,開發效率更快,而且分工比較均衡。

3、從MVC到前后端分離

MVC 是一種經典的設計模式,全名為 Model-View-Controller,即 模型-視圖-控制器。

其中,模型 是用于封裝數據的載體,例如,在 JAVA 中一般通過一個簡單的 POJO(Plain Ordinary Java Object)來表示,其本質是一個普通的 Java Bean,包含一系列的成員變量及其 getter/setter 方法。對于 視圖 而言,它更加偏重于展現,也就是說,視圖決定了界面到底長什么樣子,在 Java 中可通過 JSP 來充當視圖,或者通過純 HTML 的方式進行展現,而后者才是目前的主流。模型和視圖需要通過 控制器 來進行粘合,例如,用戶發送一個 HTTP 請求,此時該請求首先會進入控制器,然后控制器去獲取數據并將其封裝為模型,最后將模型傳遞到視圖中進行展現。

綜上所述,MVC 的交互過程如下圖所示:

 

Web實現前后端分離解析

 

我們輸入的是 AJAX 請求,輸出的是 JSON 數據,市面上有這樣的技術來實現這個功能嗎?答案是 REST。

如果將瀏覽器這一端視為前端,而服務器那一端視為后端的話,可以將以上改進后的 MVC 模式簡化為以下前后端分離模式:

 

Web實現前后端分離解析

 

可見,有了 REST 服務,前端關注界面展現,后端關注業務邏輯,分工明確,職責清晰。

4、認識Rest架構

REST 本質上是使用 URL 來訪問資源種方式。眾所周知,URL 就是我們平常使用的請求地址了,其中包括兩部分:請求方式 與 請求路徑,比較常見的請求方式是 GET 與 POST,但在 REST 中又提出了幾種其它類型的請求方式,匯總起來有六種:GET、POST、PUT、DELETE、HEAD、OPTIONS。

尤其是前四種,正好與CRUD(Create-Retrieve-Update-Delete,增刪改查)四種操作相對應,例如,GET(查)、POST(增)、PUT(改)、DELETE(刪),這正是 REST 與 CRUD 的異曲同工之妙!需要強調的是,REST 是“面向資源”的,這里提到的資源,實際上就是我們常說的領域對象,在系統設計過程中,我們經常通過領域對象來進行數據建模。

REST 是一個“無狀態”的架構模式,因為在任何時候都可以由客戶端發出請求到服務端,最終返回自己想要的數據,當前請求不會受到上次請求的影響。也就是說,服務端將內部資源發布 REST 服務,客戶端通過 URL 來訪問這些資源,這不就是 SOA 所提倡的“面向服務”的思想嗎?所以,REST 也被人們看做是一種“輕量級”的 SOA 實現技術,因此在企業級應用與互聯網應用中都得到了廣泛應用。

下面我們舉幾個例子對 REST 請求進行簡單描述:

Web實現前后端分離解析

 

可見,請求路徑相同,但請求方式不同,所代表的業務操作也不同,例如,/advertiser/1 這個請求,帶有 GET、PUT、DELETE 三種不同的請求方式,對應三種不同的業務操作。

雖然 REST 看起來還是很簡單的,實際上我們往往需要提供一個 REST 框架,讓其實現前后端分離架構,讓開發人員將精力集中在業務上,而并非那些具體的技術細節。

5、前后端分離意義大嗎?

5.1、該網站前端變化遠比后端變化頻繁,則意義大。

5.2、該網站尚處于原始開發模式,數據邏輯與表現邏輯混雜不清,則意義大。

5.3、該網站前端團隊和后端團隊分屬兩個領導班子,技能點差異很大,則意義大。

5.4、該網站前端效果絢麗/跨設備兼容要求高,則意義大。

6、術業有專攻(開發人員分離)

隨著時代的發展,漸漸的許多大中小公司開始把前后端的界限分的越來越明確,前端工程師只管前端的事情,后端工程師只管后端的事情。正所謂術業有專攻,一個人如果什么都會,那么他畢竟什么都不精。

6.1、對于后端工程師:

把精力放在java基礎,設計模式,jvm原理,spring+springmvc原理及源碼,linux,MySQL事務隔離與鎖機制,mongodb,http/tcp,多線程,分布式架構(dubbo,dubbox,spring cloud),彈性計算架構,微服務架構(springboot+zookeeper+Docker+jenkins),java性能優化,以及相關的項目管理等等。

后端追求的是:三高(高并發,高可用,高性能),安全,存儲,業務等等。

6.2、對于前端工程師:

把精力放在html5,css3,jquery,angularjs,bootstrap,reactjs,vuejs,webpack,less/sass,gulp,nodejs,google V8引擎,JavaScript多線程,模塊化,面向切面編程,設計模式,瀏覽器兼容性,性能優化等等。

前端追求的是:頁面表現,速度流暢,兼容性,用戶體驗等等。

7、耦合時代

幾曾何時,我們的JavaWeb項目都是使用了若干后臺框架,springmvc/struts + spring + spring jdbc/hibernate/mybatis 等等。

大多數項目在java后端都是分了三層,控制層(controller/action),業務層(service/manage),持久層(dao)。

控制層負責接收參數,調用相關業務層,封裝數據,以及路由&渲染到jsp頁面。

然后jsp頁面上使用各種標簽(jstl/el/struts標簽等)或者手寫java表達式(<%=%>)將后臺的數據展現出來,玩的是MVC那套思路。

我們先看這種情況:需求定完了,代碼寫完了,測試測完了,然后呢?要發布了吧?

你需要用maven或者eclipse等工具把你的代碼打成一個war包,然后把這個war包發布到你的生產環境下的web容器(tomcat/jboss/weblogic/websphere/jetty/resin)里,對吧?

發布完了之后,你要啟動你的web容器,開始提供服務,這時候你通過配置域名,DNS等等相關,你的網站就可以訪問了(假設你是個網站)。

那我們來看,你的前后端代碼是不是全都在那個war包里?包括你的js,css,圖片,各種第三方的庫,對吧?下面在瀏覽器中輸入你的網站域名(www.xxx.com),之后發生了什么?(這個問題也是很多公司的面試題)

瀏覽器在通過域名通過dns服務器找到你的服務器外網ip,將http請求發送到你的服務器,在tcp3次握手之后(http下面是tcp/ip),通過tcp協議開始傳輸數據,你的服務器得到請求后,開始提供服務,接收參數,之后返回你的應答給瀏覽器,瀏覽器再通過content-type來解析你返回的內容,呈現給用戶。

那么我們來看,我們先假設你的首頁中有100張圖片,此時,用戶的看似一次http請求,其實并不是一次,用戶在第一次訪問的時候,瀏覽器中不會有緩存,你的100張圖片,瀏覽器要連著請求100次http請求(有人會跟我說http長連短連的問題,不在這里討論),你的服務器接收這些請求,都需要耗費內存去創建socket來玩tcp傳輸(消耗你服務器上的計算資源)。

重點來了,這樣的話,你的服務器的壓力會非常大,因為頁面中的所有請求都是只請求到你這臺服務器上,如果1個人還好,如果10000個人并發訪問呢(先不聊服務器集群,這里就說是單實例服務器),那你的服務器能扛住多少個tcp連接?你的帶寬有多大?你的服務器的內存有多大?你的硬盤是高性能的嗎?你能抗住多少IO?你給web服務器分的內存有多大?會不會宕機?

這就是為什么,越是大中型的web應用,他們越是要解耦。

理論上你可以把你的數據庫+應用服務+消息隊列+緩存+用戶上傳的文件+日志+等等都扔在一臺服務器上,你也不用玩什么服務治理,也不用做什么性能監控,什么報警機制等等,就亂成一鍋粥好了。

但是這樣就好像是你把雞蛋都放在一個籃子里,隱患非常大。如果因為一個子應用的內存不穩定導致整個服務器內存溢出而hung住,那你的整個網站就掛掉了。

如果出意外掛掉,而恰好這時你們的業務又處于井噴式發展高峰期,那么恭喜你,業務成功被技術卡住,很可能會流失大量用戶,后果不堪設想。

注意:技術一定是要走在業務前面的,否則你將錯過最佳的發展期。

此外,你的應用全部都耦合在一起,相當于一個巨石,當服務端負載能力不足時,一般會使用負載均衡的方式,將服務器做成集群,這樣其實你是在水平擴展一塊塊巨石,性能加速度會越來越低,要知道,本身負載就低的功能or模塊是沒有必要水平擴展的,在本文中的例子就是你的性能瓶頸不在前端,那干嘛要水平擴展前端呢???

7.1、開發模式

7.1.1、以前老的方式是:

  • 產品經歷/領導/客戶提出需求
  • UI做出設計圖
  • 前端工程師做html頁面
  • 后端工程師將html頁面套成jsp頁面(前后端強依賴,后端必須要等前端的html做好才能套jsp。如果html發生變更,就更痛了,開發效率低)
  • 集成出現問題
  • 前端返工
  • 后端返工

7.1.2、新的方式是:

  • 產品經歷/領導/客戶提出需求
  • UI做出設計圖
  • 前后端約定接口&數據&參數
  • 前后端并行開發(無強依賴,可前后端并行開發,如果需求變更,只要接口&參數不變,就不用兩邊都修改代碼,開發效率高)
  • 前后端集成
  • 前端頁面調整
  • 集成成功
  • 交付

7.2、請求方式

7.2.1、老的方式是:

  • 客戶端請求
  • 服務端的servlet或controller接收請求(后端控制路由與渲染頁面,整個項目開發的權重大部分在后端)
  • 調用service,dao代碼完成業務邏輯
  • 返回jsp
  • jsp展現一些動態的代碼

7.2.2、新的方式是:

  • 瀏覽器發送請求
  • 直接到達html頁面(前端控制路由與渲染頁面,整個項目開發的權重前移)
  • html頁面負責調用服務端接口產生數據(通過ajax等等,后臺返回json格式數據,json數據格式因為簡潔高效而取代xml)
  • 填充html,展現動態效果,在頁面上進行解析并操作DOM。

8、前后分離的優勢

8.1、可以實現真正的前后端解耦,前端服務器使用Nginx。前端/WEB服務器放的是css,js,圖片等等一系列靜態資源(甚至你還可以css,js,圖片等資源放到特定的文件服務器,例如阿里云的oss,并使用cdn加速),前端服務器負責控制頁面引用&跳轉&路由,前端頁面異步調用后端的接口,后端/應用服務器使用tomcat(把tomcat想象成一個數據提供者),加快整體響應速度。

8.2、發現bug,可以快速定位是誰的問題,不會出現互相踢皮球的現象。頁面邏輯,跳轉錯誤,瀏覽器兼容性問題,腳本錯誤,頁面樣式等問題,全部由前端工程師來負責。接口數據出錯,數據沒有提交成功,應答超時等問題,全部由后端工程師來解決。雙方互不干擾,前端與后端是相親相愛的一家人。

8.3、在大并發情況下,我可以同時水平擴展前后端服務器,比如淘寶的一個首頁就需要2000+臺前端服務器做集群來抗住日均多少億+的日均pv。

8.4、減少后端服務器的并發/負載壓力。除了接口以外的其他所有http請求全部轉移到前端nginx上,接口的請求調用tomcat,參考nginx反向代理tomcat。且除了第一次頁面請求外,瀏覽器會大量調用本地緩存。

8.5、即使后端服務暫時超時或者宕機了,前端頁面也會正常訪問,只不過數據刷不出來而已。

8.6、也許你也需要有微信相關的輕應用,那樣你的接口完全可以共用,如果也有App相關的服務,那么只要通過一些代碼重構,也可以大量復用接口,提升效率。(多端應用)

8.7、頁面顯示的東西再多也不怕,因為是異步加載。

8.8、nginx支持頁面熱部署,不用重啟服務器,前端升級更無縫。

8.9、增加代碼的維護性&易讀性(前后端耦在一起的代碼讀起來相當費勁)。

8.10、提升開發效率,因為可以前后端并行開發,而不是像以前的強依賴。

8.11、在nginx中部署證書,外網使用https訪問,并且只開放443和80端口,其他端口一律關閉(防止黑客端口掃描),內網使用http,性能和安全都有保障。

8.12、前端大量的組件代碼得以復用,組件化,提升開發效率,抽出來!

9、注意事項

9.1、在開需求會議的時候,前后端工程師必須全部參加,并且需要制定好接口文檔,后端工程師要寫好測試用例(2個維度),不要讓前端工程師充當你的專職測試,推薦使用chrome的插件postman或soapui或jmeter,service層的測試用例拿junit寫。ps:前端也可以玩單元測試嗎?

9.2、上述的接口并不是java里的interface,說白了調用接口就是調用你controler里的方法。

9.3、加重了前端團隊的工作量,減輕了后端團隊的工作量,提高了性能和可擴展性。

9.4、我們需要一些前端的框架來解決類似于頁面嵌套,分頁,頁面跳轉控制等功能。(上面提到的那些前端框架)。

9.5、如果你的項目很小,或者是一個單純的內網項目,那你大可放心,不用任何架構而言,但是如果你的項目是外網項目,呵呵噠。

9.6、以前還有人在使用類似于velocity/freemarker等模板框架來生成靜態頁面,仁者見仁智者見智。

9.7、這篇文章主要的目的是說jsp在大型外網java web項目中被淘汰掉,可沒說jsp可以完全不學,對于一些學生朋友來說,jsp/servlet等相關的java web基礎還是要掌握牢的,不然你以為springmvc這種框架是基于什么來寫的?

9.8、如果頁面上有一些權限等等相關的校驗,那么這些相關的數據也可以通過ajax從接口里拿。

9.9、對于既可以前端做也可以后端做的邏輯,我建議是放到前端,為什么?

因為你的邏輯需要計算資源進行計算,如果放到后端去run邏輯,則會消耗帶寬&內存&cpu等等計算資源,你要記住一點就是:服務端的計算資源是有限的,而如果放到前端,使用的是客戶端的計算資源,這樣你的服務端負載就會下降(高并發場景)。

9.10、前端需要有機制應對后端請求超時以及后端服務宕機的情況,友好的展示給用戶。

分享到:
標簽:后端 分離
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定