Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[arch] 整洁架构-COLA #3

Open
Alice52 opened this issue Sep 21, 2023 · 3 comments
Open

[arch] 整洁架构-COLA #3

Alice52 opened this issue Sep 21, 2023 · 3 comments

Comments

@Alice52
Copy link

Alice52 commented Sep 21, 2023

  • client: 独立(只需要依赖组件)
  • domain: 独立
  • infrastructure: 实现domain(可以使用 client)
  • app: 实现client | 依赖 infrastructure->domain
  • adapter: 使用 app -> app

269594562-c8cfcb86-df64-4d33-b26d-2065b2ac411e

269593571-4fadbbea-80c9-44e8-9344-879b0e9475e7

@Alice52
Copy link
Author

Alice52 commented Sep 22, 2023

COLA架构: 框架(提升应用质量)

层次 包名 功能 extra 必选
Adapter 层(VO/DTO) openapi 封装 http, rpc 接口
controller 处理 http 请求 浏览器
scheduler 处理定时任务 定时任务
consumer 处理外部 message 消息
App 层(DTO) executor 处理 request, 包括 command 和 query
service 与 domain 交互负责编排任务
Domain 层(Entity) gateway 领域网关, 解耦利器 粗略的理解成一种SPI
model 领域模型
ability 领域能力, DomainManager 领域对外暴露的服务能力
Infra 层(DO) gatewayimpl 网关实现
mapper ibatis 数据库映射
config 配置信息
Driven adapter db 数据库
search 搜索引擎
rpc 外部接口
Client SDK api 服务对外透出的 API
dto 服务对外的 DTO

COLA组件: 框架功能(可复用组件 + 提升研发效率)

组件名称 功能 依赖
cola-component-catchlog-starter 异常处理和日志组件 exception、dto 组件
cola-component-domain-starter Spring 托管的领域实体组件
cola-component-dto 定义了 DTO 格式, 包括分页
cola-component-exception 定义了异常格式, 主要有 BizException 和 SysException
cola-component-extension-starter 扩展点组件
cola-component-statemachine 状态机组件
cola-component-test-container 测试容器组件

@Alice52
Copy link
Author

Alice52 commented Sep 25, 2023

相关细节

  1. 包的划分: 综合考虑功能和领域两个维度包结构定义
    image

    image

  2. 防腐层: Anti-Corruption

    • ddd的概念: 应用不要直接依赖外域的信息,要把外域的信息转换成自己领域上下文(Context)的实体再去使用,从而实现本域和外部依赖的解耦

    • 在 COLA 中将数据库等都泛化为外部依赖, 利用依赖倒置(变成了不直接依赖数据库等-依赖数据库的抽象), 统一使用gateway来实现业务领域和外部依赖的解耦: Domain层定义Gateway + Infrastructure提供实现

      image
      image

      • pros: 降低了对外域信息依赖的耦合
      • pros: 是通过上下文映射, 确保本领域边界上下文下领域知识的完整性,实现了统一语言

@Alice52
Copy link
Author

Alice52 commented Sep 25, 2023

client - app - adaptor

  1. client 定义接口(类似与openapi定义|类似于app实现的接口)
    interface CustomerServiceI {
      listByName();
    }
  2. app实现接口
    @Service
    public class CustomerServiceImpl implements CustomerServiceI {
        @Resource private CustomerListByNameQryExe customerListByNameQryExe;
        @Override
        public MultiResponse<CustomerDTO> listByName(CustomerListByNameQry customerListByNameQry) {
            return customerListByNameQryExe.execute(customerListByNameQry);
        }
    }
  3. adaptor 调用 client 接口提供controller/openapi等服务
    @RestController
    public class CustomerController {
        @Autowired private CustomerServiceI customerService;
        @GetMapping(value = "/customer")
        public MultiResponse<CustomerDTO> listCustomerByName(@RequestParam(required = false) String name){
            CustomerListByNameQry customerListByNameQry = new CustomerListByNameQry();
            customerListByNameQry.setName(name);
            return customerService.listByName(customerListByNameQry);
        }
    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant