单层架构

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

两层架构

后来我们发现数据访问的代码大量重复,应该进行抽象,于是单独将数据访问相关的代码封装出一个数据访问层,就是用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. PHP7中Protobuf的安装使用

    PHP7中Protobuf的安装使用 写这篇文章的缘由是最近在关注RPC框架序列化的一些原理.但是在安装Protobuf的时候,发现网上的教程都太老了,加上目前Protobuf官方已经支持PHP了,不 ...

  2. 【转】C# 使用正则表达式去掉字符串中的数字,或者去掉字符串中的非数字

    源地址:http://www.cnblogs.com/94cool/p/4332957.html

  3. luogu 3806 【模板】点分治

    luogu 3806 [模板]点分治 给定一棵有n个点的树,有m个询问,每个询问树上距离为k的点对是否存在.树的权值最多不超过c.n<=10000,m<=100,c<=1000,K& ...

  4. iOS回顾笔记( 01 )-- XIB和纯代码创建应用的对比

    header{font-size:1em;padding-top:1.5em;padding-bottom:1.5em} .markdown-body{overflow:hidden} .markdo ...

  5. rlwrap: command not found和解决linux下sqlplus 提供浏览历史命令行的功能

    rlwrap工具可以解决linux下sqlplus 提供浏览历史命令行的功能,和删除先前输入错误的字母等问题 1.安装 需要readline包 这个安装光盘就有 [root@asm RedHat]# ...

  6. 高效法则 之 你还在用这么low的方法打开软件吗?

    电脑上的诸多功能被组织成软件的形式提供给用户.聊天的有QQ/Skype,看电影的有腾讯视频/芒果TV,听音乐的有酷狗/LessDJ,做图的有PS/Sketch,写代码搞开发的各种IDE Eclipse ...

  7. [Cqoi2014]危桥 (两遍网络流)

    题目链接 #include <bits/stdc++.h> using namespace std; typedef long long ll; inline int read() { , ...

  8. 使用命令安装vue插件

    使用命令npm install element-ui --save-dev 安装element-ui. --save-dev表示自动添加配置依赖到package.json文件的devDependenc ...

  9. 7、kvm迁移操作

    虚拟机迁移要确保虚拟机是关机状态. virsh shutdown privi-server virsh dumpxml privi-server > /etc/libvirt/qemu/priv ...

  10. Android的网络通信

    Android平台有三种网络接口可以使用,他们分别是:java.net.*(标准Java接口).Org.apache接口和Android.net.*(Android网络接口).大多数的Android应 ...