清晰架构(Clean Architecture)的Go微服务—重大升级
去年,我创建了一个清晰架构(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微服务"
[3]"glogger"
[4]"gmessaging"
[7]"清晰架构(Clean Architecture)的Go微服务: 日志管理"
[9] "清晰架构(Clean Architecture)的Go微服务: 依赖注入(Dependency Injection)"
清晰架构(Clean Architecture)的Go微服务—重大升级的更多相关文章
- (转)微服务架构 互联网保险O2O平台微服务架构设计
http://www.cnblogs.com/Leo_wl/p/5049722.html 微服务架构 互联网保险O2O平台微服务架构设计 关于架构,笔者认为并不是越复杂越好,而是相反,简单就是硬道理也 ...
- Java 18套JAVA企业级大型项目实战分布式架构高并发高可用微服务电商项目实战架构
Java 开发环境:idea https://www.jianshu.com/p/7a824fea1ce7 从无到有构建大型电商微服务架构三个阶段SpringBoot+SpringCloud+Solr ...
- 通俗地理解面向服务的架构(SOA)以及微服务之间的关系
SOA是一种软件的应用架构方法,它基于面向对象,但又不是面向对象,整体上是面向服务的架构.SOA由精确的服务定义.松散的构件服务组成,以及业务流程调用等多个方面形成的一整套架构方法. 这话是不是听起来 ...
- Re:从0开始的微服务架构--(二)快速快速体验微服务架构?--转
原文地址:https://mp.weixin.qq.com/s/QO1QDQWnjHZp8EvGDrxZvw 这是专题的第二篇文章,看看如何搭建一个简单模式的微服务架构. 记得好久之前看到一个大牛说过 ...
- 【分布式微服务企业快速架构】SpringCloud分布式、微服务、云架构快速开发平台源码
鸿鹄云架构[系统管理平台]是一个大型 企业.分布式.微服务.云架构的JavaEE体系快速研发平台,基于 模块化.微服务化.原子化.热部署的设计思想,使用成熟领先的无商业限制的主流开源技术 (Sprin ...
- 清晰架构(Clean Architecture)的Go微服务: 设计原则
我最近写了一个Go微服务应用程序,这个程序的设计来自三个灵感: 清晰架构"Clean Architecture"¹ and SOLID (面向对象设计)² 设计 原则³ Sprin ...
- 微服务架构-选择Spring Cloud,放弃Dubbo
Spring Cloud 在国内中小型公司能用起来吗?从 2016 年初一直到现在,我们在这条路上已经走了一年多. 在使用 Spring Cloud 之前,我们对微服务实践是没有太多的体会和经验的.从 ...
- dubbo和dubboX与微服务架构(dubbo一)
一.传统三层架构模式的缺陷 三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)web.业务逻辑层(Bu ...
- 放弃Dubbo,选择最流行的Spring Cloud微服务架构实践与经验总结
http://developer.51cto.com/art/201710/554633.htm Spring Cloud 在国内中小型公司能用起来吗?从 2016 年初一直到现在,我们在这条路上已经 ...
随机推荐
- Web安全之暴力破解
暴力破解,顾名思义简单粗暴直接,我理解为将所有的“答案”都进行尝试直到找到正确的“答案", 当然我们不可能将所有的“答案”都进行尝试,所以我们只能将所有最有可能是正确的“答案”进行尝试即可 ...
- Python实用笔记 (11)高级特性——迭代器
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable. 可以使用isinstance()判断一个对象是否是Iterable对象: >>> from collectio ...
- 编译ts时候src目录的ts分别生成了单独的js文件
{ "compilerOptions": { "target": "es5", "outDir": "bin- ...
- Asp.net Core AOP实现(采用Autofac)
引用正确的库来实现AOP 新的.NET Core是基于.NET Standard的..所以我们在引用库的时候特别要注意相关的兼容问题. 在传统的ASP.NET中,使用过Autofac来进行AOP操作的 ...
- 洛谷 P2212 【[USACO14MAR]Watering the Fields S】
一道最小生成树模板题,这里用的Kruskal算法,把每两点就加一条边,跑一遍最小生成树即可. #include <bits/stdc++.h> using namespace std; s ...
- css div如何隐藏?
在我们平时布局网站的时候,想要把div进行隐藏,但是很多人不知道css控制div显示隐藏?下面我们来讲解一下css如何让div隐藏. 1.使用display:none来隐藏div 我们可以使用disp ...
- 带你认识网站图片img懒加载和预加载的区别
懒加载 什么是懒加载? 懒加载也就是延迟加载.当访问一个页面的时候,先把img元素或是其他元素的背景图片路径替换成一张大小为1*1px图片的路径(这样就只需请求一次,俗称占位图),只有当图片出现在浏览 ...
- JAVA的8种基本数据类型分析
基本数据类型(8个) 1.整数类型(4个) 字节个数 取值范围 byte(字节) 1(8位) -2^7~2^7-1 short(短整型) 2(16位) -2^15~2^15-1 int(整形) 4 ...
- Flask路由中使用正则表达式匹配
1.说明 由于flask并不支持直接使用正则表达式来匹配路由,我们可以使用werkzeug.routing的BaseConverter来实现 2.代码 from flask import Flask ...
- Docker镜像-删除镜像
因为尝试使用新的镜像,对原来的镜像进行删除,报错如下: 意思就是在删除镜像之前,要先删除对应的docker.因为该image被对应的container引用,所以image删除失败. 显示所有状态的容器 ...