关于架构:应用架构之道分离业务逻辑和技术细节服务器应用层

关于架构这个概念很难给出一个明确的定义,也没有一个标准的定义。

硬是要给一个概述,我认为架构就是对系统中的实体以及实体之间的关系所进行的抽象描述。

架构始于建筑,是因为人类发展(原始人自给自足住在树上,也就不需要架构),分工协作的需要,将目标系统按某个原则进行切分,切分的原则,是要便于不同的角色进行并行工作。

为什么需要架构?

有系统的地方就需要架构,大到航空飞机,小到一个电商系统里面的一个功能组件都需要设计和架构。

我很喜欢《系统架构:复杂系统的产品设计与开发》里面的一句话:结构良好的创造活动要优于毫无结构的创造活动。

与之相对应的,现在很多敏捷思想提倡nodesign,只要work就好。期待好的架构可以在迭代中自然涌现。这个想法有点太理想化了,在现实中,只要能work的代码,工程师是很少有动力去重构和优化的。

架构师的职责

作为架构师,我们最重要的价值应该是“化繁为简”。但凡让事情变得更复杂,让系统变得更晦涩难懂的架构都是值得商榷的。

架构师的工作就是要努力训练自己的思维,用它去理解复杂的系统,通过合理的分解和抽象,使哪些系统不再那么难懂。我们应该努力构建易懂的架构,使得在系统上工作的其他人员(例如设计者、实现者、操作员等)可以较为容易地理解这个系统。

软件架构

软件架构是一个系统的草图。软件架构描述的对象是直接构成系统的抽象组件。各个组件之间的连接则明确和相对细致地描述组件之间的通信。在实现阶段,这些抽象组件被细化为实际的组件,比如具体某个类或者对象。在面向对象领域中,组件之间的连接通常用接口来实现。

软件架构为软件系统提供了一个结构、行为和属性的高级抽象,由构件的描述、构件的相互作用、指导构件集成的模式以及这些模式的约束组成。软件架构不仅显示了软件需求和软件结构之间的对应关系,而且指定了整个软件系统的组织和拓扑结构,提供了一些设计决策的基本原理。

软件架构的核心价值应该只围绕一个核心命题:控制复杂性。他并不意味着某个特定的分层结构,某个特定的方法论(贫血、DDD等)。

软件架构分类

在介绍应用架构之前,我们先来看一下软件架构的分类。

随着互联网的发展,现在的系统要支撑数亿人同时在线购物、通信、娱乐的需要,相应的软件体系结构也变得越来越复杂。软件架构的含义也变得更加宽泛,我们不能简单地用一个软件架构来指代所有的软件架构工作。按照我个人理解,我将软件架构划分为:

业务架构:由业务架构师负责,也可以称为业务领域专家、行业专家。业务架构属于顶层设计,其对业务的定义和划分会影响组织结构和技术架构。例如,阿里巴巴在没有中台部门之前,每个业务部门的技术架构都是烟囱式的,淘宝、天猫、飞猪、1688等各有一套体系结构。而后,成立了共享平台事业部,打通了账号、商品、订单等体系,让商业基础实施的复用成为可能。

应用架构:由应用架构师负责,他需要根据业务场景的需要,设计应用的层次结构,制定应用规范、定义接口和数据交互协议等。并尽量将应用的复杂度控制在一个可以接受的水平,从而在快速的支撑业务发展的同时,在保证系统的可用性和可维护性的同时,确保应用满足非功能属性要求(性能、安全、稳定性等)。

分布式系统架构:分布式系统基本是稍具规模业务的必选项。它需要解决服务器负载,分布式服务的注册和发现,消息系统,缓存系统,分布式数据库等问题,同时架构师要在CAP(Consistency,Availability,Partitiontolerance)之间进行权衡。

运维架构:负责运维系统的规划、选型、部署上线,建立规范化的运维体系。

分层架构

分层是一种常见的根据系统中的角色(职责拆分)和组织代码单元的常规实践。常见的分层结构如下图所示:

CQS(CommandQuerySeparation,命令查询分离),最早来自于BetrandMeyer(Eiffel语言之父,OCP提出者)提出的概念。其基本思想在于,任何一个对象的方法可以分为两大类:

命令(Command):不返回任何结果(void),但会改变对象的状态。

查询(Query):返回结果,但是不会改变对象的状态,对系统没有副作用。

六边形架构是AlistairCockburn在2005年提出,解决了传统的分层架构所带来的问题,实际上它也是一种分层架构,只不过不是上下,而是变成了内部和外部(如下图所示)。

六边形架构又称为端口-适配器架构,这个名字更容器理解。六边形架构将系统分为内部(内部六边形)和外部,内部代表了应用的业务逻辑,外部代表应用的驱动逻辑、基础设施或其他应用。

适配器分为两种类型(如下图所示),左侧代表UI的适配器被称为主动适配器(DrivingAdapters),因为是它们发起了对应用的一些操作。而右侧表示和后端工具链接的适配器,被称为被动适配器(DrivenAdapters),因为它们只会对主适配器的操作作出响应。

不同的是洋葱架构还告诉我们,企业应用中存在着不止两个层次,它在业务逻辑中加入了一些在领域驱动设计的过程中被识别出来的层次(Application,DomainService,Domainmodel,Infrastructure等)。

另外,它还有着脱离真实基础设施和传达机制应用仍然可以运行的便利,这样可以使用mock代替它们方便测试。

在洋葱架构中,明确规定了依赖的方向:

外层依赖内层

内层对外层无感知

COLA应用架构

COLA架构是我团队自主研发的应用架构,目前已经开源。在COLA的设计中,我们充分汲取了经典架构的优秀思想。除此之外,我们补充了规范设计和扩展设计,并且使用Archetype的方式,将架构固化下来,以便可以快速的在开发中使用。

1.分层设计

COLA的分层是一种改良了的三层架构。主要是将传统的业务逻辑层拆分成应用层、领域层和基础实施层。如下图所示,左边是传统的分层架构,右边是COLA的分层架构。

其每一层的作用范围和含义如下:

1)展现层(PresentationLayer)

负责以Rest的格式接受Web请求,然后将请求路由给Application层执行,并返回视图模型(ViewModel),其载体通常是DTO(DataTransferObject)。

2)应用层(ApplicationLayer)

主要负责获取输入,组装上下文,做输入校验,调用领域层做业务处理,如果需要的话,发送消息通知。当然,层次是开放的,若有需要,应用层也可以直接访问基础实施层。

3)领域层(DomainLayer)

主要是封装了核心业务逻辑,并通过领域服务(DomainService)和领域对象(Entities)的函数对外部提供业务逻辑的计算和处理.

4)基础实施层(InfrastructureLayer)

2.扩展设计

对于只有一个业务的简单场景,对扩展性的要求并不突出,这也是为什么扩展设计常被忽略的原因,因为我们大部分的系统都是从单一业务开始的。但是随着业务场景越来越复杂,代码里面开始出现大量的if-else逻辑。此时除了常规的策略模式以外,我们可以考虑在架构层面提供统一的扩展解决方案。

在扩展设计中,我们提炼出两个重要的概念,一个是业务身份,另一个是扩展点。

业务身份是指业务在系统唯一标识一个业务或者一个场景的标志。在具体实现中,我们使用BizCode来表示业务身份,其中BizCode采用类似Java包名命名空间的方式。例如,我们可以用“ali.tmall”表示阿里天猫业务,用“ali.tmall.car”表示阿里天猫的汽车业务,而用'ali.tmall.car.aftermarket'代表这是阿里天猫的汽车业务的后市场场景。

每个业务或者场景都可以实现一个或多个扩展点(ExtensionPoint),也就是说一个业务身份加上一个扩展点,可以唯一地确定一个扩展实现(Extension)。而这个业务身份和扩展点的组合,我们将其称之为扩展坐标(ExtensionCoordinate),如下图所示。

这样,通过业务身份+扩展点,我们就可以从框架层面实现对不同租户,不同业务,不同场景的扩展定制了。整个阿里业务中台正是基于这个思想,实现的多业务支撑的。

3.规范设计

任何事物都是规则性和随机性的组合。规范的意义就在于我们可以将规则性的东西固化下来,尽量减少随心所欲带来的复杂度,一致性可以降低系统复杂度。从命名到架构皆是如此,而架构本身就是一种规范和约束,破坏这个约束,也就破坏了架构。

COLA制定了一系列的规范:包括组件(Module)结构、包(Package)结构、命名等。

比如对于组件,我们要求使用COLA的应用都应该遵循如下图所示的组件划分:

在架构思想上,COLA主张像六边形架构那样,使用端口-适配器去解耦技术细节;主张像洋葱圈架构那样,以领域为核心,并通过依赖倒置反转领域层的依赖方向。最终形成如下图所示的组件关系。

换一个视角,从COLA应用处理响应一个请求的过程来看。COLA使用了CQRS来分离命令和查询的职责,使用扩展点和元数据来提升应用的扩展性。整个处理流程如下图所示:

应用架构的核心

纵观上面介绍的所有应用架构,我们可以发现一个共同点,就是“核心业务逻辑和技术细节分离”。

是的,六边形架构、洋葱圈架构、以及COLA架构的核心职责就是要做核心业务逻辑和技术细节的分离和解耦。

试想一下,业务逻辑和技术细节糅杂在一起的情况,所有的代码都写在ServiceImpl里面,前几行代码是做validation的事,接下来几行是做convert的事,然后是几行业务处理逻辑的代码,穿插着,我们需要通过RPC或者DAO获取更多的数据,拿到数据后,又是几行convert的代码,再接上一段业务逻辑代码,然后还要落库,发消息…..等等。

再简单的业务,按照上面这种写代码的方式,都会变得复杂,难维护

因此,我认为应用架构的核心使命就是要分离业务逻辑和技术细节。让核心业务逻辑可以反映领域模型和领域应用,可以复用,可以很容易被看懂。让技术细节在辅助实现业务功能的同时,可以被替换。

THE END
1.企业级业务架构设计业务架构设计开发企业级业务架构设计 一切有为法 如梦幻泡影 如露亦如电 应作如是观 --《金刚经》 一、业务架构与IT技术架构的关系 1、业务架构的任务是搭建业务和技术之间的桥梁 2、每个人都具有一个有趣的灵魂,人如果脱离了灵魂则是无生机的行尸走肉 3、IT技术架构也一样,IT技术架构就像一个容器,业务架构则像灵魂,注入https://blog.csdn.net/fangwenqi215/article/details/129236517
2.《企业级业务架构设计:方法论与实践》(付晓岩)简介书评当当网图书频道在线销售正版《企业级业务架构设计:方法论与实践》,作者:付晓岩,出版社:机械工业出版社。最新《企业级业务架构设计:方法论与实践》简介、书评、试读、价格、图片等相关信息,尽在DangDang.com,网购《企业级业务架构设计:方法论与实践》,就上当当网。http://product.dangdang.com/27919782.html
3.企业级业务架构设计:方法论与实践(豆瓣)这是一部从方法论和工程实践双维度阐述企业级业务架构设计的著作。 作者是一位资深的业务架构师,在金融行业工作超过19年,有丰富的大规模复杂金融系统业务架构设计和落地实施经验。本书在出版前邀请了微软、亚马逊、阿里、百度、网易、Dell、Thoughtworks、58、转转等10余家企业的13位在行业内久负盛名的资深架构师和技术https://book.douban.com/subject/34801161/
4.企业级业务架构设计:方法论与实践2024pdfepubmobi电子书从事金融业务期间,多次作为核心业务人员参加业务系统开发工作,并就此转入技术开发部门,多年专职从事企业级业务架构设计。 工作期间,认真钻研软件过程、系统设计与分析、架构设计方面的理论知识,将其与实践相结合,不断融合设计思路,逐渐超脱原有工作经历和指导理论的限制,形成对企业级业务架构设计一般方法的认知。 https://onlinetoolsland.com/books/34801161
5.《企业级业务架构设计方法论与实践》144页《企业级业务架构设计:方法论与实践》、《银行数字化转 型》、《聚合架构:面向数字生态的构件化企业架构》 职业经历: 曾就职于IBM副合伙人,全球企业咨询服务部大中华区金融核 心锐变团队业务发展和交付总监。后就职建信金融科技有限责 任公司,参与了建行多个系统的业务架构设计,形成了一套方 https://www.modb.pro/doc/56933
6.业务架构设计(六)业务组件金融IT那些事儿付晓岩老师在《企业级业务架构设计》中介绍的业务组件,虽然名称和IBM CBM方法中的业务组件名称一样,但实质却有若干不同。 一是颗粒度和层次不同。在CBM方法中业务组件是业务能力的封装,CBM表达的是企业的业务能力模型,其业务组件的颗粒度较粗,一个业务组件包含一系列业务活动,对应的是部门级组织。而在付氏业务架构https://www.shangyexinzhi.com/article/4627823.html
7.企业业务架构企业业务架构设计.pdf“数字化转型的必经之路是架构设计,企业级架构设计方法论中Togaf首屈一指。理论性较强的架构体系总给人一种术高莫用之感,付晓岩老师的《企业级业务架构设计:方法论与实践》将Togaf之中的阶段B业务架构显化,详细说明了如何使用价值链进行业务架构设计。 其章节共分为四部分:第一部分介绍了企业架构及业务架构、第二部https://blog.51cto.com/u_16213659/7594659
8.企业级业务架构设计:方法论与实践pdf下载JAVA企业级业务架构设计:方法论与实践_付晓岩 PDF https://bbs.pinggu.org/thread-10873819-1-1.html
9.数字化转型企业架构设计手册.pptx(ABB)功能项功能子项业务域一级业务分类二级业务分类业务能力业务步骤属性逻辑实体数据主题概念实体数据域技术架构技术服务技术分类技术组件企业级价值流专业级流程操作级流程业务服务业务对象/BI业务规则组织单元岗位角色度量指标用户应用服务应用架构数据架构业务架构业务设计战略意图关键举措变革项目变革点战略中心一级服务分类https://www.renrendoc.com/paper/332200425.html
10.公司的组织架构如何设计(企业架构设计图)一恒网销学业务架构设计 业务架构设计既可以对单一业务领域,也可以对企业级业务领域,前者设计效果大不如后者。设计过程一般是迭代式的,设计-实现两个阶段不断的交替螺旋上升。这就要求我们要不断的审视和具有迭代思维。 在设计上,我们要抛弃以前的“业务主导技术”,业务提需求,技术实现的思维弊端,而应当时刻保持“技术引领业务”https://www.yiheng8.com/163047.html
11.业务中台建设方法及步骤第一步是业务调研和抽象,并划分领域(主题域)。 第二步是企业级架构设计,包括业务中心划分和应用架构、技术架构设计、数据流向等。 第三步是1级架构设计,包括产品设计、组件建模、系统设计。 第四步是分步实施中台。 第五步是持续进行中台运营,包括业务运营、内容运营、技术运营和数据运营等。 http://www.360doc.com/content/23/0205/14/16205163_1066296888.shtml
12.梅赛德斯奔驰的企业级架构逻辑和实践:始终与业务目标对齐IT 作为职能部门在传统制造企业扮演更多的是业务支撑作用,企业架构师更多关注在传统应用架构体系下的管理工作。然而随着企业数字化转型的需求,企业级架构治理和管理工作也面临着不断改造升级的需要。如何解决现有架构痛点,配合公司级数字化转型战略,赋能业务实现转型诉求成为企业架构师所要承担的重要使命。 https://www.infoq.cn/article/wREDVO1xPhTSEKcU81f3
13.业务建模驱动的企业架构转型解决方案典型案例 某国有大型商业银行通过两个试点领域的全量业务建模及IT实施 查看详情 某省农信银行通过轻量级业务建模为分布式核心系统提供需求及设计输入 查看详情 联系中电金信,定制您的专属方案 专家咨询 行业解决方案 银行 保险 证券 其他金融机构 能源与制造 其他 热门方案及产品 源启金融级数字底座 云原生分布式https://www.gientech.com/product/New-Enterprise-Architecture.html
14.中国银行企业级技术平台成功投产二是架构管控更有力。强化管控的“四梁八柱”:有效承接业务架构、覆盖全生命周期,构建标准化“流水线”;建立长效架构管控机制,嵌入实施各环节,注入架构设计“保鲜剂”;统一框架体系,规范化管理集团IT技术标准,形成企业级技术规范“度量衡”;自主研发IT资产管理工具,实现资源共享复用、资产价值充分挖掘,绘制IT资产“全景https://wap.boc.cn/bif/bi1/202112/t20211229_20519303.html
15.银行企业级业务模型建设随着业务的发展和信息化的深入,如何设计满足业务动态变化和流程银行的信息系统架构,已成为银行下一步信息化建设的重要课题。银行信息化的重点从单一业务系统建设和改造,向针对大数据量、高并发访问的企业级架构设计转变。“新一代”摒弃以往基于部门级需求的分析、设计模式,从业务架构及IT架构两大方向入手,建立起统一、https://maimai.cn/article/detail?fid=1790003705&efid=fubP6DcTGT3WaW7nUz_uUg
16.48套Java架构师/高并发/微服务/分布式/源码分析/设计模式/业务Es搜索项目,支付项目,外卖项目,防抖音短频项目,云尚办公系统,租房网项目,交友项目,房产项目,人力资源管理系统,餐掌柜项目,基础框架,源码分析,设计模式,数据结构,数据库,业务选型,中间件,并发编程,高并发,分布式,微服务,性能优化,分库分表,日志开发,需求分析,需求设计,项目部署,云原生,企业架构,架构设计,高级架构等https://www.soft1188.com/javajg/6787.html
17.建设银行“智慧银行”:引领传统网点智慧转型1.构建企业级业务架构,做好顶层设计,解决“竖井式”的业务现状 “智慧银行”项目首先从业务视角上建立了企业级的物理渠道服务业务架构。通过企业级建模的方法,对物理渠道的子渠道进行定义,明确每个子渠道的服务流程、产品布放标准、客户体验标准,用基于标准化、结构化的方法描述银行业务流程、数据与产品全貌,统一渠道用http://www.winwings.cn/display/239701.html