# kendoDDD
微服务的强大之处在于清晰地定义了它们的职责并划定了它们之间的边界。它的目的是在边界内建立高内聚,在边界外建立低耦合。也就是说,倾向于一起改变的事物应该放在一起。正如现实生活中的许多问题一样,但这说起来容易做起来难,业务在不断发展,设想也随之改变。因此,重构能力是设计系统时考虑的另一项关键问题。
那应该怎么将一个大的系统合理有效的拆分成微服务呢?你需要了解领域驱动设计(DDD)。领域驱动设计因 Eric Evans 的著作而出名,它是一组思想、原则和模式,可以帮助我们基于业务领域的底层模型设计软件系统。开发人员和领域专家一起使用统一的通用语言创建业务模型。然后将这些模型绑定到有意义的系统上,在这些系统和处理这些服务的团队之间建立协作协议。更重要的是,它们设计了系统之间的概念轮廓或边界也就是上下文。微服务设计从这些概念中汲取了灵感,因为所有这些原理都有助于构建可以独立变更和发展的模块化系统。
但是DDD也仍然是一个很大的很宽泛的方法论,需要了解的东西很多。本文尝试直接从代码分层入手,简单的入门一下。
## 一、分层说明
分层架构有一个重要的原则:每层只能与位于其下方的层发生耦合。详细说来又可以分为:严格分层架构,某层只能与直接位于其下方的层发生耦合;松散分层架构,则允许任意上方层与任意下方层发生耦合。严格分层,自然是最理想化的,但这样肯定会导致大量繁琐的适配代码出现,故在严格与松散之间,追寻和把握恰达好处的均衡。
![DDD经典分层](./asset/01.png)
如上图,这是经典的DDD分层方式。由于领域驱动包含的概念实在太多了,不论是聚合根、领域对象、领域服务、领域事件、仓储、贫血充血模型、界限上下文、通用语言,任何一个深入起来都又太多内容了,所以一开始换一个角度,从MVC/MVP/MVVM的分层架构入手,类比理解DDD经典的四层。然后融合自己已有的编码习惯和认知,按照各层的主要功能定位,可以写的代码范围约束,慢慢再结合理解DDD的概念完善代码编写。
1.presentation 表层。负责向用户显示信息和解释用户指令。这里的用户不一定是使用GUI的人,也可以是另一个系统。 该层系统的出入口主要的功用逻辑也尽量的简单,主要承接不同“表现”形式采集到的指令/出入参等,并进行转发给应用层。该层的核心价值在于多样化,而不在于功能有多强大。表现形式可以是 ①命令行②gRPC③HTTP(Gin)④HTTP(Beego)等,不涉及到具体的业务逻辑,彼此之间有了很好的替代。
2.application 应用层。定义软件要完成的任务,并且指挥表达领域概念的对象来解决问题。应用层要尽量简单,不包含业务规则,只为下一层中的领域对象协调任务,分配工作。 我的理解应用层是很薄的一层,只作为计算机领域到业务领域的过渡层。比如计算机能够识别和传输的肯定是2进制字节流,这一层可以充当翻译,把这些晦涩难懂的机器“语言”,转化为领域业务人员建模出来的语言。或者说是高级计算机编程语言,这里一般会有专门的xxxxVM来承接所需的出参、入参数据。这一层直接消费领域层,并且开始记录一些系统型功能,比如运行日志、事件溯源。
这一层的也应该尽可能的业务无关,以公用代码逻辑为主。
3.domain领域层。负责表达业务概念,业务状态信息以及业务规则。尽管保存业务状态的技术细节由基础设施层提供,但反应业务情况的状态是由本层控制并使用的。 领域驱动设计里最核心的部分了,可以细拆分为聚合根、实体,领域服务等一大堆其他概念。这里不展开详细说明了,简单的理解下 聚合根,负责整个聚合业务的所有功能就行了。比如项目中的fileAggregate,该类直接负责与平台系统管理员相关的所有操作业务,对内依赖调用领域服务、其他实体,或封装一些不对外的方法、函数等,完成所有所需的功能,由聚合根对外统一提供方法。可以把之前MVP里面的Presenter的主要代码需要完成的功能转移过来,再按照领贫血模型来分离出领域服务+实体+值对象等。
4.infrastructure基础设施层。为上面各层提供通用的技术能力:为应用层传递消息,为领域层提供持久化机制,为表现层绘制屏幕组件,等等。 这一层也是讲求和业务逻辑无关,只重点提供通用的功能。未来最主要需要编码的部分是仓储功能,和数据库打交道的这部分逻辑了,其他的基本都是基础功能或帮助类,变更的概率不大。
仓储层标准实践,也尽可能的做到与具体业务无关,单纯的(增删改查)数据库持久化等功能。
## 二、业务实践
以最简单的文件管理业务为例,实现两个接口:1.添加文件,2.获取文件。
1.presentation 表现层。主要和不同的Web框架有一定的耦合,不同的框架代码不全一样。但核心功能是相同的,就是进行HTTP请求和应用层的视图模型的双向转换,并且处理HTTP的状态等。
```golang
//获取到文件的基本信息,和保存路径,并返回给请求方
func GetFile(c *gin.Context) {
rst, has, err := application.GetFileById(c.Param("id"))
if err != nil {
c.Error(err)
return
}
if !has {
c.AbortWithStatus(http.StatusNotFound)
return
}
c.Header("Content-Disposition", fmt.Sprintf("attachment; filename=%s", rst.FileName))
c.Header("Content-Type", rst.ContentType)
c.File(rst.FilePath)
}
//新增文件,通过web框架将HTTP请求转换为应用层的视图模型
func AddFile(c *gin.Context) {
var parm application.AddFileForm
if err := c.ShouldBind(&parm); err != nil {
c.AbortWithError(http.StatusBadRequest, err).SetType(gin.ErrorTypeBind)
return
}
if parm.UpFile == nil {
c.Error(errorext.NewCodeError(101, "文件无效", nil))
return
}
fileId, err := application.AddFile(parm)
if err != nil {
c.Error(err)
return
}
c.JSON(http.StatusOK, fileId)
}
```
2.application应用层。通用的日志、打点等。通过直接持有领域层的聚合根,仓储层等直接进行业务表达。并将不常变化的领域模型,转换为可能经常变化的视图模型。
```go
//从数据库获取文件的基本信息,不涉及到
func GetFileById(id string) (file FileInfo, has bool, err error) {
obj, has, err := infrastructure.RepoFac.FilesRepo.GetById(id)
if err != nil {
logs.Error("FilesRepo GetById ERR:%v", err)
return
}
if !has {
return
}
file.ContentType = obj.ContentType
file.FileName = obj.FileName
file.FilePath = obj.FilePath
file.Size = obj.Size
return
}
func AddFile(parm AddFileForm) (fileId string, err error) {
fileInfo := files.FileInfos{}
f, err := parm.UpFile.Open()
if err != nil {
return
}
defer f.Close()
fileInfo.FileBody, err = ioutil.ReadAll(f)
if err != nil {
return
}
fileInfo.ContentType = parm.UpFile.Header.Get("Content-Type")
fil
没有合适的资源?快使用搜索试试~ 我知道了~
基于Golang的DDD实践源码+项目说明文件.zip
共114个文件
go:73个
sample:13个
head:4个
需积分: 5 0 下载量 133 浏览量
2024-08-24
21:39:59
上传
评论
收藏 4.69MB ZIP 举报
温馨提示
微服务的强大之处在于清晰地定义了它们的职责并划定了它们之间的边界。它的目的是在边界内建立高内聚,在边界外建立低耦合。也就是说,倾向于一起改变的事物应该放在一起。正如现实生活中的许多问题一样,但这说起来容易做起来难,业务在不断发展,设想也随之改变。因此,重构能力是设计系统时考虑的另一项关键问题。 那应该怎么将一个大的系统合理有效的拆分成微服务呢?你需要了解领域驱动设计(DDD)。领域驱动设计因 Eric Evans 的著作而出名,它是一组思想、原则和模式,可以帮助我们基于业务领域的底层模型设计软件系统。开发人员和领域专家一起使用统一的通用语言创建业务模型。然后将这些模型绑定到有意义的系统上,在这些系统和处理这些服务的团队之间建立协作协议。更重要的是,它们设计了系统之间的概念轮廓或边界也就是上下文。微服务设计从这些概念中汲取了灵感,因为所有这些原理都有助于构建可以独立变更和发展的模块化系统。 但是DDD也仍然是一个很大的很宽泛的方法论,需要了解的东西很多。本文尝试直接从代码分层入手,简单的入门一下。
资源推荐
资源详情
资源评论
收起资源包目录
基于Golang的DDD实践源码+项目说明文件.zip (114个子文件)
config 309B
description 73B
Dockerfile 298B
my.drawio 0B
exclude 240B
.gitattributes 24B
.gitignore 76B
helm_client.go 7KB
error_convter.go 4KB
redis_driver.go 3KB
pre_common_gin.go 3KB
ctrip_svc.go 3KB
slice_helper.go 2KB
aggregate_root.go 2KB
file_helper.go 2KB
app_common.go 2KB
aggregate_root.go 2KB
encrypt.go 2KB
times_helper.go 2KB
aggregate_root.go 2KB
files_app.go 2KB
struct_help.go 2KB
errors.go 2KB
bus.go 2KB
logs.go 2KB
env_helper.go 2KB
router.go 2KB
common.go 1KB
ip_agent.go 1KB
common.go 1KB
aggregate_root.go 1KB
common.go 1KB
errors.go 1KB
gowork.go 1KB
file_repo.go 1KB
event_handler.go 1KB
file_repo.go 1019B
smtp.go 1013B
files.go 982B
kendobus.go 955B
file_entity.go 848B
event_handler.go 771B
common.go 767B
commands.go 764B
commands.go 763B
commands.go 759B
common.go 754B
commands.go 752B
code_err.go 739B
startup.go 730B
common.go 650B
captcha_repo.go 637B
gincors.go 594B
chs_mng.go 565B
i_trip.go 563B
common.go 531B
repoFac.go 529B
files_vm.go 528B
main.go 522B
codes.go 508B
events.go 439B
startup.go 415B
rand_str.go 395B
helm_entity.go 392B
pod_entity.go 378B
common.go 376B
pods_app.go 369B
events.go 359B
get_local_ip.go 329B
pod.go 294B
commonVM.go 249B
domain_common.go 233B
redis_repos.go 204B
value_objs.go 139B
pods_vm.go 122B
grpc_common.go 21B
core_events.go 21B
core_common.go 21B
core_vo.go 21B
pre_common_gRPC.go 13B
grpcInterceptor.goo 3KB
gprc.goo 1KB
HEAD 183B
HEAD 183B
HEAD 32B
HEAD 23B
pack-65a25d306ae7a55cef8db3b0a25b99a7d3db5cbd.idx 10KB
index 9KB
launch.json 581B
settings.json 34B
master 183B
master 41B
README.md 19KB
go.mod 1KB
pack-65a25d306ae7a55cef8db3b0a25b99a7d3db5cbd.pack 4.36MB
packed-refs 114B
02.png 129KB
01.png 118KB
pre-rebase.sample 5KB
fsmonitor-watchman.sample 5KB
共 114 条
- 1
- 2
资源评论
生活家小毛.
- 粉丝: 6035
- 资源: 7291
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功