单层架构

在最开始编程的时候相信大家都写过下面这种架构,界面代码,业务代码,数据库连接全部在工程面完成。当然这种架构在处理很小的程序的时候依然有生命力

两层架构

后来我们发现数据访问的代码大量重复,应该进行抽象,于是单独将数据访问相关的代码封装出一个数据访问层,就是用Sqlhelper将数据库访问的方法封装,用DataTable返回到ui之中使用。

三层架构

随着业务规模的增加,UI层代码越来越多,并且有大量逻辑重复的代码,于是将UI曾中业务逻辑代码抽象出一层,放到BLL中,UI只处理一些界面展示,跳转,参数校验等相关内容,但是此时我们用的数据结构大部分情况下还是放在一个集中的工程Data中。

单个领域分层

当业务复杂度继续提高的时候,你会发现如下问题:

  1. 服务之间有大量重复的代码
  2. 修改一处业务需要改动多个地方的代码
  3. 服务会引用服务
  4. 服务之间关系非常混乱
  5. 甚至会出现相互引用的情况

在领域中运用如下战术设计解决上述问题

  1. 一般解决重复代码的思路都是将代码下沉(放到分层结构的更下面的层),但是随着复杂度的增加,同样会出现重复的问题,在领域驱动设计中,是将业务逻辑放到实体中,而实体是用来承载数据,可以说是最底层。这样就解决了重复代码的问题。
  2. 将业务逻辑封装到领域之后,逻辑集中后修改起来也比较方便
  3. 因为业务逻辑都在领域层所以服务直接的依赖变成服务和领域层的依赖
  4. 实体之间的逻辑是通过聚合根或者领域服务来组织。
  5. 原来的BLL层变成Application层。基本上一个应用服务的接口对应一个业务用例。由应用服务来调用领域处理业务,同时处理业务之外的一些技术和交互逻辑:例如 持久化,上下文交互等等

多个领域分层

随着对业务的理解,会形成一组一组这种概念(领域的划分)。

单进程多领域六边形架构

如果我们引入领域驱动中六边形架构之后(六边形架构其实可以认为是领域分层的一种实现方式):

  1. 此时将Application的契约和实现分离到不同的项目之中。
  2. 对六边形内部的访问都必须通过契约来调用

Api容器的多进程改造

一个六边形理解为一个模块

  1. 进程间通信使用Http
  2. 将所有模块的Contract组织到一起(每个Contract依旧是一个项目)
  3. 将原来的契约,契约实现,领域,仓储实现,放到容器之中
  4. 调整工程间的依赖关系保证模块和模块,ui和模块之间没有相互应用
  5. UI和其他模块,只需利用ioc将实现注册到契约修改成客户端代理注册到契约即可.

总结

恰如其分的架构中提到三种设计方式:

  1. 演进的设计: 满足客户现有需求,追求快速编码快速实现。
  2. 计划的设计:考虑未来扩展,保证开发过程有条不紊
  3. 最小化设计: 做适当设计,这是介于演进式和计划式。

最近很流行微服务,都拿微服务和单体架构做对比,但是如果初期就设计一个微服务那么架构和维护成本太高,很多产品初期团队根本不具备这样的资源,但是如果开始就设计一个单体架构可能又满足不了未来业务的发展.如果微服务架构是一个计划式设计的话,那单体架构就是一个演进式架构。但是这种演进的成本很高,甚至面临着重做的风险。

如果我们引入六边形架构这种最小化设计,再结合api容器就可以几乎0成本的将单体架构切换到微服务.

PS:每个架构演化都可以说很多,网上已经有很多这种说明,这里就没有详细的说明,有兴趣的可以留言讨论.

Api容器在应用架构演化中的用途的更多相关文章

  1. ASP.NET Core Web API下事件驱动型架构的实现(二):事件处理器中对象生命周期的管理

    在上文中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行代码就展示了一个基本工作原理.然而,要将这样的解决方案运用到实际生产环境,还有很 ...

  2. NET Core Web API下事件驱动型架构CQRS架构中聚合与聚合根的实现

    NET Core Web API下事件驱动型架构在前面两篇文章中,我详细介绍了基本事件系统的实现,包括事件派发和订阅.通过事件处理器执行上下文来解决对象生命周期问题,以及一个基于RabbitMQ的事件 ...

  3. 【转帖】一文看懂docker容器技术架构及其中的各个模块

    一文看懂docker容器技术架构及其中的各个模块 原创 波波说运维 2019-09-29 00:01:00 https://www.toutiao.com/a6740234030798602763/ ...

  4. 阿里架构师的工作总结:Spring Cloud在架构演进中起到的作用

    Spring Cloud作为一套微服务治理的框架,几乎考虑到了微服务治理的方方面面,本篇主要解答这两个问题:Spring Cloud在微服务的架构中都做了哪些事情?Spring Cloud提供的这些功 ...

  5. 重温.NET下Assembly的加载过程 ASP.NET Core Web API下事件驱动型架构的实现(三):基于RabbitMQ的事件总线

    重温.NET下Assembly的加载过程   最近在工作中牵涉到了.NET下的一个古老的问题:Assembly的加载过程.虽然网上有很多文章介绍这部分内容,很多文章也是很久以前就已经出现了,但阅读之后 ...

  6. 【原创】基于Docker的CaaS容器云平台架构设计及市场分析

    基于Docker的CaaS容器云平台架构设计及市场分析 ---转载请注明出处,多谢!--- 1 项目背景---概述: “在移动互联网时代,企业需要寻找新的软件交付流程和IT架构,从而实现架构平台化,交 ...

  7. 微服务与K8S容器云平台架构

    微服务与K8S容器云平台架构 微服务与12要素 网络 日志收集 服务网关 服务注册 服务治理- java agent 监控 今天先到这儿,希望对技术领导力, 企业管理,系统架构设计与评估,团队管理, ...

  8. 前端学HTTP之网站架构演化

    前面的话 本文将详细介绍网站架构的演化过程 初始阶段 大型网站都是从小型网站发展而来,网站架构也是一样,是从小型网站架构逐步演化而来.小型网站最开始时没有太多人访问,只需要一台服务器就绰绰有余,这时的 ...

  9. 转: Android 后台任务型App多进程架构演化

    评注:android 后台分进程保活方式的实践 Android 后台任务型App多进程架构演化 字数1621 阅读2790 评论8 喜欢35 什么是后台任务型app 类似音乐.录音机,需要用户长时间在 ...

随机推荐

  1. select下拉框如何与接口配合动态生成option选项

    前几天在做任务时考虑到这个问题,具体任务用例如下: HTML: JS:

  2. LOJ6235 区间素数个数(min_25筛)

    题目链接:LOJ 题目大意:看到题目名字应该都知道是啥了吧. $1\le N\le 10^{11}$. 阉割版 min_25 筛.发现答案实际上就是 min_25 筛中 $g(N,pl)$ 的值.(取 ...

  3. es6实现类的多重继承

    1.类的多种继承,将多个类的接口“混入”(mix in)另一个类. function mix(...mixins) { class Mix { // 如果不需要拷贝实例属性下面这段代码可以去掉 // ...

  4. Codeforces 92C【二分】

    意: 求最少需要几个s1串拼接存在子串s2 (1≤|s1|≤1e4,1≤|s2|≤1e6). 思路(感谢ZQC): 每个字母的出现位置存个vector. 假设你当前已经用了A串的前x个字符,现在想要匹 ...

  5. Java基础--常用API--集合类相关API

    一.泛型 1.泛型的本质是将类型参数化,即将数据类型作为参数. 2.泛型可以在编译期进行检查,其所有的强制转换是隐式且自动的,提高了代码的安全性. 3.泛型可以用在类(泛型类).接口(泛型接口).方法 ...

  6. Java 引用类型

    若内存中一个对象没有任何引用的话,则可以认为该对象已经不再使用了,可以成为GC的候选.不过由于垃圾回收器的运行时间不确定,可被垃圾回收的对象的实际被回收时间是不确定的.对于一个对象来说,只要有引用的存 ...

  7. SLF4J、Log4J使用记录

    程序中一直在用log4j,之前都没了解过,只知道是打印日志信息的.最近独立新建了几个开发工程,发现slf4j老有冲突,开始关注起来,我用log4j打印日志,与slf4j有毛关系,怎么老冲突呢.网上找了 ...

  8. 面向对象OO第三单元总结

    第三单元OO总结博客 1 梳理JML语言的理论基础.应用工具链情况 由于篇幅原因,这里只梳理几个在本单元常用的 注释结构 行注释://@annotation 块注释:/* @ annotation @ ...

  9. Educational Codeforces Round 48 (Rated for Div. 2) B 1016B Segment Occurrences (前缀和)

    B. Segment Occurrences time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  10. thinkphp5.1页面页面模板及参数配置

    success和error跳转的模板在thinkphp/tpl/dispatch_jump.tpl 配置参数在thinkphp\library\traits\controller\jump.php文件 ...