提及应用分层,大部分人都会认为这个不是很简单嘛 就controller,service, mapper三层。看起来简单,不少人其实并无把他们职责划分开,在不少代码中,controller作的逻辑比service还多,service每每当成透传了,这实际上是不少人开发代码都没有注意到的地方,反正功能也能用,至于放哪无所谓呗。这样每每形成后面代码没法复用,层级关系混乱,对后续代码的维护很是麻烦。java
的确在这些人眼中分层只是一个形式,前辈们的代码这么写的,其余项目代码这么写的,那么我也这么跟着写。可是在真正的团队开发中每一个人的习惯都不一样,写出来的代码必然带着本身的标签,有的人习惯controller写大量的业务逻辑,有的人习惯在service中之间调用远程服务,这样就致使了每一个人的开发代码风格彻底不一样,后续其余人修改的时候,一看,我靠这我的写的代码和我日常的习惯彻底不一样,修改的时候究竟是按着本身之前的习惯改,仍是跟着前辈们走,这又是个艰难的选择,选择一旦有误差,你的后辈又维护你的代码的时候,恐怕就要骂人了。数据库
因此一个好的应用分层须要具有如下几点:缓存
在阿里的编码规范中约束的分层以下:安全
开放接口层:可直接封装 Service 方法暴露成 RPC 接口;经过 Web 封装成 http 接口;进行 网关安全控制、流量控制等。app
终端显示层:各个端的模板渲染并执行显示的层。当前主要是 velocity 渲染,JS 渲染, JSP 渲染,移动端展现等。框架
Web 层:主要是对访问控制进行转发,各种基本参数校验,或者不复用的业务简单处理等。优化
Service 层:相对具体的业务逻辑服务层。编码
Manager 层:通用业务处理层,它有以下特征:1. 对第三方平台封装的层,预处理返回结果及转化异常信息;2. 对Service层通用能力的下沉,如缓存方案、中间件通用处理;3. 与DAO层交互,对多个DAO的组合复用。代码规范
DAO 层:数据访问层,与底层 MySQL、Oracle、Hbase 进行数据交互。中间件
阿里巴巴规约中的分层比较清晰简单明了,可是描述得仍是过于简单了,以及service层和manager层有不少同窗仍是有点分不清楚之间的关系,就致使了不少项目中根本没有Manager层的存在。下面介绍一下具体业务中应该如何实现分层
从咱们的业务开发中总结了一个较为的理想模型,这里要先说明一下因为咱们的rpc框架选用的是thrift可能会比其余的一些rpc框架例如dubbo会多出一层,做用和controller层相似
1.最上层controller和TService是咱们阿里分层规范里面的第一层:轻业务逻辑,参数校验,异常兜底。一般这种接口能够轻易更换接口类型,因此业务逻辑必需要轻,甚至不作具体逻辑。
2.Service:业务层,复用性较低,这里推荐每个controller方法都得对应一个service,不要把业务编排放在controller中去作,为何呢?若是咱们把业务编排放在controller层去作的话,若是之后咱们要接入thrift,咱们这里又须要把业务编排在作一次,这样会致使咱们每接入一个入口层这个代码都得从新复制一份以下图所示:
这样大量的重复工做一定会致使咱们开发效率降低,因此咱们须要把业务编排逻辑都得放进service中去作:
3.Mannager:可复用逻辑层。这里的Mannager能够是单个服务的,好比咱们的cache,mq等等,固然也能够是复合的,当你须要调用多个Mannager的时候,这个能够合为一个Mannager,好比逻辑上的连表查询等。若是是httpMannager或rpcMannager须要在这一层作一些数据转换
4.DAO:数据库访问层。主要负责“操做数据库的某张表,映射到某个java对象”,dao应该只容许本身的Service访问,其余Service要访问个人数据必须经过对应的Service。
在阿里巴巴编码规约中列举了下面几个领域模型规约:
层次 | 领域模型 |
---|---|
Controller/TService | VO/DTO |
Service/Manager | AO/BO |
DAO | DO |
每个层基本都本身对应的领域模型,这样就致使了有些人过于追求每一层都是用本身的领域模型,这样就致使了一个对象可能会出现3次甚至4次转换在一次请求中,当返回的时候一样也会出现3-4次转换,这样有可能一次完整的请求-返回会出现不少次对象转换。若是在开发中真的按照这么来,恐怕就别写其余的了,一天就光写这个重复无用的逻辑算了吧。
因此咱们得采起一个折中的方案:
1.容许Service/Manager能够操做数据领域模型,对于这个层级来讲,原本本身作的工做也是作的是业务逻辑处理和数据组装。
2.Controller/TService层的领域模型不容许传入DAO层,这样就不符合职责划分了。
3.同理,不容许DAO层的数据传入到Controller/TService.
总的来讲业务分层对于代码规范是比较重要,决定着之后的代码是否可复用,是否职责清晰,边界清晰。
固然这种分层其实见仁见智, 团队中的全部人的分层习惯也不一样,因此很难权衡出一个标准的准则,总的来讲只要知足职责逻辑清晰,后续维护容易,就是好的分层。