用过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循环!",这句话对我就触动挺深,作软件到底是为了水平的提升,仍是真正的实现需求?