用過MVC的童鞋都知道業務邏輯(Bussiness Logic),可是大多對這概念又是模棱兩可,業務邏輯歷來都是這樣難以理解,談論先後端分離以前這個概念很是有必要探討一下!html
在簡單的CRUD的系統中,基本上都是對數據進行增刪改查操做,並無多少業務邏輯可言;但像銀行系統對金融數據的操做就顯得不那麼簡單了,以轉帳爲例:A給B轉賬轉100元,簡易代碼以下:前端
if(A.balance - 100 >= 0){ A.balance -100; B.balance +100; }else{ //返回異常信息 }
這串代碼已經不只僅是對數據的增刪改查了,它包含了一些業務規則,好比A的餘額若是少於100,這個代碼會返回異常信息提示"餘額不足",相似於這種,一組和特定領域業務相關而又不可拆分的代碼,能夠看做業務邏輯的實現。因此轉帳是做爲一部個不可拆分的總體提供給用戶的,也就是說Business層是不可能給你提供一個"A.餘額+x"這種接口的,若是你想轉帳,請用轉帳方法,方法裏面怎麼對數據操做,你無需關心,你也無法關心。java
=====
這裏注意強調一下:頁面/渲染邏輯和業務邏輯的區別,頁面一般須要多個數據用來展現,好比網上銀行界面即顯示用戶名、餘額和轉帳記錄等,這些信息的組合稱做頁面/渲染/展現邏輯,並不等於業務邏輯,業務邏輯只應提供基本的業務數據而不該該和頁面邏輯摻和起來,就拿這個例子來說,頁面的這些數據,service層會提供三個接口來支持頁面數據的產出,但並不會給你拼到一塊給你,拼接不一樣的業務信息組合成一個View Object只能是脫離於service以外的層處理,在此特意分清頁面邏輯和業務邏輯的關係node
既然是談先後端分離,就必須,必須,必須先劃出先後端的定義,要否則談來談去,最後你們敢情不是說的一塊事。其實先後端的概念真是一人一個見解,有人以爲和瀏覽器相關的技術這幫就屬於前端,牽扯到了java代碼的就屬於後端;也有人以爲前段不只包括瀏覽器技術棧線,還包括後臺像jsp等模板技術相關技術也屬於前端,後端純粹是service那塊的技術。在這裏我說下個人見解。ajax
不一樣人對先後端的定義的不一樣是由於看待角度的不一樣,有人以工做職責分,有人以技術棧分;這裏我以爲應該以業務邏輯爲分割線去分!(明白爲啥我一上來先說業務邏輯了吧·—·)後端
爲何我會以業務邏輯去分割先後端的定義,這麼說吧,一個系統的展示形式可能會有不少種:Web、Web Service、桌面客戶端等,他們無一例外都是和用戶直接打交道的,像網上銀行的Web網頁、手機APP,他們採用不一樣的技術和交互實現了與系統的交互,而整個系統有一部分是不隨展示形式而變的——業務邏輯代碼,也就說轉帳這個業務不管是在Web仍是App中,對數據的操做邏輯是不變的,因此咱們很天然的就會造成一個分隔:瀏覽器
最基本的一部分是專一與實現業務邏輯代碼的實現,是不隨展示形式而改變的;另外一部分是用來給用戶展示的,可能隨着技術潮流改變而改變(說不定過一段時間就出VR版的網銀了,哈哈);我稱前者爲後端,後者爲前端。也就是說全部針對業務邏輯去實現的部分是後端,用來展示數據和用戶交互的部分屬於前端。session
=====
對應到傳統的MVC上來,service層就是後端,而service依賴dao層,dao層也屬於後端,而Controller既不屬於前端也不屬於後端,他只是做爲Server對外提供的一層HTTP訪問方式的接口,是後端的門口;而Browser的技術棧線全都屬於前端,這裏前端並僅不限於browser,任何用於實現特定顯示方式的部分都屬於前端:好比我爲了更好的將數據拼接成組合渲染邏輯對象,能夠再加一層nodejs做爲中間層,固然這也是劃爲前端。以下圖:框架
圖1
前後端分離
何爲先後端分離?先後端原本不就分離麼?這要從尷尬的jsp講起。分工精細化歷來都是蛋糕作大的原則,多個領域工程師最好在不須要接觸其餘領域知識的狀況下合做,纔可能使效率愈來愈高,維護也會變得簡單。jsp的模板技術融合了html和java代碼,使得傳統MVC開發中的先後端在這裏如膠似漆,前端作好頁面,後端轉成模板,發現問題再找前端,前端又看不懂java代碼...先後端分離的目的就是將這尷尬局面打破。
什麼是先後端分離?先後端分離說白了就是把前端和後端分紅兩個工程,由不一樣的團隊負責開發,這樣從工程和職責的角度上都有分開,這樣,後端偏向於提供單純的API接口,前端就是調用API接口進行展現和業務調用。
這樣不只將頁面渲染和業務邏輯從server剝離開來,將頁面渲染放給前端,甚至放給瀏覽器;將業務邏輯放給後臺專心搞業務,下降了他們之間的耦合性,並且從職責上進行了分明,更適合大項目和大團隊管理和開發。
我也提不出什麼解決方案,比較有名的屬淘寶UED的中途島項目,我談談我大概的實現方案。
首先Server端是RESTful風格的,簡單的只提供API的訪問接口;Browser端進行對HTML的展現,配合ajax異步請求和Angular、React等前端成熟框架進行頁面渲染;但browser本身勢單力薄,因此要多出一層處理數據的nodejs(不限死nodejs),用來處理頁面邏輯數據、session、渲染初始頁面等工做,因此大體的原理圖如圖1所示。
先後端分離可能並不適用於全部狀況。軟件開發嘛,都知道沒有最好,只有最合適,能用比較合適的手段去實現軟件的目標,也算功德圓滿了。
我記得咱們班裏有次活動,有兩個小夥子被挑出來作遊戲,每一個人原地轉10圈,再轉暈以後,面前有兩臺電腦,導師開口出題,要求一分鐘用java敲出一個菱形圖案,其中一個立刻大腦急速轉動,分析規律,屏幕上只見他熟練的for循環語句敲的飛快,雖然有些許卡住,可是就在他敲得起興的同時,另外一位採用system.out.print()的方式,快速的敲了個菱形圖案出來,不過被老師制止:"必須用for循環!",這句話對我就觸動挺深,作軟件到底是爲了水平的提升,仍是真正的實現需求?
以上也只是我的的一些心得和見解,有任何不妥和錯誤的地方歡迎指出。