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

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

主要改进如下:

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

自我进化的设计

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

第三方库

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

单独的事务管理库

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

在新的框架中,我对事务管理部分做了较大的修改。现在,大部分代码被移出到第三方库中。这样,在应用程序里只需要添加两行代码就可以让一个函数支持事务。它不仅对业务代码没有侵入,而且对框架也没有侵入。因为它是一个第三方库,所以可以在不使用框架的情况下调用。我写了一篇单独的文章来讲述它, "一个非侵入的Go事务管理库——如何使用"

其它改动

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

容器接口

这是程序容器(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)"

清晰架构(Clean Architecture)的Go微服务—重大升级的更多相关文章

  1. (转)微服务架构 互联网保险O2O平台微服务架构设计

    http://www.cnblogs.com/Leo_wl/p/5049722.html 微服务架构 互联网保险O2O平台微服务架构设计 关于架构,笔者认为并不是越复杂越好,而是相反,简单就是硬道理也 ...

  2. Java 18套JAVA企业级大型项目实战分布式架构高并发高可用微服务电商项目实战架构

    Java 开发环境:idea https://www.jianshu.com/p/7a824fea1ce7 从无到有构建大型电商微服务架构三个阶段SpringBoot+SpringCloud+Solr ...

  3. 通俗地理解面向服务的架构(SOA)以及微服务之间的关系

    SOA是一种软件的应用架构方法,它基于面向对象,但又不是面向对象,整体上是面向服务的架构.SOA由精确的服务定义.松散的构件服务组成,以及业务流程调用等多个方面形成的一整套架构方法. 这话是不是听起来 ...

  4. Re:从0开始的微服务架构--(二)快速快速体验微服务架构?--转

    原文地址:https://mp.weixin.qq.com/s/QO1QDQWnjHZp8EvGDrxZvw 这是专题的第二篇文章,看看如何搭建一个简单模式的微服务架构. 记得好久之前看到一个大牛说过 ...

  5. 【分布式微服务企业快速架构】SpringCloud分布式、微服务、云架构快速开发平台源码

    鸿鹄云架构[系统管理平台]是一个大型 企业.分布式.微服务.云架构的JavaEE体系快速研发平台,基于 模块化.微服务化.原子化.热部署的设计思想,使用成熟领先的无商业限制的主流开源技术 (Sprin ...

  6. 清晰架构(Clean Architecture)的Go微服务: 设计原则

    我最近写了一个Go微服务应用程序,这个程序的设计来自三个灵感: 清晰架构"Clean Architecture"¹ and SOLID (面向对象设计)² 设计 原则³ Sprin ...

  7. 微服务架构-选择Spring Cloud,放弃Dubbo

    Spring Cloud 在国内中小型公司能用起来吗?从 2016 年初一直到现在,我们在这条路上已经走了一年多. 在使用 Spring Cloud 之前,我们对微服务实践是没有太多的体会和经验的.从 ...

  8. dubbo和dubboX与微服务架构(dubbo一)

    一.传统三层架构模式的缺陷 三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)web.业务逻辑层(Bu ...

  9. 放弃Dubbo,选择最流行的Spring Cloud微服务架构实践与经验总结

    http://developer.51cto.com/art/201710/554633.htm Spring Cloud 在国内中小型公司能用起来吗?从 2016 年初一直到现在,我们在这条路上已经 ...

随机推荐

  1. python检测“无内容”图片

    思路1:通过图像熵检测,“无内容”图像熵较小,可通过设置阈值检测“无内容”图像,计算图像熵可参考:https://www.cnblogs.com/niulang/p/12195152.html 思路2 ...

  2. EFCore-一对一配置外键小记2

    前后两次遇到这样的错误: The property 'xx' on entity type 'xxxx' has a temporary value. Either set a permanent v ...

  3. 为什么 group by后面 必须跟selecte 后面的除了聚集函数外的所有字段

    如:SELECT store_name, SUM(Sales) FROM Store_Information GROUP BY store_name 可以而SELECT store_name, add ...

  4. JS控制滚动条的位置

    转载▼http://blog.sina.com.cn/s/blog_4481a3460100rwwu.html     JS控制滚动条的位置:window.scrollTo(x,y); 竖向滚动条置顶 ...

  5. Flutter vs React Native vs Native:深度性能比较

    老孟导读:这是老孟翻译的付费文章,文章所有权归原作者所有. 欢迎加入老孟Flutter交流群,每周翻译2-3篇付费文章,精彩不容错过. 原文地址:https://medium.com/swlh/flu ...

  6. Python3笔记018 - 4.3 元组

    第4章 序列的应用 python的数据类型分为:空类型.布尔类型.数字类型.字节类型.字符串类型.元组类型.列表类型.字典类型.集合类型 在python中序列是一块用于存放多个值的连续内存空间. py ...

  7. SpringMVC的项目架构思想

    SpringMVC的项目架构思想 一.DO和Model的区别 DO是对数据库表的映射.Model是处理业务逻辑的模型(领域模型).例如:用户信息表和用户密码表分别是两个DO,但是对于实体用户来说,密码 ...

  8. activiti6基础01-如何数据库操作及相关表

    官网文档:https://www.activiti.org/userguide/#queryAPI 1. Activit的简单源码解读      activiti的官方文档讲解详细很详细,也很范.按着 ...

  9. (四)ansible 通过堡垒机访问内网服务器

    场景:     在ansible的使用过程中,存在这样的场景,ansible所在的管理节点与被管理的机器需要 通过一个跳板机才能连接,无法直接连接.要解决这个问题,并不需要在 ansible里做什么处 ...

  10. 如何白嫖微软Azure12个月及避坑指南

    Azure是微软提供的一个云服务平台.是全球除了AWS外最大的云服务提供商.Azure是微软除了windows之外另外一个王牌,微软错过了移动端,还好抓住了云服务.这里的Azure是Azure国际不是 ...