看到网上许多人关于项目划分模块的文章,有按照层次划分的,有按照业务逻辑划分完又按照层次再划分一遍的,比如这样:
根项目:
commons: #所有模块公用的类,如验证工具、RPC接口、dto等
业务线1:
业务1-dao: #dao层
业务1-service: #service层的实现,混杂了业务逻辑
业务1-web: #web层
不管你觉得这么做合不合理,反正我觉得这非常不合理,完全就是脱裤子放屁,白白地增加了项目的复杂度,理由如下:
- 如果我们的项目不涉及到远程调用,那直接分成一个模块,然后按层分包就完事了;
- 如果我们项目过大,那按照业务模块划分,然后把其他模块需要RPC的实体dto以及接口分离出一个模块就ok了,这种连dao和service(impl)都要分出去的做法我是看不懂(分布式项目把dao和service impl给别人?想啥呢小老弟)。
那么,理想中的模块划分应该是什么样呢,看看下面:
根项目:
commons:
common-utils: #所有项目使用的工具类,如参数校验等
web-utils: #所有web项目使用到的公共工具,如自定义切面
middleware: #项目使用到的中间件,如注册中心、配置中心、监控中心等
config-center:
register-center:
monitor-center:
#...
业务线1:
业务1-core: #包含实体、枚举、dto的定义、供远程调用的接口等可以开放给其他模块使用的东西
业务1-web: #包含dao层、service层(impl)、manager、controller层,等本业务私有的逻辑
业务2,3,...:
single-sign-on: # 单点登录
sso-core: # 关于鉴权的公开的实体、dto
sso-client: # starter,提供用户认证的切面、工具等,供其他模块直接使用
sso-web: # 处理用户认证、鉴权、令牌签发
third-party: #对需要对接的第三方接口封装,封装成stater或SPI,项目中的其他模块使用时可以做到开箱即用
baidu-aip-starter:
wechat-oauth-starter:
qq-oauth-starter:
ding-talk-starter:
#...
# 另外,所有core模块不得有对javax以及common-utils之外的依赖
# web模块不可依赖其他业务线的web模块
当然,你也可以根据自己的业务需求来划分模块,我这里只是提供了一个思路,就一个原则:单个业务能不拆模块就不拆,拆除去的都必须是其他模块要使用的。