Skip to content

jarvanstack/ddd_demo

Repository files navigation

ddd-demo

基于 ddd 的设计思想, 核心领域需要由纯内存对象+基础设施的抽象的接口组成

  • 独立于外部框架: 比如 web 框架可以是 gin, 也可以是 beego
  • 独立于客户端: 比如客户端可以是 web, 可以是移动端, 也可以是其他服务 rpc 调用
  • 独立于基础组件: 比如数据库可以是 MySQL, 可以是 MongoDB, 甚至是本地文件
  • 独立于第三方库: 比如加密库可以是 bcrypt, 也可以是其他加密库, 不会应为第三方库的变更而大幅影响到核心领域
  • 可测性: 核心领域的 domain 是纯内存对象, 依赖的基础设施的接口是抽象的, 可以 mock 掉, 便于测试

怎么实现呢? 下面我根据一个案例来一步步展示通过 DDD 重构三层架构的过程

这里是该项目对应的文章: https://www.yuque.com/dengjiawen8955/dsne7d/un2h14o05e8nsbur?# 《DDD系列 实战一 应用设计案例 (golang)》

快速运行案例

依赖的环境

  • golang
  • docker
  • protobuf
# 下载项目 git clone git@github.com:dengjiawen8955/ddd_demo.git && cd ddd_demo # 准备环境 (启动mysql, redis) docker-compose up -d # 准备数据库 (创建数据库, 创建表) make exec.sql # 启动项目 make

核心目录结构

├── internal │ ├── bill // 账单业务 │ │ ├── app.go // 账单 application 层 │ │ ├── model │ │ │ ├── bill_entity.go // 账单 domain 实体 │ │ │ └── bill_po.go // 账单持久化对象 │ │ └── repo.go // 账单 repository 层 │ ├── common // 公共模块 │ │ ├── logs // 日志 │ │ │ ├── interface.go │ │ │ └── logger.go │ │ └── signals // 信号处理 │ │ └── signal.go │ ├── servers // 服务 │ │ ├── apps.go // 整合需要的 app │ │ ├── repos.go // 整合需要的 repo │ │ ├── rpc // rpc 服务 │ │ │ ├── proto_file // proto 文件 │ │ │ ├── protos // 生成的 proto 代码 │ │ │ ├── rpc_router.go // rpc 路由 │ │ │ └── rpc_server.go // rpc 服务 │ │ ├── servers.go // 整合需要的服务 │ │ └── web // web 服务 │ │ ├── response // web 响应封装 │ │ ├── web_router.go // web 路由 │ │ └── web_server.go // web 服务 │ └── user // 用户业务 │ ├── app.go // 用户 application 层 │ ├── auth_repo.go // 用户鉴权 repository 层 │ ├── model │ │ ├── auth_entity.go // 用户鉴权 domain 实体 │ │ ├── user_dto.go // 用户 dto (data transfer object), 比如 HTTP 请求的参数 │ │ ├── user_entity.go // 用户 domain 实体 │ │ └── user_po.go // 用户持久化对象 │ ├── rate_service.go // 汇率服务 │ ├── repo.go // 用户 repository 层 │ ├── rpc_server.go // 用户 rpc 服务 │ ├── transfer_service.go // 转账服务 │ ├── web_auth_middleware.go // web 鉴权中间件 │ └── web_handler.go // 用户 web 服务

架构模型如下图所示:

架构图

About

Domain Driven Design demo for golang

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published