单层架构

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

两层架构

后来我们发现数据访问的代码大量重复,应该进行抽象,于是单独将数据访问相关的代码封装出一个数据访问层,就是用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:每个架构演化都可以说很多,网上已经有很多这种说明,这里就没有详细的说明,有兴趣的可以留言讨论.

转载于:https://www.cnblogs.com/Skyven/p/8286939.html

Api容器在应用架构演化中的用途相关推荐

  1. 一文看懂docker容器技术架构及其中的各个模块

    概述 今天主要简单介绍下docker的技术架构及其中组成的各个模块. 技术架构 distribution 负责与docker registry交互,上传洗澡镜像以及v2 registry 有关的源数据 ...

  2. 容器化单页面应用中RESTful API的访问

    最近在工作中,需要让运行在容器中的单页面应用程序能够访问外部的RESTful API.这个需求看起来并不困难,不过实现起来还是有些曲折的.在此,我就将这部分内容总结一下. 在入正题之前,有个一问题,就 ...

  3. ASP.NET Core Web API下事件驱动型架构的实现(四):CQRS架构中聚合与聚合根的实现

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

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

    在ASP.NET Core Web API下事件驱动型架构的实现(一):一个简单的实现中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行 ...

  5. 访问页面升级访问_容器化单页面应用中RESTful API的访问

    最近在工作中,需要让运行在容器中的单页面应用程序能够访问外部的RESTful API.这个需求看起来并不困难,不过实现起来还是有些曲折的.在此,我就将这部分内容总结一下. 在入正题之前,有个一问题,就 ...

  6. 架构演化:云原生时代开启之系列一演化篇

    信息技术从出现伊始到渐成主流,其趋势经历了软件.开源和云三个阶段: 软件改变世界.纵观人类社会漫长的发展历程,农耕时代.工业时代与信息时代可谓是三个明显分水岭,每个时代人类涉及的领域范畴均喷井式增长. ...

  7. 容器 PaaS 新技术架构下的运维实践

    2018年11月16-17日,运维&容器技术盛会 CNUTCon 全球运维技术大会在上海·光大会展中心成功举办.时速云联合创始人兼 CTO 王磊受邀参加此次大会,并发表主题演讲. 王磊此次演讲 ...

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

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

  9. ML.NET机器学习、API容器化与Azure DevOps实践(四):持续集成与k8s持续部署

    通过上文所介绍的内容,我们已经完成了RESTful API的开发,现在,就可以使用Azure DevOps来进行持续集成(CI)和k8s持续部署(CD)了.本文我会对使用Azure DevOps进行C ...

最新文章

  1. 确认AD DS域是否正常
  2. ue编辑器拖拽上传图片_Typora + PicGo打造超好用的Markdown编辑器
  3. DSP 28335中GPIO配置
  4. 原来记录系统日志那么简单【Java】【SpringBoot】【Mybatis Plus】【AspcetJ】
  5. amr转换成mp3 java_java将amr文件转换为MP3格式(windowslinux均可使用,亲测)
  6. poj1979 深度优先搜索 挑战程式设计竞赛
  7. 聚类算法实现:DBSCAN、层次聚类、K-means、
  8. 使用JSON作为函数的参数(转载)
  9. php100视频教程html,PHP100视频教程48:Ajax+PHP快速上手及应用
  10. android 不压缩保存图片格式,Android图片处理——压缩、剪裁、圆角、保存
  11. win10很多软件显示模糊_win10系统字体模糊的解决方法
  12. Vivado vc707 pcie传输实验(超详细)
  13. 多多情报通:拼多多卖茶叶需要食品许可证吗?还需要什么证件?
  14. duilib最新版地址
  15. 电路图:MC34063 2.2V-6V升压到7V电路
  16. 找零钱问题刨析(Python代码)
  17. Qt源码分析之信号和槽机制
  18. 【设计模式】常见的23种设计模式
  19. 抢票软件真的靠谱吗?
  20. 小米笔记本pro重装系统和问题汇总

热门文章

  1. 深入理解PHP之源码目录结构
  2. Centos 系统swap虚拟内存添加与删除配置
  3. xshell利用linux rz sz 命令上传、下载文件
  4. angular 首屏加载优化_[转]Angular4首页加载慢优化之路
  5. Spring深入理解-Spring框架设计理念
  6. Java校招笔试题-Java基础部分(三)
  7. 设计模式--行为型模式
  8. 【MyBatis框架】查询缓存-一级缓存原理
  9. 用systemd命令来管理linux系统
  10. 在程序设计中使用Interface