Api容器在应用架构演化中的用途
单层架构
在最开始编程的时候相信大家都写过下面这种架构,界面代码,业务代码,数据库连接全部在工程面完成。当然这种架构在处理很小的程序的时候依然有生命力
两层架构
后来我们发现数据访问的代码大量重复,应该进行抽象,于是单独将数据访问相关的代码封装出一个数据访问层,就是用Sqlhelper将数据库访问的方法封装,用DataTable返回到ui之中使用。
三层架构
随着业务规模的增加,UI层代码越来越多,并且有大量逻辑重复的代码,于是将UI曾中业务逻辑代码抽象出一层,放到BLL中,UI只处理一些界面展示,跳转,参数校验等相关内容,但是此时我们用的数据结构大部分情况下还是放在一个集中的工程Data中。
单个领域分层
当业务复杂度继续提高的时候,你会发现如下问题:
- 服务之间有大量重复的代码
- 修改一处业务需要改动多个地方的代码
- 服务会引用服务
- 服务之间关系非常混乱
- 甚至会出现相互引用的情况
在领域中运用如下战术设计解决上述问题
- 一般解决重复代码的思路都是将代码下沉(放到分层结构的更下面的层),但是随着复杂度的增加,同样会出现重复的问题,在领域驱动设计中,是将业务逻辑放到实体中,而实体是用来承载数据,可以说是最底层。这样就解决了重复代码的问题。
- 将业务逻辑封装到领域之后,逻辑集中后修改起来也比较方便
- 因为业务逻辑都在领域层所以服务直接的依赖变成服务和领域层的依赖
- 实体之间的逻辑是通过聚合根或者领域服务来组织。
- 原来的BLL层变成Application层。基本上一个应用服务的接口对应一个业务用例。由应用服务来调用领域处理业务,同时处理业务之外的一些技术和交互逻辑:例如 持久化,上下文交互等等
多个领域分层
随着对业务的理解,会形成一组一组这种概念(领域的划分)。
单进程多领域六边形架构
如果我们引入领域驱动中六边形架构之后(六边形架构其实可以认为是领域分层的一种实现方式):
- 此时将Application的契约和实现分离到不同的项目之中。
- 对六边形内部的访问都必须通过契约来调用
Api容器的多进程改造
一个六边形理解为一个模块
- 进程间通信使用Http
- 将所有模块的Contract组织到一起(每个Contract依旧是一个项目)
- 将原来的契约,契约实现,领域,仓储实现,放到容器之中
- 调整工程间的依赖关系保证模块和模块,ui和模块之间没有相互应用
- UI和其他模块,只需利用ioc将实现注册到契约修改成客户端代理注册到契约即可.
总结
恰如其分的架构中提到三种设计方式:
- 演进的设计: 满足客户现有需求,追求快速编码快速实现。
- 计划的设计:考虑未来扩展,保证开发过程有条不紊
- 最小化设计: 做适当设计,这是介于演进式和计划式。
最近很流行微服务,都拿微服务和单体架构做对比,但是如果初期就设计一个微服务那么架构和维护成本太高,很多产品初期团队根本不具备这样的资源,但是如果开始就设计一个单体架构可能又满足不了未来业务的发展.如果微服务架构是一个计划式设计的话,那单体架构就是一个演进式架构。但是这种演进的成本很高,甚至面临着重做的风险。
如果我们引入六边形架构这种最小化设计,再结合api容器就可以几乎0成本的将单体架构切换到微服务.
PS:每个架构演化都可以说很多,网上已经有很多这种说明,这里就没有详细的说明,有兴趣的可以留言讨论.
Api容器在应用架构演化中的用途的更多相关文章
- ASP.NET Core Web API下事件驱动型架构的实现(二):事件处理器中对象生命周期的管理
在上文中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行代码就展示了一个基本工作原理.然而,要将这样的解决方案运用到实际生产环境,还有很 ...
- NET Core Web API下事件驱动型架构CQRS架构中聚合与聚合根的实现
NET Core Web API下事件驱动型架构在前面两篇文章中,我详细介绍了基本事件系统的实现,包括事件派发和订阅.通过事件处理器执行上下文来解决对象生命周期问题,以及一个基于RabbitMQ的事件 ...
- 【转帖】一文看懂docker容器技术架构及其中的各个模块
一文看懂docker容器技术架构及其中的各个模块 原创 波波说运维 2019-09-29 00:01:00 https://www.toutiao.com/a6740234030798602763/ ...
- 阿里架构师的工作总结:Spring Cloud在架构演进中起到的作用
Spring Cloud作为一套微服务治理的框架,几乎考虑到了微服务治理的方方面面,本篇主要解答这两个问题:Spring Cloud在微服务的架构中都做了哪些事情?Spring Cloud提供的这些功 ...
- 重温.NET下Assembly的加载过程 ASP.NET Core Web API下事件驱动型架构的实现(三):基于RabbitMQ的事件总线
重温.NET下Assembly的加载过程 最近在工作中牵涉到了.NET下的一个古老的问题:Assembly的加载过程.虽然网上有很多文章介绍这部分内容,很多文章也是很久以前就已经出现了,但阅读之后 ...
- 【原创】基于Docker的CaaS容器云平台架构设计及市场分析
基于Docker的CaaS容器云平台架构设计及市场分析 ---转载请注明出处,多谢!--- 1 项目背景---概述: “在移动互联网时代,企业需要寻找新的软件交付流程和IT架构,从而实现架构平台化,交 ...
- 微服务与K8S容器云平台架构
微服务与K8S容器云平台架构 微服务与12要素 网络 日志收集 服务网关 服务注册 服务治理- java agent 监控 今天先到这儿,希望对技术领导力, 企业管理,系统架构设计与评估,团队管理, ...
- 前端学HTTP之网站架构演化
前面的话 本文将详细介绍网站架构的演化过程 初始阶段 大型网站都是从小型网站发展而来,网站架构也是一样,是从小型网站架构逐步演化而来.小型网站最开始时没有太多人访问,只需要一台服务器就绰绰有余,这时的 ...
- 转: Android 后台任务型App多进程架构演化
评注:android 后台分进程保活方式的实践 Android 后台任务型App多进程架构演化 字数1621 阅读2790 评论8 喜欢35 什么是后台任务型app 类似音乐.录音机,需要用户长时间在 ...
随机推荐
- 使用MailMessage发送邮件
SmtpClient smtp = new SmtpClient(); //实例化一个SmtpClient smtp.DeliveryMethod = SmtpDeliveryMethod.Netwo ...
- .NET ToString() format格式化字符串(常用)
前言 我们平常会用到货币数据类型,尤其当我们计算金钱或者算数的时候经常会遇到保留几位小数,而且碰到日期格式问题的时候,经常不知道选择什么样的格式比较合适,下面我找了一部分常用的.NET ToStrin ...
- JSP读取Oracle数据库里的图片Blob字段并显示在页面上
1.java代码: /** * 打印模板获取电子签名 * @param request * @param resp * @param id * @return * @throws Exception ...
- linux文件查找find
一.locate locate基于数据库索引来查找文件,数据库在开机时一段时间对更新,不会实时更新,数据库存放在(/var/lib/mlocate/mlocate.db),可以用updatedb来手动 ...
- 洛谷 P1551 亲戚(并查集模板)
嗯... 题目链接:https://www.luogu.org/problemnew/show/P1551 思路: 很显然地我们会发现,这是一道并查集的模板题,并且是考察了并查集中的”并“和”查“的操 ...
- myeclipse-9.0安装svn客户端插件
SVN插件配置到MyEclipse中的步骤 听语音 | 浏览:20471 | 更新:2015-01-09 10:26 | 标签:myeclipse 1 2 3 4 5 6 7 分步阅读 MyEclip ...
- ssl加密
握手前使用非对称加密, 握手后使用对称加密 前期握手就是用来协商对称加密算法的
- Vertical roller mill from SBM
Vertical roller mill has many different forms, but it works basically the same. All of these forms o ...
- vs2017通过模块文件添加自定义注释
有时我们在VS里建立类和接口时,需要添加比较规范的注释信息,而每次都要复制粘贴比较麻烦,所以需要我们的IDE做一些支持,比较修改VS里自定义的注释模式,以添加自己公司需要的信息格式. 注释比较规范,是 ...
- matlab 打不开excel文件
方法论 excel的后缀为.xls, matlab是无法识别的, 需要将其另存为.xlsx文件格式 打开excel, 点击save as, 选中保存的文件格式是.xlsx即可