文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

如何设计一个复杂的业务系统?从对领域设计、云原生、微服务、中台的理解开始

2024-12-02 05:26

关注

云原生满足非功能性质量需求

云原生在技术上能够最大程度的解决众多非功能性质量和技术需求(如上图),那作为一个企业级应用架构,自然会把专注点转移到业务应用功能性设计本身上来。现在来说对于一个复杂业务架构进行设计,我们要想做到又快又好,无非是两种情况:一是架构师本身对业务理解很深、能力超强、炉火纯青;二是原有的业务系统本身模型清晰,足够的“高内聚低耦合”,可以快速在其基础之上分析业务变化形成新的业务架构设计。我们应该追求的是第二种情况,这也就意味着从一开始的企业级模型建设,就要对模型设计、业务流程仔细对待,只有做到基础扎实,才能有后面的“快速迭代”。

我们再回到架构设计的本质,即为什么我们要在代码实现前做设计。设计首先是要解决问题的复杂度。于是有人做了一个架构,交给了一个团队去实现,很快发现实现的架构和设计完全是两回事。当然原因很明确——缺少了交流和沟通;其次是要建立团队协作沟通的共识。即使我们做好了一个团队都达成共识的架构设计,大家都兢兢业业把设计变成了现实,一个长期困扰软件行业的问题出现了,需求总是在变化,无论预先设计如何“精确”,总是发现下一个坑就在不远处,结果往往是情况越来越糟糕,也就是我们常说的架构“腐化”了,最后大家不得不接受重写。这些经历让我们逐步明确了软件架构设计的实质是通过核心问题的分离降低复杂度,并让系统能够更快地响应外界业务的变化,并且使得系统能够持续演进。在遇到变化时不需要从头开始,保证实现成本得到有效控制。

所以,我觉得从架构设计角度,以下三点是最为关键的:

上面的三点毫无疑问都指向了业务,从业务出发、面向业务变化是我们现代架构设计成功的关键,所以说复杂业务架构设计的核心实质是保证面对业务变化时我们能够有足够快的响应能力。

二、领域设计

前面说了业务软件开发的常见病:从一个小的项目不断开发演化变成一个大型业务系统,但随着新需求的不断增加,最终演变成了开发团队的噩梦。而这些噩梦大部分是源于软件的概念完整性(“概念完整性”一词来源于软件工程的经典著作《人月神话》)遭到了破坏。这些业务代码可能是一代又一代的开发人员各行其道的堆叠起来的(我们又称之为“屎山”),而这个过程中没人有意识的去维护软件的概念完整性。而 DDD 领域设计,特别是 DDD 提供的战略建模层面的概念,是维护软件概念完整性的良药。

“技术服务于业务、业务驱动技术”是目前大部分人的共识,尤其是对商业公司而言。而 DDD 领域设计主张在软件设计中把业务领域本身作为关注的焦点(换句话说就是软件开发人员要懂业务)非常符合这种思想;并且,DDD 提供了切实可行的面对复杂业务软件设计的解决方法,这也是我非常提倡作为一个架构师去深入学习和讨论 DDD 领域设计的相关知识。

1.战略建模

在战略层面,DDD 非常强调对业务问题的分析和分解,通过识别核心问题来降低问题的复杂度。DDD 在战略层面维护模型的概念完整性的方法,最重要的两个概念就是界限上下文(Bounded Context)和防腐层(Anti-Corruption Layer)。

关于界限上下文的定义,随便一本讲 DDD 的书上都会详细讲解,这里我只想分享一下自己的一些理解。这时,有人会问:界限上下文多大才能合适呢,划分上下文有没有可以遵循的规则呢?

划分上下文的规则,无非就是放之四海而皆准的“高内聚、低耦合”,这么说可能还是太虚。其实真正让大家感到纠结的是,不知如何切分的那些东西之间所存在的关联,有的甚至干脆都纳入到一个上下文里。其实,我认为与其关注上下文的“大小”,不如关注模型的“质量”,关注概念的完整性是不是容易被破坏。我觉得,判断大小是不是合适,要结合应用开发团队的能力,看开发团队能在多大的一个范围内掌控软件的概念完整性。只要是开发团队没有问题,这个范围就算再大也都是可以的。

如果开发团队的水平在业界属于上游,那么维护上下文的范围往往是很大的;一些公司开发团队的水平参差不齐,所以在项目的实施过程中,可能需要划分相对小的上下文,尽可能减少“屎山”的不断堆积。

界限上下文需要时刻保护好自己所维护的边界,以及边界内概念的完整性,这时需要将某个上下文的概念转化为另一个上下文概念的地方就叫做“防腐层”。防腐层的实现有很多种,典型的比如作为适配器 Adaptor 来实现,另外广义上讲,Gateway 也是一个典型性的防腐层组件,当然,防腐层的代码和其他内部业务模型之间要存在明显的物理边界(当然不一定说要把防腐层作为一个个独立部署的进程),至少我们可以考虑把防腐层作为一个独立的类库来进行构建和维护,阿里内部的比如星环、其实就是这个思路。

一个典型的防腐层的设计

2.战术建模

DDD 在战术上最核心的概念就是实体和聚合,为了更好的理解什么是聚合、聚合根、聚合内部实体,下面举例说明一下。想象一下一个电商系统的订单相关的模型,我们可能会得到订单 Order、订单头 OrderHeader、订单行项 OrderItem 三个相互关联的概念:

“聚合是数据修改的单元”,基于这个原则,我们可以做到“聚合内强一致、聚合外最终一致”,比如,我们可以不能接受一个订单内的所有订单项的金额之和不等于订单头的总金额,我们就必须把订单头和订单行项这两个实体划分到同一个聚合内。

我们不妨先看一下《实现领域驱动设计》一书中对聚合设计原则的描述,原文是有点不太好理解的,我来稍微解释一下:

上面的这些原则是 DDD 的一些通用的设计原则,还是那句话:“适合自己的才是最好的。”在系统设计过程时,你一定要考虑项目的具体情况,如果面临使用的便利性、高性能要求、技术能力缺失和全局事务管理等影响因素,这些原则也并不是不能突破的,总之一切以解决实际问题为出发点。

DDD 领域建模通常采用类似事件风暴,一般通过用例分析、场景分析和用户旅程分析等方法,通过头脑风暴列出所有可能的业务行为和事件,然后找出产生这些行为的领域对象,并梳理领域对象之间的关系,找出聚合根,找出与聚合根业务紧密关联的实体和值对象,再将聚合根、实体和值对象组合,构建聚合。

电商系统大家都比较熟悉了,而且关于电商业务来说有许多比较成熟的模型可以直接借鉴;那下面我们以另外一个场景-保险投保业务为例,看一下聚合的构建过程主要都包括哪些步骤,当然这个例子我是从其他的学习资料里看到的,比较典型,可以当作示例来进行说明:

保险投保业务简单示例(From 学习资料)

那以上就是一个聚合诞生的完整过程了。

三、不同场景下的领域建模策略

由于企业内情况千差万别,发展历程也不一样,有遗留单体系统的微服务改造,也有全新未知领域的业务建模和系统设计,还有遗留系统局部优化的情况。不同场景下,领域建模的策略也会有差异。下面我们就分几类场景来看看如何进行领域建模。

1.新建系统

新建系统对于复杂的业务领域,领域可能需要多级拆分后才能开始领域建模。领域拆分为子域,甚至子域还需要进一步拆分。比如:保险它需要拆分为承保、理赔、收付费和再保等子域,承保子域再拆分为投保、保单管理等子子域。复杂领域如果不做进一步细分,由于问题域太大,领域建模的工程量会非常浩大。你不太容易通过事件风暴,完成一个很大的领域建模,即使勉强完成,效果也不一定好。

对于复杂领域,我们可以分三步来完成领域建模和微服务设计。

2.单体遗留系统

如果我们面对的是一个单体遗留系统,只需要将部分功能独立为微服务,而其余仍为单体,整体保持不变,比如将面临性能瓶颈的模块拆分为微服务。我们只需要将这一特定功能,理解为一个简单子领域,参考简单领域建模的方式就可以了。在微服务设计中,我们还要考虑新老系统之间服务和业务的兼容,必要时可引入防腐层。

四、云原生时代下的挑战

随着云原生技术的兴起,现在企业级架构就更加的云化,而云化的架构风格有了新的关注点:弹性边界。弹性边界是一个云原生企业级应用架构的核心概念,它指把弹性作为最优先的考虑要素而划定的系统边界,决定了我们是否能够充分发挥云原生平台的全部能力。于是我们就需要新的方法来弥补以前业务模型的不足,以满足新的云原生化的需要。现在可以说,微服务基本上就是以云原生架构作为基础,而在固定弹性的平台上使用微服务架构,有极高的实施成本。可以说,云原生实际上就应该是微服务的前置条件。

在云原生时代,我们需要将弹性作为首要考虑的因素,纳入建模的考量。那么弹性边界,就是我们划分系统的重要依据。而且,我们还需要考虑弹性边界间的依赖关系,尽量避免弹性耦合。对于业务建模来说,为了配合云原生时代的架构,我觉得要做到如下几点:

五、不要忽视组织结构的影响

“康威定律”告诉我们,组织结构会决定团队沟通的结构,也会决定产品的结构。对组织结构的梳理,在需求调研的时候会经常做。如果是信息收集而言,业务架构设计在这里并没有什么特殊之处。区别在于,业务架构的目标是企业级的能力规划,希望能够突破壁垒、形成合力。正是这个原因,组织结构对业务架构设计的反作用力也是很大的,企业级数字化转型方案要与组织结构相匹配,否则落地的时候会困难重重。可以说,部门利益是做企业级架构的最大障碍之一,跨越这个障碍也是对架构师的能力的要求之一。当然,有些情况下,没有更好的解决方案时,不动也是一种选择。

以我的经验,这种问题没有特别好的办法,无非是两种:一是有超强能力者主导,在最高层的支持下,强力推进这种决策,但是企业越大,尤其是以业务为主导地位的企业中,这种结构就愈难形成;二是加强企业内部的业务架构人员的能力和数量(最好各个部门都有类似的角色),让这些企业机构人员以合作伙伴的方式全程参与到项目中,在项目的实施过程中搭建起协作网络,提升决策效率,才能使组织结构不再是企业数字化转型的瓶颈。

六、SOA-微服务-中台:妥协的艺术

多年前,这些传统的大型 ERP 业务软件,其实都是在一个很大的范围内维护业务概念的完整性。一个 ERP 安装完毕后,数据库有七八百张表(也就是七八百个实体)处于同一个界限上下文之内。但是这些 ERP 在这样一个巨大的界限上下文内仍然很好的维护了业务概念的完整性,实在令人敬佩。

然而实现它非常困难,但是破坏它却非常容易。一套 ERP 定制项目实施下来,数据库里可能又多了几百张表,更不用说不规范的命名看起来千奇百怪。这些厂商的 ERP 实施顾问和开发人员,夜以继日的维护这个庞大的“屎山”。我们不能让这些庞大的“单体应用”无限制的增长,于是我们又一次祭起了“分而治之”的大旗。想 SOA 这样的软件组件化技术给我们提供了拆分的工具。我们把一个大的界限上下文按照利于拆分成几个相对来说小一些的界限上下文;在物理上,我们把一个大的单体应用拆分成若干服务。

一般来说,我们会让服务的物理边界和界限上下文的领域边界基本堆砌,一个界限上下文对一个或多个可以独立部署的服务应用,服务应用包含了界限上下文的核心业务逻辑的实现。SOA 的服务组件的物理边界给服务间的调用增加了一些困难,这就使得开发人员简化对象之间的关系,编写更加“高内聚、低耦合”的代码。当服务组件不多的时候,构建防腐层的工作量也不会很大,我们只要处理好组件之间的代码即成就好了。

但是,我们的架构师和开发人员太喜欢“分而治之”了,微服务的广泛使用甚至说是滥用,让我们看很多微服务真的是很“微”,几乎是一个 DDD 的聚合就可以对应一个可以独立部署的微服务。这样的微服务单单靠本身做不了太多的业务,这就需要更多更多的微服务“聚合”起来一起才能对外提供业务服务。

当然,微服务技术基础设施的发展也为服务之间的调用提供了更多的便利,跨越微服务的边界成为了常态;这个时候,业务开发人员区分“同一个上下文内的服务调用”和“上下文之间的防腐层”就要时刻保持头脑清醒,这时候的界限上下文和微服务的物理边界往往很难对齐,这就必然增加了维护每个界限上下文概念完整性的难度。

既然维护一个个“微小”的独立的界限上下文概念完整性越来愈难,那么我们干脆将它们再聚合起来吧?将它们融合到一个大小适度的界限上下文,那这就是所谓的企业级业务架构,也就是我们现在说的业务中台,最终目的可以说想要获得“企业级”的大和谐。

所以在一定程度上讲,软件工程就是妥协的艺术,是“中庸之道”。我们要不要中台,要大的中台,不管企业的大小,都应该结合自身的业务目标以及拥有的资源,在“维护更大范围的概念完整性”和“维护更多的防腐层代码”之间做出平衡,那这也是一个企业级架构师所要做的最核心的事情之一。

我们团队这些年确实做了一些“业务中台方法论”的积累和实践,并且在一些项目中做了实践,当然其中最灵魂的部分之一还是前面说的领域设计。以前很多人说 DDD 领域设计乃至业务中台方法论最难的就是没有一个合适的工具或者平台来实践,今天其实阿里开源的 COLA 以及内部使用的星环、BizWorks 都是很好的工具和平台。

七、结语

企业级应用架构是在不断的演进和迭代,但是我始终感觉企业应用架构的形成过程是在一种看起来科学的方法论下,但是又不完全科学的过程中实现的。仔细想一下,做软件架构的其实很羡慕做建筑架构的,因为建筑架构有严谨的力学基础作为基座,有很多可以精确计算的东西,而软件架构却没有多少可以精确计算出来的成分,所以,前面说的“不断的妥协”不失是一种可行的设计思路和设计艺术;其实这也应验了那句“没有银弹”。

由于时间仓促,有些内容简单带过,有些本应该结合实例来说明的地方在本文中也简略而过,后面有时间的话我会结合更多的实际案例来对本文说的观点进行补充。也希望本文能够激发大家一起对目前云原生时代的企业级应用架构设计的思考和讨论,相互学习,共同进步。

来源:阿里巴巴中间件内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯