没有顶层设计、模块划分的应用就像一团打结的毛线,代码分支可能会跳来跳来,没有边界。很难理清楚内部的业务逻辑,更糟糕的是随着需求的堆积,日积月累更难理清楚内部的模块划分,所以从一开始就应该定好系统的模块,确定好边界之后才知道每一部分往哪里放。

每次实现一个新需求内心都有一个层次树,大概会在哪个模块加什么东西,传统的MVC 模型在web 应用流行了很久,也很容易理解,下面我基于之前实现的一个系统做了些修剪和设计,形成了一个比较通用的分层架构。

如下图:后面分别讲解每一个模块的职责。

controller

控制器层大家应该都不陌生,写过web应用的都知道,这个是http 请求的入口,controller 负责接受web请求HttpRequest, 返回HttpResponse。

biz-service-api

业务服务层的接口定义,一般简单的应用不需要区分 biz-service 和 core-service,但是如果业务复杂度比较高,最佳实践是把service 拆二层,biz-service 负责业务逻辑,业务逻辑是繁杂多样的,随时会变,而那些具有通用性的基础能力、有时候也叫平台能力放到core-service 里面,比如很多业务都需要支付能力,支付的服务就可以作为平台能力放在core-service 提供给biz-service使用。biz-service 使用core-service的能力,在阿里内部系统,非常重视core-service,如果系统拆分成域来看,core-service 可以理解成中台,biz-service 是前台,大中台小前台战略除了在组织结构上,也可以在应用内体现,一般都是把中台能力做强,前台能力负责灵活、高效满足业务需求。

facade

门面接口,和设计模式里面的门面有点像,facade 模块只定义接口,具体实现放在biz-service-impl 模块。facade 一般是提供给外部系统的,打成jar 包,人家依赖你,只需要知道接口定义的出入参,具体实现他不需要关心。你的facade 服务发布成rpc provider,为上游提供服务。

其实有很多系统会把facade 层放在core-service 层下面,因为认为facade 提供的服务都是rpc 服务,一般只在内部发布,但是我觉得放在和controller 一层逻辑比较顺,也比较清晰,当然也是因为调用我controller 的也是内部系统,所以我一视同仁。

biz-service-impl

业务逻辑实现,实现facade 接口和 biz-service-api。

core-service-api

核心能力服务api定义。核心原子能力的定义,比如支付能力、模型运行能力、通用对象定位能力、安全。

core-domain

这里承载核心领域,最重要的模型都放在这个模块,有的架构设计这里除了模型,还会防model-service,但是我还是觉得模型更多是数据的概念,模型的操作应该是自包含的,也就是模型的操作只依赖自己的数据,可以直接在模型内部完成,如果需要多个模型参与的操作都应该交给core-service 来完成。算是DDD 领域驱动设计的折中,可理解性比规范有时候更重要,这方面的例子还很多,比如大型互联网公司的表设计就没有遵循数据库规范的范式,表join 都很少,单表冗余情况很多。

infrastructure

基础的比如数据库、缓存、消息队列、流程引擎、审批流、定时任务这种系统基础设施,还有第三方外部系统依赖都放在这一层。一般我的建议是每引入一个第三方服务或者组件,都定义service-api 和 serviceImpl,api做出通用性的,不依赖具体第三方的存在,这样比如接入了A 公司提供的流程引擎,发现不合适,不好用的时候api 这一层不用动,也不会影响到上层应用的服务,而且还可以非常好的支持SPI机制,方便切流到新服务提供者上去。

上面有的是按照层的概念说的,有的是按照模块来说的。这篇文章我自己觉得挺有价值的,工程上的一些最佳实践,希望对大家在做应用架构设计的时候有帮助。

如何做好应用架构分层和模块化?相关推荐

  1. GAMES104实录 | 引擎架构分层(下) part2

    本期为GAMES104<现代游戏引擎:从入门到实践>视频公开课文字实录第7期.本课程由GAMES(图形学与混合现实研讨会)发起,游戏引擎技术专家王希携手游戏引擎一线开发者共同研发. 课程共 ...

  2. MyBatis 架构分层与模块划分-基础支持层

    最后一个就是基础支持层.基础支持层主要是一些抽取出来的通用的功能(实现复用),用来支持核心处理层的功能.比如数据源.缓存.日志.xml 解析.反射.IO.事务等等这些功能. 这个就是MyBatis 的 ...

  3. 计算机基础课程在线教学授课方案,《计算机基础》课程分层次模块化教学实施方案...

    计算机基础课程是本科非计算机专业学生重要的基本素质教育.随着计算机技术的飞速发展,计算机的应用领域不断扩大,特别是中学信息技术课程教学的普及与发展,使大学新生计算机素质不断提高,对大学计算机基础教学提 ...

  4. .Net微服务实战之技术架构分层篇

    一拍即合 上一篇<.Net微服务实战之技术选型篇>,从技术选型角度讲解了微服务实施的中间件的选择与协作,工欲善其事,必先利其器,中间件的选择是作为微服务的基础与开始,也希望给一直想在.Ne ...

  5. asp.net core系列 71 Web架构分层指南

    一.概述 本章Web架构分层指南,参考了"Microsoft应用程序体系结构指南"(该书是在2009年出版的,当时出版是为了帮助开发人员和架构师更快速,更低风险地使用Microso ...

  6. 产品经理如何做好信息架构

    信息架构作为产品的骨架,是产品非常重要的一部分,它决定一个产品的生长方向,决定一个产品的布局以及用户对一个产品的初步印象和整体体验,所以做好信息架构,是每个产品经理必须掌握的一门技能,但是掌握这门技能 ...

  7. ThinkPHP6项目基操(9.架构分层)

    架构分层 一.分层意义 二.代码架构 三.common层设计 四.实践代码 一.分层意义 意义我觉得最重要的是方便维护,如果代码没有分层,都是写在控制器里,包括了各种参数校验,各种情景判断,各种数据查 ...

  8. 《沈剑架构师训练营》第8章 - 架构分层

    40.分层:互联网分层架构方法论 no40:互联网分层架构的的本质是什么? 这是一个「数据移动」,然后「被处理」,被「呈现」的过程 no40:数据移动过程中最重要的两点是什么? 1.数据传输的格式 2 ...

  9. 【Games104-现代游戏引擎0102】引擎架构分层个人笔记

    参考资料 <GAMES104-现代游戏引擎:从入门到实践>02.引擎架构分层(bilibili) <Game Engine Architecture>(Third Editio ...

  10. 高并发系统设计:通用的设计方法及架构分层

    1.通用设计方法 高并发系统通用的设计方法为拓展.缓存及异步. Scale-out(横向扩展):分而治之是一种常见的高并发系统设计方法,采用分布式部署的方式把流量分流开,让每个服务器都承担一部分并发和 ...

最新文章

  1. 把一个人的特点写具体作文_部编版五年级下册语文习作把一个人的特点写具体教案课件+范文...
  2. 第九周项目一-深体验复制(2)
  3. Tableau 必知必会之使用环境的配置需求
  4. delphi html table,delphi 使用webbrowser取得网页中表格(Table)内容的正确方法
  5. (2)通信中为什么要进行AMC?
  6. python第三周测试_python第三周小测
  7. mysql5.7乱码_mysql5.7中解决中文乱码的问题
  8. android tv字体,best登陆「永久地址0365.tv」android默认字体android使用代码使用新的字体的常用代码...
  9. emmc固件开发_UP2开发板简易开箱(二)
  10. 平流式初沉池贮砂斗计算_?初沉池、二沉池的作用与区别-亨孚科技
  11. mysql kingshard_浅谈 Kingshard MySQL 中间件
  12. clion 32位xp安装 64位软件
  13. Java工程师如何在Docker上进行开发
  14. 华为交换机做qos案例_华为技术:Qos典型配置,配置交换机接口限速示例
  15. shell编程规范与变量
  16. 微信会员卡管理系统会员充值说明
  17. python实现动态地图_使用Python、Geopandas和Matplotlib制作gif动态地图
  18. 二维彩虹和你一起看见更大的世界
  19. 笔记-动物病理(4:适应与修复+缺氧)
  20. selenium八大元素定位方法

热门文章

  1. win10扬声器没有声音但插入耳机有声音
  2. 计算机解八元一次方程,如何用matlab求解8元一次,含参数的方程组(共八个一次方程)...
  3. n维椭球体积公式_物质的量浓度公式如何应用
  4. 【SLAM】——编译项目orb-slam2_with_semantic_labelling
  5. 怎么用计算机打出音乐符号,音乐符号怎么打出来(所有)
  6. 2018最佳GAN论文回顾
  7. java opts tomcat,tomcat JAVA_OPTS配备
  8. Python3正则匹配re.split,re.serach,re.sub,re.finditer及re.findall函数用法详解
  9. C语言输出菱形(C笔记)
  10. 基于ssm+vue的综合项目 健康体检管理系统-第十章-权限控制、图形报表