头图

COLA实践代码

# 下载代码
git clone https://gitee.com/XuXiaoCong/cola-springboot-demo.git

# 进入目录
cd cola-springboot-demo

# 下载依赖
mvn clean package

# 启动,使用Java17
java -jar start/target/start.jar

COLA模块结构

  • 模块结构图

module.png

模块层级作用对比三层架构
(Controller、Service、Dao)
adapter适配层一般放MVC的控制器,或其他路由和适配Controller
client接口层服务接口相当于IService接口
app应用层client层的接口实现,业务代码相当于ServiceImpl
domain领域层实体对象,充血模型,用面相对象设计
infrastructure基础设施层全局设置、数据库操作、远程调用、转换器等持久化层(DAO),Mapper、数据对象
start应用入口Application.java,application.yml

功能

  • 每个模块下包含几项主要功能

package.png

目录结构划分

  • 先按照领域划分,如Order、Item、Stock
  • 再功能划分,如model、ability、gateway
  • 有一部分不需要用领域划分(个人理解)

    • Adapter层,因为这个层一般放控制器,控制器本身就聚合了多个接口,没必要再划分领域
    • Infrastructure层的config,因为配置一般都是全局配置,不使用用领域划分

folder-1.png

folder-2.png

模块介绍

start

  • 启动入口
  • 主要做项目设置,启用SpringBoot的功能
  • start/pom.xml

    • 增加打包插件,打包之后重命名为"start.jar"(默认为"start-版本号.jar")
    <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

adapter

  • 适配层,一般放MVC的控制器
  • 控制器本身就聚合了多个接口,没必要再划分领域
包名功能备注命名
web处理页面请求的ControllerMvc的控制器xxController
wireless/mobile无线端/手机端的适配很少不使用
wapwap端的适配很少不使用

client

  • 对外接口层,存放服务接口及入参出参
  • 单体应用中,该层略显鸡肋,实际作用是在微服务架构中
  • 本层先划分领域,再划分功能
包名功能备注命名
api服务接口interfacexxServiceI
dtoapi的入参、出参可引用"cola-component-dto"组件入参(读):xxQry,即Query
入参(写):xxCmd,即Command
出参:xxCO,即Customer Object

app

  • App层主要放业务代码,或称为胶水代码
  • 本层先划分领域,再划分功能
包名功能备注命名
executor执行器,业务代码根据读写数据分为Query和Command。Query可直接调用infrastructure的Mapper,Command一般不直接调用Mapper,而是使用Gateway操作读数据类名:xxQryExe
写数据类名:xxCmdExe,作者习惯写成xxExe
同步方法:execute(xx)
异步方法:asyncExecute(xx)
consumer消费者消息队列消费者xxConsumer
scheduler定时任务-xxScheduler

domain

  • 领域层,核心业务
  • 注意模型使用充血模型,使用面向对象写领域模型
  • 本层先划分领域,再划分功能
包名功能备注命名
model领域对象,里面放充血模型单一对象的操作放在领域对象中
如:用户改名、改密码
-
ability领域能力,包括DomainService多个对象间的操作
如:两个账户间的转账
xxDomainService
gateway网关接口,解耦利器解耦底层数据xxGateway

infrastructure

  • 基础建设层
  • 本层大部分需要先划分领域,再划分功能
  • config一般是全局配置,不需要划分领域
包名功能备注命名
config全局设置全局异常、环境变量参数、@Configuration注解的配置等-
mapper数据库CRUD封装如mybatis实现的数据库操作xxMapper
mapper.dataobject数据对象数据库对象,使用贫血模型(POJO)关系型:xxDO,即DataObject
Mongo:xxDoc,即Document
gatewayimpl网关实现调用mapper实现数据交互
RPC/Http对接其他系统Api,实现数据交互
xxGatewayImpl
convertor转换器数据对象(DO)、领域对象(Entity)、用户对象(CO)、数据转换对象(DTO)等各种"O"之间的转换
使用"Convertor"结尾
xxConvertor

参考文章


言午日尧耳总
1 声望5 粉丝

不秃顶、不猝死,顺顺利利活到100可以吗?