可复用架构是进行架构设计非常重要的思维之一,是面向对象架构设计的核心思想。复用可以让我们站在巨人的肩膀上,基于已有的成果,快速构建一个新系统。我们可以通过中台和DDD(领域驱动设计)等方法构建企业级和业务领域的服务,虽然能很好地划分了中台和面向业务领域的服务,但是在一些业务流程比较复杂的业务,我们还是要花费大量的成本去组合和编排不同项目的业务流程来实现最终的业务价值。那么有没有很好的方法来快速构建业务流程并实现业务价值呢?
答案是有的。本文会从软件架构的复用层次、业务流程复用、业务流程建模和实现来揭晓答案。
我们常说代码复用,组件复用,领域模型复用等,那么可复用的软件架构有哪些复用层次呢?
首先是代码级复用,其中包括自己或他人的类库,三方的 SDK,其他算法封装等。我们的代码可以直接调用它们,也和我们的应用打包在一起,运行在同一个进程里。代码级复用是最低层次的复用,我们可以把它当作你自己源代码的一部分。
往上就是技术组件复用。这些组件我们自己可以封装的,更多的是大量开源的中间件,比如 Redis、Rocket MQ、Dubbo 等;组件也包括各种开发框架如 Spring boot。这些基础组件技术复杂度很高,它们的存在,极大地简化了我们的开发工作。
代码级复用和技术组件复用都属于工具层面,在不同的业务下都可以用,但和业务场景隔得有点远,不直接对应业务功能,复用度较高。

1.2 业务复用
软件最终是为业务而服务的,如果能够直接实现的业务复用,那项目实施的效率就越高。在一家企业有不同业务能力的复用,比如微服务强调单个业务实体的封装和复用,而中台进一步实现了企业级业务能力的复用。
所以接下来,我们就从比较简单的业务实体复用开始说起。业务实体在DDD中叫做领域模型,它的复用针对细分的业务领域,比如订单、商品、用户等领域。它对各个业务领域的数据和业务规则进行封装,将它变成上层应用系统可以直接使用的业务组件。
业务流程的复用针对的是业务场景,它可以把多个业务实体和不同业务领域服务、中台和基础平台等系统组合和编排起来,完成一个端到端的业务流程。比如说,下单流程需要访问会员、商品、订单、库存等多个业务,如果我们把这些调用逻辑封装为一个下单流程服务,那下单页面就可以调用这个流程服务来完成下单,而不需要去深入了解下单的具体过程。相比单个的业务实体复用,业务流程的复用程度更高,业务价值也更大。
最高层次的复用是对整个系统的复用,比如说一个 SaaS 系统(Software-as-a-Service),它在内部做了各种通用化设计,允许我们通过各种参数配置,得到我们想要的功能;或者说一个 PaaS(Platform-as-a-Service)平台,它会提供可编程的插件化支持,允许我们“嵌入”外部代码,实现想要的功能。这种产品级的复用,它的复用程度无疑是最高的。在项目落地的时候,它无需核心的开发团队进行开发,只由外围的实施团队负责就可以了,这样,一个项目的上线就能简化为一次快速的实施,不但上线周期短,系统也更稳定。当然,实现这样的复用,难度也是很大的,你既要对所在行业的业务有很全面的理解,又要有很强的抽象设计能力。这类系统中,比较典型的有 Salesforce 的 CRM 系统和 SAP 的 ERP 系统。
综上所述,从技术复用到业务复用,越往上,由于业务多变性,复用度越低,但复用产生的价值也越大,但实现起来也越复杂,它能复用的场景就越有限。在实际工作中,技术层面上的复用相对比较简单,我们对这部分的认知也最多,有丰富的中间件可供我们选择,我们可以逐步构建适合自己的技术体系。
业务上的复用比纯粹的技术复用有更高的价值,我们需要往这个方向上努力。如果我们能进一步打造产品级和业务流程中间件,并在这个基础上,形成业务平台,这样,我们就能实现更高的业务级复用,可以更高效地支持系统的快速落地。
我们通常采用 DDD 的方法来找到对应的领域模型(业务实体),通过限界上下文指导微服务和中台的划分,在这里我们就不在赘述了。

上图是我们常见的进程间架构,业务实体(领域模型)主要是在中台或者领域服务层。我们构建产品级或者业务流程级别往往在前端和BFF或前台来进行。由于前端的相关展示等数据通常来自前台或BFF,此处我们就讨论在前台或BFF进行产品业务流程的设计。
此维度主要对企业的产品业务流程进行分层建模,分析企业如何通过一系列业务活动,按照相关的业务规则将输入转换成为有业务价值的输出,从而实现用户价值。
在我们很多软件开发项目中,中台和微服务划分并建设后,往往中台相对稳定,但是前端和前台或BFF的业务变化频率要高于中台,所以我们需要大量的成本进行产品业务流程的设计和实现。此处我们以电商场景为例,来看看如何做好产品流程复用并构建价值交付的高速路。
在电商场景中,购买不同品类的商品,业务流程也会有非常大的差异。例如:买卖实物商品的流程一般是:买家付款、卖家发货、买家确认收货;买卖酒店房间的流程一般是:买家付款、卖家预留客房、买家入驻、买家退房结单;买卖旅游线路的流程一般是:买家付款、卖家确认、服务履约。
这些业务场景、交易流程虽然有较大的的差异,但是他们可以共同复用核心的交易流程。我们可以采用 DDD 中的共享内核的模式进行流程建模,如下图活动中的主干交易所示。



来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70050081/viewspace-3117616/ ,如需转载,请注明出处,否则将追究法律责任。