注册
登录
大家好,我是汤师爷~
应用架构设计通常包括以下步骤:

本文主要分享一下应用服务、应用结构设计设计。
应用服务是对一个或一组密切相关的业务对象及其操作的封装。
应用服务应明确定义其责任范围,将相关业务功能和对象组合在一起,避免暴露内部细节。它需要整合因同一原因变化的功能和数据,同时分离因不同原因变化的部分。这种设计方法确保了服务的内聚性和灵活性。
应用服务的概念源于SOA和微服务架构的兴起,通过将系统功能拆分为多个独立的服务,可以提高系统的可维护性、可扩展性和灵活性。
应用服务在应用架构中起着至关重要的作用,它将系统的核心功能”打包“,并提供给外部的业务流程使用,可以视为SaaS系统对外的“门面”。
用户或其他系统通过调用应用服务来实现特定的业务功能。那么,如何设计应用服务呢?
1、对齐业务能力,设计颗粒度适中的服务,职责单一,避免跨服务调用。
在设计应用服务的粒度时,可以参考领域驱动设计(DDD)中的"限界上下文"概念。业务对象类似于限界上下文中的聚合根,是应用服务的核心。
通常情况下,每个业务能力都对应一到多个独立的应用服务,同时每个应用服务也支持特定的业务能力。如图所示。
如果一个应用服务支撑了过多的业务能力,需要评估其内部是否关联了过多的业务对象。在这种情况下,可以考虑对多个业务对象进行分组,从而将该应用服务拆分为多个更小、更专注的服务。

2、围绕业务对象,提供具体的业务功能,具有明确的业务含义,不能包含不相关的功能。
从外部视角看来,应用服务通常是带有明确的业务含义,一般围绕某一个或一组密切相关的业务对象业务对象操作,不应该包含不相关的业务功能。
例如,”商城交易服务”专注于订单确认、下单和支付等功能,不应处理用户认证、商品推荐等其他业务。
3、服务可注册、可监控、可度量
应用服务的公共 API 应注册到 API 管理平台,形成一份服务列表,供消费者订阅调用。
应用服务对外提供服务时候,应能监控其运行状态,并支持启停操作。同时,服务应可度量,包括订阅数量、调用次数、响应时间等指标。
面向服务的架构最大的价值就在于它的敏捷性和灵活性。
敏捷性体现在服务可以快速调整,独立演化。
灵活性则体现在每个服务都有清晰的业务边界,功能内聚性强,能够单独管理生命周期。具体来说:

如图所示,订单履约能力是零售企业业务能力地图中的 L2 业务能力。订单履约能力可以细分为多个末级业务能力:ToC 履约服务、订单派单、订单管理、拣货管理、发货管理和履约逆向。
基于这些末级业务能力,我们可以设计出相应的应用服务。
应用结构描述了应用服务内部的层次结构和组织关系,它决定了系统的模块化程度,以及后续的开发和维护难度。
在应用结构设计中,我们通常会把系统抽象为不同的层次。比如,将系统划分为系统级、应用级、模块级和代码级。
这种抽象级别的划分帮助我们在不同层面处理复杂性,确保系统结构清晰且易于维护。如图所示:

抽象级别的存在,主要是为了帮助我们更好地管理系统的复杂性。
1、分解复杂度
如果将所有的细节混杂在一起,整个系统将变得难以理解、维护和扩展。通过设置不同的抽象级别,我们可以将系统的复杂性分解到各个层次,每个层次只需关注特定的功能和职责。
这种分层处理方式使开发人员在专注于系统某一部分时,无需过多关注其他部分的细节,从而大大简化了系统的设计和开发过程。
2、团队协作边界清晰
在大型项目中,通常会有多个团队并行开发。如果系统没有明确的边界,各团队之间很容易产生冲突和重复劳动。
通过清晰的抽象级别划分,不同团队可以专注于系统的不同层次或模块,互不干扰。
3、扩展性强
随着业务需求的变化,系统往往需要不断地扩展和升级。如果系统的架构设计没有合理的抽象级别,扩展和升级就会变得异常困难,甚至可能引发系统的全面重构。
而在有抽象级别的系统中,变更往往只需要聚焦在特定的层次上进行,而不会影响整个系统。例如,一次业务改造只影响模块级别,我们可以在不改变系统整体架构的情况下,替换或新增某个模块,以满足新的业务需求。
在前文中,我们提到应用服务的设计方法,那么应用服务如何通过一步步转化为代码结构呢?
应用服务会由一系列的应用结构来实现。如图所示。

基于应用服务的划分方案,我们可以进一步细化应用结构,以便更好地组织和管理系统功能。
这个过程涉及多个层次的设计方法:
在上述设计方法中,一个应用服务可以单独部署,也可以多个应用服务组合在一起部署。
那应用单元有哪些划分的具体原则呢?应用的划分原则可以参考以下:
1、业务划分原则
最关键的是参考应用服务的划分边界。如果需要提高应用的粒度,可以参考业务域和业务子域的划分。
将相同业务变更因素的功能和数据整合,提升系统内聚性。同时,把不同业务变更因素的功能和数据分开,减少系统耦合度。
2、技术划分原则
在业务初期,尽量从单体应用开始,避免过早划分应用单元,以减少分布式数据库事务和数据不一致的问题。
应用单元内部可进一步分层,避免应用间出现循环依赖或双向依赖,始终保持不同层级间的单向依赖,高层级可以依赖低层级,同层级间不应互相依赖。
仅当真正遇到技术痛点时,例如规模、性能、安全等问题,才考虑拆分应用。如果不拆分会严重影响业务稳定性,则应进行拆分。不要为了拆分而拆分,因为每次拆分都会增加系统复杂度。

如图所示,是订单履约的应用结构划分。
应用层定义软件的应用功能,它负责接收用户请求,协调领域层能力来执行任务,并将结果返回给用户,核心模块包括:
领域层是业务逻辑的核心,专注于表示业务概念、业务状态流转和业务规则,沉淀可复用的服务能力,模块包括:
订单履约系统与其他系统的依赖关系:
本文已收录于,我的技术网站:tangshiye.cn 里面有,算法Leetcode详解,面试八股文、BAT面试真题、简历模版、架构设计,等经验分享。