去哪儿网架构演进之路:微服务的尽头原来是DDD……业务架构的演变路径,侧面展现所在互联网企业的演变路径。每一种架构无关好

业务架构的演变路径,侧面展现所在互联网企业的演变路径。每一种架构无关好坏,选择与否,只取决于是否适合当下及可预见的未来。

从业务出发、面向业务变化是架构设计成功的关键,指导业务架构设计的维度包括:

传统行业的业务相对稳定和成熟,非必要情况下建议做成单一服务。如需拆分,建议将变化频繁与不频繁的业务拆分。

互联网行业则分为初创公司与成熟稳定的公司:

目前旅游行业已相对稳定,去哪儿网比较符合以上第二种情况,可以考虑将先前拆分粒度太细的微服务进行合并。这也是去哪儿网的架构演进原因之一,原有业务拆分太细,达到人均10个应用,维护成本极高。

为快速适应业务变化,需识别业务核心问题,划清业务边界,达到业务组件的复用最大化;区别出变与不变的业务,将变化隔离在一定范围内,进而减少变化。

面向业务变化与不变的情况下,组件颗粒度要拆分到什么程度?

组件拆分粒度过细时,可复用性强,但组装麻烦;拆分粒度过大时,好用,但使用场景比较少。

测试是保证系统质量的重要途径,使用TDD验证架构是否合理、是否可以隔离、测试性好不好。

在运行期和开发期,软件质量属性体现为可用性、可修改性、性能、安全性、易用性等。以功能性为主进行架构设计,以质量属性为依据进行增量式迭代重构和优化。

上图是架构的一些关键技术,这张图的粒度较粗。从下往上看,公司底层基本都由容器与自动化支撑,上层是监控和治理、前后端分离的系统。基于此图,DDD是整个架构的指导思想。

上列四张图简单展示了去哪儿网本次重构的主题,也是酒店基础信息部所负责的业务。

业务层最重要的内容是酒店聚合,包括代理商酒店Tree和Q物理酒店。我们将各个代理商提供的酒店信息,按照一定业务逻辑规则,聚合到去哪儿网的Q侧物理酒店,将此部分信息对外售卖,从而提升用户体验。

为什么能够提升用户体验?

举个例子,比如现在投放的是季枫酒店,A代理商将其称为季枫酒店北京店,B代理商将其称为季枫酒店北京中关村店,C代理商称之为季枫酒店北京中关村苏州街店,用户容易混淆。所以去哪儿网将各个代理商提供的酒店信息,按照一定的业务逻辑、规则聚合为外网能够看到的、唯一的物理酒店。

酒店Tree的含义是,每个代理商投放的酒店,映射到去哪儿网的酒店,以去哪儿网的酒店为树根,下方挂靠不同代理商投放的酒店信息,形成对应关系。

当前我们团队的核心业务是,将基于业务层的酒店信息,提供给应用层,比如提供APP搜索或筛选下展示的信息。

旅游行业应该是受疫情影响最大的行业之一,在此背景下,技术中心在2022年提出“巩固效率之本,分担产品之忧”的战略,自此开启DDD重构之路。

如上图,重构前,业务和业务架构存在以下问题:

没有最好的架构,只有最合适的架构。以下是备选的系统重构模式:

前文讲解了架构的演变路径、理念及改造模式的选择,最终衍生出来的系统重构框架是什么样子?

从业务出发、面向业务变化是我们现代架构设计成功的关键,DDD的设计思想完全符合成功架构设计的理念。

站在EA(企业架构)角度(包括业务架构BA、应用架构AA、数据架构DA、技术架构TA),DDD可以绑定业务架构和应用架构,将问题域与应用架构相剥离;通过DDD将业务架构的“价值流+业务能力”进行解构化分解,能力下沉。同时依据DDD划分的限界上下文、聚合,进行应用架构的搭建,实现自下而上的“高内聚、低耦合”的应用。

DDD的核心思想有哪些:

总之,自上而下地拆解业务,并以此为指导,自下而上地构建模型,最终达到高内聚低耦合的状态。

我们选择绞杀模式和演进模式,进行系统重构。由于系统复杂程度高、了解业务细节的同学少,为了减少重构对现有业务的影响,我们将核心资源投入到核心业务中,快速上线以便查看效果,下文将具体介绍演进实践。

上图是以业务驱动的微服务架构演进的实战过程,介绍DDD的完整流程和关键路径。进行领域驱动设计时,需要对组内成员进行定位。最重要的是识别领域专家,即哪些人对该领域认知深刻,能够帮助成员深入理解业务,有利于后续脑暴和建模过程顺利进行;其次是识别技术专家和开发团队。

领域驱动设计的关键路径如下:

第一步,领域专家和开发团队就具体问题,明确业务愿景,讨论需求,从而建立统一语言,形成领域知识。统一语言,即对问题域内的概念统一认知,比如大家明确某个词语的定义且没有歧义,大大降低交流成本。

第二步,分析问题域并划分子域(比如核心子域、支撑子域、通用子域),进而划分限界上下文,构建上下文地图。

上图展示了基于DDD落地实践的过程。首先是定位愿景,其重要性在于决定了后续的发展道路;其次,分析问题域中现有业务场景;然后基于划分的子域,识别限界上下文;最后在限界内进行领域建模、实现模型。

麦肯锡提出“电梯演讲”概念是指,在乘坐电梯的30秒之内,向顾客清晰准确地解释解决方案,即使用简短的语言精准说明业务价值。比如,去哪儿网的核心价值是“总有你要的低价”。因此,所有的核心工作都要围绕低价展开,落实到基础信息团队,我们的愿景就是提供多样的信息聚合。

由于产品迭代频繁,系统演进缺少领域专家,所以按照产品、QA、技术人员的顺位确定领域专家。

事件风暴的输出,将作为后续领域建模的输入,需要遵循以下原则:

没有DDD经验的同学可能会问,什么可以作为统一语言?

答案是,什么都可以作为团队的统一语言。比如,一个老系统的内部逻辑特别复杂难懂,这部分代码的重构代价大,难以改动,就可以作为团队内部的统一语言。由此,产品和技术同学都知道老系统的目标、能力及应对态度。

技术同学表达事情的思维,偏向代码逻辑,导致和产品同学沟通存在偏差。此时,统一语言可以拉齐双方认知,技术同学只要抛出几个领域名词,产品同学即可理解。

需要注意的是,统一语言的术语表应具备中英文对照,便于后期编解码时,在代码层面达成认知统一。

识别限界上下文的总体原则是先业务后技术,上图展示了领域层面的划分流程。

限界上下文的特征:

绘制上下文依赖地图时,谨记三不原则:不要双向依赖、不要循环依赖、不要过长依赖。

如上右图所示,我们在制作上下文依赖地图时发现,酒店解析依赖酒店抓取,酒店抓取依赖酒店聚合信息,酒店聚合信息依赖静态信息,静态信息依赖酒店解析出来的数据,形成循环,所以划分方式不合适。基于这种情况,创造出“酒店上下文”环节,打破循环依赖。

依据事件风暴和限界上下文的输出,可以构建领域模型。

建模过程中最难把握的是尺度,哪些方法应该加入模型,属性应该放在哪个模型。个人建议是共识即正确,无论是否正确,组内达成共识,这个决策在当下就是正确的。因为建模是循环提炼的过程,随着后续深化业务理解,推翻之前结论、一次性创建完美模型的难度较大。

分层架构中具有领域层和业务层,如果将功能和用例盲目加入领域层,领域层膨胀会影响复用性和业务表达力。所以,要承认模型和领域能力的不确定性,循序渐进地使用迭代方式,将能力下沉到领域模型中。

上图展示了两个原则:共性的业务能力优先下沉到领域,共性的技术问题抽象成业务。

没有完美的模型,也没有正确的模型,领域模型共识即正确,所以团队的综合能力决定了模型完美程度的上限。提供一个可参考的检验技巧,建完模型后,可以用业务场景检验模型的完整度。随之循环往复,模型也会越发完善。

如上所示,业务边界、康威定律、业务变更频率、弹性边界、技术选型等,都可作为划分依据。

需要注意的是,一个微服务可包含多个限界上下文,但只能包含一种子域类型(核心、通用、支撑),不能将一个核心域和一个支撑域放在同一微服务中。如果支撑域可用性不好,影响核心逻辑,就可能为这个不太重要的问题付出沉重代价。

如上所示,业务流程或业务用例被分为不同阶段,每个阶段又被分为不同活动,我们将这些业务活动与整个分层架构联系起来,构建映射关系。

构建映射关系的好处是,在分层架构和领域模型高度内聚、完善的情况下,方便后续需求接入和扩展。自上而下分解业务流程,分层映射,隔离技术负责度。

如上图,应用层、领域层、基础设施层是聚合领域对象,模型映射代码清单划分了每一层具备能力、领域层的领域对象、是否具有前置依赖对象,包名、类名及方法名,这些内容与上文提到的中英文对照表一一对应。

构建这份代码清单,便于达成组内多人合作,提高开发效率;为新人熟悉项目时提供参考,快速说明项目的核心逻辑与能力。

在代码开发阶段,我们选择了开源框架COLA,其分层架构分为适配层、领域层、应用层、基础设施层。

无论是COLA还是DDD的分层架构,都以业务为核心,基于稳定的领域模型,对外提供领域能力。

选择COLA的原因如下:

下图是我们内部基于COLA架构落地微服务的实践。

上图是对前一张图的具体描述,我们使用的是CQRS模式,即命令查询职责分离。

前文的一张图描述了架构重构前的状况:核心业务渗透到各个服务中,没有做收拢聚合,业务耦合。而通过限界划分、领域建模,即可实行分离。

基础设施层实现了依赖倒置,即基础设施层依赖领域层,由此无需关心领域层使用ES还是Redis进行存储,可专注于领域能力。

重构前,没有提供实时查询的能力,各个团队将数据拉走,进行本地缓存。重构后,基于异步调用机制,实现数据持久化,对外提供查询。

上图是领域模型与代码模型的映射。分层对应上一张图展现的架构,在Domain层,按照领域划分进行聚合分包。上图标蓝的Hoteltree就是前文提到的酒店聚合,在这一领域内进行功能划分。

DomainPrimitive是ValueObject的进阶版,在原始VO的基础上要求每个DP拥有概念的整体,而不仅仅是值对象。在VO的Immutable基础上增加了Validity和行为。

DP特征:

业务架构是领域,技术架构是容器,脱离灵魂的容器是没有技术意义的。

Q1:DDD重构时,如何协调产品上线需求的矛盾?

A1:首先,我们进行DDD重构的时候,背靠公司技术中心的战略,公司是鼓励和倡导的;其次,重构模式包括修缮者、绞杀者、演进式。面临与产品上线需求的矛盾时,我们可以选择绞杀者,另起炉灶来优化重构,在原有业务中也不影响产品新需求接入。

Q2:选择COLA架构作为DDD重构业务模型的原因是什么?

A2:首先,COLA是阿里开源的,大厂背书,信任度较高;其次,COLA具备很好的分层架构和规范,项目Github中提供了最佳实践。如果初期不清楚如何进行重构,可以直接参考官方demo,将其映射到自己的业务中,后期再加入自身见解,进行系统优化。

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