去年,我创建了一个清晰架构(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. rodert单排学习redis进阶【白银一】

    redis之白银一 说些题外话,最近帝都疫情又严重,大家都身处时代洪流中,这不是个别人能左右的,希望你能保护好自己,天天开心. 前言 1.Redis 客户端 1.1.Redis Desktop Man ...

  2. 这一次搞懂SpringBoot核心原理(自动配置、事件驱动、Condition)

    @ 目录 前言 正文 启动原理 事件驱动 自动配置原理 Condition注解原理 总结 前言 SpringBoot是Spring的包装,通过自动配置使得SpringBoot可以做到开箱即用,上手成本 ...

  3. jquery 获取页面和滚动条的高度

    1.获取浏览器显示区域的高度 : $(window).height(); 2.获取浏览器显示区域的宽度 : $(window).width(); 3.获取页面的文档高度 : $(document).h ...

  4. Python之浅谈绑定方法

    目录 绑定方法和非绑定方法 绑定方法 对象的绑定方法 类的绑定方法 非绑定方法 总结 绑定方法和非绑定方法 类中定义的方法大致可以分为两类:绑定方法和非绑定方法.其中绑定方法又可以分为绑定到对象的方法 ...

  5. I/O模式及select、 poll、 epoll

    I/O多路复用技术 复用技术(multiplexing)并不是新技术而是一种设计思想,在通信和硬件设计中存在频分复用.时分复用.波分复用.码分复用等.在日常生活中复用的场景也非常多.从本质上来说,复用 ...

  6. SpringCloud之zuul

  7. Oracle Online Patching报错"This is not a RAC setup. OPatch cannot determine the local node name"

    Oracle Online Patching报错"This is not a RAC setup. OPatch cannot determine the local node name&q ...

  8. 深入了解JVM-方法区

    本文首发于微信公众号[猿灯塔],转载引用请说明出处 今天呢!灯塔君跟大家讲: 深入了解JVM-方法区 当JVM使用类装载器装载某个类时,它首先要定位对应的class文件,然后读入这个class文件,最 ...

  9. CSS3+JS实现静态圆形进度条

    一.实现原理 首先,我们来一个圆(黑色).接着,再来两个半圆,将黑色的圆遮住.(为了演示,左右两侧颜色不一样)这时候,我们顺时针旋转右侧蓝色的半圆,下面的黑色圆就会暴露出来,比如我们旋转45度(12. ...

  10. 核心知识点:python入门

    目录 一.python入门day1-day24 day01-03 编程语言 day04 变量 day05 垃圾回收机制(GC机制) 1 引用计数 2 标记清除 3 分代回收 day05 程序交互与基本 ...