為什麼一定要前後端分離?

2021-01-08 java思維導圖

作者:孤獨煙原文:http://www.cnblogs.com/rjzheng/p/9185502.html

引言

由於近期前端抽不出資源,博主最近接手一個前端項目的代碼維護工作。拿到手一看,一臉懵逼,和博主當年所學的jsp開發方式、利用ajax來請求數據的單頁面開發方式完全不同。然而火坑已經跳下,只能硬著頭皮啃,博主只能默默告訴自己:"衝衝衝,四驅戰士在行動!"

博主勉強算是經歷了前端開發的幾個時期吧。本文以一種循序漸進的方法,講前後端分離架構的必要性。不過不得不說一點,目前前後端分離架構的文章一搜一大把,博主畢竟不是專業搞前端的,如果文章有什麼理解不到位的地方,請及時指出,不勝感激。

正文

以博主的資歷,沒有經歷過更早的時期了,一出山SpringMVC和struts2等架構已經很成熟,所以博主最早接觸的開發方式就是從MVC開發方式開始的,博主將開發方式分為未分離,半分離和分離三個時期。

未分離時期

MVC,博主就不多做解釋了,在早期JSP+SERVLET中的結構圖如下

大致就是所有的請求都被發送給作為控制器的Servlet,它接受請求,並根據請求信息將它們分發給適當的JSP來響應。同時,Servlet還根據JSP的需求生成JavaBeans的實例並輸出給JSP環境。JSP可以通過直接調用方法或使用UseBean的自定義標籤得到JAVABeans中的數據。需要說明的是,這個View還可以採用 Velocity、Freemaker 等模板引擎。使用了這些模板引擎,可以使得開發過程中的人員分工更加明確,還能提高開發效率。那麼,在這個時期,開發方式有如下兩種:

方式一:

方式二:

先說明一下,方式二已經逐漸淘汰。主要原因有兩點:

(1)前端在開發過程中嚴重依賴後端,在後端沒有完成的情況下,前端根本無法幹活。(2)由於趨勢問題,會JSP,懂velocity,freemarker的前端越來越少。因此,方式二逐漸不被採用。然而,不得不說一點,方式一,其實很多小型傳統軟體公司至今還在使用。那麼,方式一和方式二具有哪些共同的缺點呢?

I、前端無法單獨調試

在項目上線後,遇到一些問題。比如樣式出問題了,由於前端不具備項目開發環境,那麼就有可能出現如下對話

前端:"我這裡沒問題啊。後端,你那裡正常麼?"後端:"我這裡不正常啊。要不你過來看一下吧?"前端:"一時我也看不出問題,我也沒環境,怎麼辦?"後端:"你沒環境,坐我這邊調吧。"然後,前端就滿臉不爽的在你那調代碼了。更有些情商低的後端就直接在旁邊開摁手機,實在是。。。。。

總結,因為前端無法單獨調試。一方面開發效率降低。另一方面,還有可能引發公司內部人員上的矛盾。

II、前端不可避免會遇到後臺代碼

比如前端可能碰到如下結構的代碼

<body><%request.setCharacterEncoding("utf-8")String name=request.getParameter("username");out.print(name);%></body>

身為前端,在頁面裡看到了後臺代碼,必然內心是十分不快的,這種方式耦合性太強。那麼,就算你用了freemarker等模板引擎,不能寫JAVA代碼。那前端也不可避免的要去重新學習該模板引擎的模板語法,無謂增加了前端的學習成本。正如我們後端開發不想寫前端一樣,你想想如果你的後臺代碼裡嵌入前端代碼,你是什麼感受?因此,這種方式十分不妥。

III、JSP本身所導致的一些其他問題

比如,JSP第一次運行的時候比較緩慢,因為裡頭包含一個翻譯為Servlet的步驟。再比如因為同步加載的原因,在jsp中有很多內容的情況下,頁面響應會很慢。

半分離時期

前後端半分離,前端負責開發頁面,通過接口(Ajax)獲取數據,採用dom操作對頁面進行數據綁定,最終是由前端把頁面渲染出來。這也就是其他博客裡說的,Ajax與SPA應用(單頁應用)結合的方式。其結構圖如下

步驟如下:(1)瀏覽器請求,cdn返回html頁面(2)html中的js代碼以ajax方式請求後臺的restful接口(3)接口返回json數據,頁面解析json數據,通過dom操作渲染頁面ps:博主早期就是用jquery的ajax請求,然後這麼做的。為什麼說是半分離的?因為不是所有頁面都是單頁面應用,在多頁面應用的情況下,前端因為沒有掌握controller層,前端需要跟後端討論,我們這個頁面是要同步輸出呢,還是異步json渲染呢?因此,在這一階段,只能算半分離。這種方式的優缺點有哪些呢?首先,這種方式的優點是很明顯的。前端不會嵌入任何後臺代碼,前端專注於html、css、js的開發,不依賴於後端。自己還能夠模擬json數據來渲染頁面。發現bug,也能迅速定位出是誰的問題,不會出現互相推脫的現象。然而,在這種架構下,還是存在明顯的弊端的。最明顯的有如下幾點:(1)js存在大量冗餘,在業務複雜的情況下,頁面的渲染部分的代碼,非常複雜。(2)在json返回的數據比較大的情況下,渲染的十分緩慢,會出現頁面卡頓的情況(3)seo非常不方便,由於搜尋引擎的爬蟲無法爬下js異步渲染的數據,導致這樣的頁面,SEO會存在一定的問題。(4)資源消耗嚴重,在業務複雜的情況下,一個頁面可能要發起多次http請求才能將頁面渲染完畢。可能有人不服,覺得pc端建立多次http請求也沒啥。那你考慮過移動端麼,知道移動端建立一次http請求需要消耗多少資源麼?正是因為如上缺點,真正的前後端分離架構誕生了

分離時期

在這一時期,擴展了前端的範圍。認為controller層也屬於前端的一部分。在這一時期前端:負責View和Controller層。後端:只負責Model層,業務處理/數據等。可是前端不懂後臺代碼呀?controller層如何實現呢?這就是node.js的妙用了,node.js適合運用在高並發、I/O密集、少量業務邏輯的場景。最重要的一點是,前端不用再學一門其他的語言了,對前端來說,上手度大大提高。於是,這一時期架構圖如下

增加node.js作為中間層,具體有哪些好處呢?

(1)適配性提升

我們其實在開發過程中,經常會給pc端、mobile、app端各自研發一套前端。其實對於這三端來說,大部分端業務邏輯是一樣的。唯一區別就是交互展現邏輯不同。如果controller層在後端手裡,後端為了這些不同端頁面展示邏輯,自己維護這些controller,徒增和前端溝通端成本。如果增加了node.js層,此時架構圖如下

在該結構下,每種前端的界面展示邏輯由node層自己維護。如果產品經理中途想要改動界面什麼的,可以由前端自己專職維護,後端無需操心。前後端各司其職,後端專注自己的業務邏輯開發,前端專注產品效果開發。

(2)響應速度提升

我們有時候,會遇到後端返回給前端的數據太簡單了,前端需要對這些數據進行邏輯運算。那麼在數據量比較小的時候,對其做運算分組等操作,並無影響。但是當數據量大的時候,會有明顯的卡頓效果。這時候,node中間層其實可以將很多這樣的代碼放入node層處理、也可以替後端分擔一些簡單的邏輯、又可以用模板引擎自己掌握前臺的輸出。這樣做靈活度、響應度都大大提升。

(3)性能得到提升

大家應該都知道單一職責原則。從該角度來看,我們請求一個頁面,可能要響應很多看後端接口,請求變多了,自然速度就變慢了,這種現象在mobile端更加嚴重。採用node作為中間層,將頁面所需要的多個後端數據,直接在內網階段就拼裝好,再統一返回給前端,會得到更好的性能。

分離所帶來的缺點

在分析缺點之前,容博主先自責一下。博主拿著底層程式設計師的工資,想著架構師,甚至是部門leader該考慮的問題了。博主有罪!ok,說重點。先上結論,中小型軟體公司,慎用前後端分離架構!慎用!

(1)人員問題

大家自己留意一下宣傳這種架構的是什麼級別的公司,中小型公司一般沒有這樣的前端資源來支撐這樣的架構。如果強推這樣的分離架構會導致一個後果,後端被硬逼著去學vue.js,node.js這些,白白增加後端的負擔。最後處理不好,會出現一個後端紛紛離職的場面,

(2) 產品迭代周期問題

中小型軟體公司,一般需要一個比較快的軟體迭代周期。採用分離架構,增加了一個接口制定流程和前後端聯調流程。從本質上來說,放慢了迭代周期。

(3) 前端需要學習業務

本來前端只需要掌管視覺交互的部分。現在因為controller層也歸前端管了,前端必須對公司的業務流程有深入的了解,才能準確的寫出顯示邏輯。不過這樣會讓後端覺得,前端奪權,前端在混KPI。前端也必須要去學無聊的業務,不過正所謂有得必有失,前端因此也能夠站穩腳跟。或許正是因為前後端分離架構的出現,前端可以朝著架構師進軍吧。

結語

本文討論了前後端未分離、半分離、分離的架構、以及各自架構演進的原因。博主前端也只能算是半吊子水平吧。其實大家發現了麼,靠著前端進BAT,比靠後端進BAT難度小的多,博主也曾經動搖過,不過還是堅持在後端繼續深造。這篇文章只能算是博主的一點淺薄見解,可能博主在有些地方用詞不夠準確,希望大家指出。最後,送上一句暴露年齡的歌詞

抬頭望望天,月亮在笑。低頭看看地,浪花在跳。這個世界,我們多麼渺小。只要努力,就會心比天高 !

只要努力就好,不是嘛^_^!

---完,喜歡就關注我吧---

【推薦閱讀】

【原創】nginx配置https的部署實踐

相關焦點

  • 網際網路系統架構為什麼要做前後端分離呢?
    在現在的網際網路架構中,前後端分離已經是一個非常常見的系統架構方式了,但是我們將前後端分離以後,感覺項目的架構比傳統的分層架構更複雜了,需要的人力資源也更多了,甚至項目周期也變得更長了,既然看上去好處不大,為什麼還要做前後端分離呢?
  • 網際網路分層架構,為啥要前後端分離?
    團隊正在推進前後端分離,我覺得架構變得複雜了,項目研發周期變長了,但組長說,網際網路公司都在搞前後端分離,所以我們也要搞。我還是不理解,為什麼要進行前後端分離呀?前後端分離的分層抽象勢在必行。 另外要強調的是,是否需要前後端分離,和業務複雜性,業務發展階段,人員素質模型有關,千萬不可一概而論。要實施前後端分離,以下四點是必須要考慮的。第一點,SEO的考慮。
  • 為什麼前後端分離了,我們比從前更痛苦?咋整呢
    目錄為什麼前後端分離了,你比從前更痛苦?為什麼接口會頻繁變動?為什麼接口文檔永遠都是不對的?為什麼測試工作永遠只能臨近上線才能開始?怎麼破?為什麼前後端分離了,你比從前更痛苦?前後端分離早已經不是新聞,當真正分離之後確遇到了更多問題。要想解決現在的痛,就要知道痛的原因:為什麼接口會頻繁變動?設計之初沒有想好。
  • 怒吼(Noohle)科技|前後端分離有必要嗎?有什麼好處?
    在軟體及網際網路產品中,前後端分離已經成了一個必然的趨勢,今天將探討一下什麼是前後端分離及其好處。一、什麼是前端,後端前端:用通俗的話說,前端是運行在用戶端的,我們肉眼能看到的都是前端,比如:WINDOWS的桌面,瀏覽器打開的所有頁面等。
  • 講一講前後端分離技術
    前後端分離技術應該是未來的大勢所趨,在網站開發要求越來越高,就越來越需要精細化,需要分工明確,前端負責前端和前端的業務邏輯比如vue,後端負責後端的搭建和邏輯。前後端工程師需要約定交互接口,實現並行開發,開發結束後需要進行獨立部署,前端通過ajax來調用http請求調用後端的restful api。前端只需要關注頁面的樣式與動態數據的解析&渲染,而後端專注於具體業務邏輯。 在前後端分離的時代,前端工作人員主要負責什麼工作呢?
  • 架構師:「前後端分離還不會用,那也太out了」
    今天:公司的架構師說:項目要採用前後端分離來說,vue+golang ,各位先了解一下技術棧!不要說不會用哦,目前最流行了!確實,這幾年,angular、react、vue這些前端框架非常的火,用途之廣泛,有統一大前端之勢!web、APP、小程序、公眾號,沒有不能做的,一次開發,多端運行!
  • 架構師:「前後端分離還不會用,那也太out了」
    今天:公司的架構師說:項目要採用前後端分離來說,vue+golang ,各位先了解一下技術棧!不要說不會用哦,目前最流行了!確實,這幾年,angular、react、vue這些前端框架非常的火,用途之廣泛,有統一大前端之勢!
  • java程式設計師的訴苦:為什麼前後端分離之後,我更加痛苦了?
    相信很多web開發程序都聽過前後端分離,前後端分離已成為網際網路項目開發的業界標準使用方式,通過nginx+tomcat的方式(也可以中間加一個nodejs)有效的進行解耦。一切都是那麼地美好,Java程式設計師終於不用又當爹又當媽,又搞前端,又搞後端,有餘力把精力放在Java基礎,設計模式,jvm原理,spring+springmvc原理及源碼,linux,mysql事務隔離與鎖機制,mongodb,http/tcp,多線程,分布式架構……然而事實卻不盡人意,前後端分離之後,作為java開發的我反而更加痛苦了。
  • 七個開源的 Spring Boot 前後端分離項目
    本文原載於 SegmentFault 社區作者:江南一點雨前後端分離已經在慢慢走進各公司的技術棧,根據松哥了解到的消息,不少公司都已經切換到這個技術棧上面了。即使貴司目前沒有切換到這個技術棧上面,松哥也非常建議大家學習一下前後端分離開發,以免在公司幹了兩三年,SSH 框架用的滾瓜爛熟,出來卻發現自己依然沒有任何優勢!
  • 前後端分離的演變史,了解一下
    為了讓 View 更純粹,還可以使用 Thymeleaf、Freemarker 等模板引擎,使模板裡無法寫入Java代碼,讓前後端分工更加清晰。好處是 UI 相關的代碼都是前端去寫就好,後端不用太關注,不足就是前端開發重度綁定後端環境,環境成為影響前端開發效率的重要因素。前後端職責糾纏不清模板引擎功能強大,依舊可以通過拿到的上下文變量來實現各種業務邏輯。這樣,只要前端弱勢一點,往往就會被後端要求在模板層寫出不少業務代碼。
  • 經驗解析小型開發團隊也必須轉型前後端分離
    本文內容是以全棧式後端開發團隊轉型前後端分離開發團隊為主題,從實際問題、工作流程、成員編制、成本控制等為出發點,做一個總結分析,拋磚引玉一起討論學習,也希望可以幫助更多的朋友解決問題。一、開發團隊角色小組型技術團隊中,不論是全棧式後端開發團隊還是前後端分離開發團隊,開發角色基本都包含 後端開發、APP開發、web前端。1.
  • SpringSecurity完成前後端分離,JSON進行交互
    (4)不過話說回來,如果你的前後端分離只是網頁+服務端,其實沒必要上無狀態登錄,基於 session 來做就可以了,省事又方便。二、登錄交互1, 前後端分離的數據交互給前端,前端收到之後,該跳轉該展示,由前端自己決定,就和後端沒有關係了。
  • 基於的.NET Core+Vue.js開源前後端分離的CMS
    今天我將給大家介紹另外一個基於.NET Core + Vue.js開源的前後端分離的CMS框架LinCms,之所以要介紹這款CMS,主要是因為它的界面做工精美,並且使用了很多良好的設計理念,項目還集成了Swagger的增強版Knife4jUI,非常值得學習研究。
  • 前後端分離利器-MockJS簡介
    概要前後端分離對web開發以及不算是一件新鮮事了,在開發初期前後端可以先溝通並制定好數據的交互接口,而前後端可以憑藉著制定好的數據接口實現兩者的並行開發。我們可以通過使用MockJS模擬後端數據接口返回數據實現並行開發。
  • VHR - 前後端分離的人力資源管理系統
    VHR(微人事),是一個採用了 SpringBoot + Vue 開發的前後端分離的人力資源管理系統,可以作為人事系統,乃至於後臺系統開發的優秀例子。VHR 所涉及的技術十分豐富,在後端,採取 Spring Boot 為主框架,Spring Security 實現用戶驗證和權限管理,MyBatis 操作資料庫,MySQL 作為關係資料庫,Redis作為緩存後端,RabbitMQ 作為消息隊列,Spring Cache 管理緩存,WebSocket
  • SpringBoot+VUE 前後端分離部署(二)
    ---創建前端VUE交互項目 創建vue項目前,需配置好vue的開發環境nodejs。此處不做環境配置的步驟,以後有需求再處理。這個是我配置好的環境。二、對接後臺服務 後臺服務參考《SpringBoot+VUE 前後端分離部署(一)》,地址是:https://www.toutiao.com/i6863272833775043086/2.1使用工具打開dntn項目,我本人使用的是idea工具,你也可以使用其他的。
  • java前後端分離框架,SpringCloud開發微服務平臺
    JNPF.java版本採用全新的前後端分離架構模式。前後端分離已成為網際網路項目開發的業界標準開發方式,通過 nginx+tomcat 等方式有效的進行解耦合,並且前後端分離會為以後的大型分布式架構、彈性計算架構、微服務架構、多端化服務打下堅實的基礎。
  • 學習SpringBoot前後端分離技術看這個開源項目就夠了
    今天,小編給大家推薦一款用來練手的時下比較火熱的公眾號小程序商城開源項目,學習SpringBoot前後端分離技術看這個開源項目就足夠了。我們在其開源項目目錄中發現有個接口文檔的文件夾,前臺接口文檔,後臺接口文檔齊全,這可是對開發人員非常的友好,參考其接口文檔數據,可有助於我們快速了解其項目架構及資料庫架構設計,學習其中的精髓,以及學習如何利用Spring Boot結合vue.js進行前後端分離開發。
  • SpringBoot+VUE 前後端分離部署(一)
    ----使用idea創建SpringBoot後端項目一、使用idea工具創建SpringBoot項目,開發後端接口服務。(項目前後端分離時,前端請求後端服務接口存在跨域問題,需要添加配置進行處理)七、修改配置文件
  • 前後端分離的開發背景下Java程式設計師應該掌握哪些知識
    首先,當前的網際網路項目確實在採用前後端分離的開發方式,但是前端開發後端化也是一個發展趨勢,目前資源接口的開發方式正在逐漸取代傳統的前後端開發方式。在部署方式上,採用雙伺服器集群的方式,或者是分布式集群的方式,前端伺服器和後端伺服器分別部署前後端程序,這樣做的好處自然是響應速度更快,用戶體驗更好。雖然採用前後端伺服器分別部署程序是目前大型網際網路產品的主流部署方案,但是這種部署方式在當前以數據為驅動的運營背景下,自然缺點就比較明顯了。