清晰架构(Clean Architecture)的Go微服务—重大升级

去年,我建立了一个清晰架构(Clean Architecture)微服务框架,它功能强大,但有些重。我写了一个系列文章来说述它,请参阅"清晰架构(Clean Architecture)的Go微服务"。 我还指出了设计中存在的一些缺陷,并讲到但愿之后能修复它们。如今我终于有时间对它进行了改造,结果比我预期的还要好。git

我所作的改动不大,但效果惊人。主要的项目结构和接口没有变,我在那些文章中写的大部份内容仍然有效。此次升级修复了旧框架中的全部主要问题。如今它几乎拥有了我理想框架中的全部内容。它是一个轻量级的,但功能强大,而且仍是可插拔的。github

主要改进以下:架构

  • 自我进化的设计
  • 第三方库
  • 单独的事务管理库
  • 其它改动

自我进化的设计

这是全部改动中最突出的。旧的框架有点重,不适合轻量级的项目。升级后,它适合全部类型的项目。你能够改变项目框架自己,使它与你的项目时,你的项目变得更复杂时,你能够改变框架让它也变得复杂,但你不须要在修改任何业务代码。我写了一篇单独的文章来说述他,请参阅"一个能够自我进化的微服务框架"框架

第三方库

在个人旧框架中,一个很好的设计是日志接口。有了它,我能够切换到任何其余日志库,而不须要更改代码(我只须要更改配置文件)。惟一的缺点是它依赖于框架,不能独立使用。升级后,我将它从框架中剥离出来,变成了一个独立的第三方库,,这样它就能够单独使用。它的核心是为组件建立了通用接口,这样你就能够接入任何实现库,只要它们实现了通用接口。到目前为止,我建立了三个可接入的组件,“glogger” 用于日志,“gmessaging” 用于消息传递,“gtransaction” 用于事务管理。若是有须要,我会添加新的可接入组件。关于如何编写第三方库,请参阅"事件驱动的微服务-建立第三方库"函数

单独的事务管理库

旧的框架有一个事务管理系统。它是一个适合于清晰架构(Clean Architecture)的非侵入式架构。尽管它对业务逻辑没有侵入,但它对个人框架有侵入。另外,它还有一些问题,例如它打破了个人设计结构,我在文章"清晰架构(Clean Architecture)的Go微服务: 日志管理" 中有详细描述。微服务

在新的框架中,我对事务管理部分作了较大的修改。如今,大部分代码被移出到第三方库中。这样,在应用程序里只须要添加两行代码就可让一个函数支持事务。它不只对业务代码没有侵入,并且对框架也没有侵入。由于它是一个第三方库,因此能够在不使用框架的状况下调用。我写了一篇单独的文章来说述它, "一个非侵入的Go事务管理库——如何使用"工具

其它改动

另外我还作了一些修改,但它们都是小的改动。.net

容器接口

这是程序容器(Application Container)和业务逻辑之间的接口。我为应用程序容器建立了三个模型,从最简单的基础模型到最复杂的高级模型。你能够在不改变业务逻辑的状况下将模型替换为另外一个模型。原来的接口是为最复杂的高级模型建立的,我对它作了一点修改,以便更好地适应其余模型。设计

将持久化代码移到应用程序服务层(Application Service Layer)

大多数人都把持久化代码在放在领域层(Domain Layer)。可是,根领据域驱动设计,它应该在服务层(Service Layer),因此我将它移到了应用程序服务层(Application Service Laayer)。乍一看,这很奇怪,由于大多数人并不这样作。可是,既然咱们有规则,就让咱们遵照它来看看这样作是否合适。日志

删除了应用程序容器中的“简化工厂”

我在文章"清晰架构(Clean Architecture)的Go微服务: 依赖注入(Dependency Injection)", 中详细描述了程序中使用的依赖注, 里面有两种类型的工厂,一个是“二级工厂”,另外一个是“简化工厂”。建立“简化工厂”的缘由是为了简化代码,换句话说就是减小代码行数。

可是当我对设计进行反思时,对程序的复杂性有了不一样的理解。我遵循的原则一直都没有改变,是为了下降代码的复杂性。可是我过去认为代码越长,就越复杂,可是如今我要增长另外一个维度,那就是代码结构的复杂性。虽然“二级工厂”的代码要长得多,但结构很简单。一个工厂建成后,就能够拷贝出许多副本。结构几乎相同,因此很容易复制工厂,也容易阅读。它的复杂性时线性增长的,并且没有其余反作用。此外,你还可使用诸如代码生成器之类的工具来自动生成它,以提升效率。虽然“简化工厂”只有少许代码,但其结构复杂,当工厂数量增长时其复杂性也迅速增长,并且反作用愈来愈大太大,难以管理。所以,“二级工厂”看起来代码不少,但其实很简单。因此在新的设计中,我决定去掉“简化工厂”,只保留“二级工厂”。

为何建立了一个新项目

我没有在原来的项目中进行升级,而是建立了一个名为“servicetempl1”的新项目,由于个人旧文章仍然指向原来的项目,我不想让阅读老版文章的人感到迷惑。我固然认为新版的比旧版好得多,并鼓励你使用新版的。

源码:

完整的源码: "servicetmpl1"

索引:

[1]"清晰架构(Clean Architecture)的Go微服务"

[2]"一个能够自我进化的微服务框架"

[3]"glogger"

[4]"gmessaging"

[5]"gtransaction"

[6]"事件驱动的微服务-建立第三方库"

[7]"清晰架构(Clean Architecture)的Go微服务: 日志管理"

[8]"一个非侵入的Go事务管理库——如何使用"

[9] "清晰架构(Clean Architecture)的Go微服务: 依赖注入(Dependency Injection)"

相关文章
相关标签/搜索