大家好,我是汤师爷~

应用架构设计通常包括以下步骤:

  • 根据业务架构,将业务需求转化为IT系统,识别核心应用服务。
  • 划分应用结构,设计应用结构与业务流程、数据之间的关系。
  • 设计应用结构之间的交互和集成关系。

本文主要分享一下应用服务、应用结构设计设计。

应用服务设计

应用服务的概念

应用服务是对一个或一组密切相关的业务对象及其操作的封装。

应用服务应明确定义其责任范围,将相关业务功能和对象组合在一起,避免暴露内部细节。它需要整合因同一原因变化的功能和数据,同时分离因不同原因变化的部分。这种设计方法确保了服务的内聚性和灵活性。

应用服务的概念源于SOA和微服务架构的兴起,通过将系统功能拆分为多个独立的服务,可以提高系统的可维护性、可扩展性和灵活性。

应用服务如何划分?

应用服务在应用架构中起着至关重要的作用,它将系统的核心功能”打包“,并提供给外部的业务流程使用,可以视为SaaS系统对外的“门面”。

用户或其他系统通过调用应用服务来实现特定的业务功能。那么,如何设计应用服务呢?

1、对齐业务能力,设计颗粒度适中的服务,职责单一,避免跨服务调用。

在设计应用服务的粒度时,可以参考领域驱动设计(DDD)中的"限界上下文"概念。业务对象类似于限界上下文中的聚合根,是应用服务的核心。

通常情况下,每个业务能力都对应一到多个独立的应用服务,同时每个应用服务也支持特定的业务能力。如图所示。

如果一个应用服务支撑了过多的业务能力,需要评估其内部是否关联了过多的业务对象。在这种情况下,可以考虑对多个业务对象进行分组,从而将该应用服务拆分为多个更小、更专注的服务。

2、围绕业务对象,提供具体的业务功能,具有明确的业务含义,不能包含不相关的功能。

从外部视角看来,应用服务通常是带有明确的业务含义,一般围绕某一个或一组密切相关的业务对象业务对象操作,不应该包含不相关的业务功能。

例如,”商城交易服务”专注于订单确认、下单和支付等功能,不应处理用户认证、商品推荐等其他业务。

3、服务可注册、可监控、可度量

应用服务的公共 API 应注册到 API 管理平台,形成一份服务列表,供消费者订阅调用。

应用服务对外提供服务时候,应能监控其运行状态,并支持启停操作。同时,服务应可度量,包括订阅数量、调用次数、响应时间等指标。

服务化架构的价值

面向服务的架构最大的价值就在于它的敏捷性和灵活性。

敏捷性体现在服务可以快速调整,独立演化。

灵活性则体现在每个服务都有清晰的业务边界,功能内聚性强,能够单独管理生命周期。具体来说:

  1. 轻量级应用:采用基于服务设计的轻应用,各个服务独立开发、部署和运营,可以独立交付,影响范围小,提升交付效率。
  2. 服务复用、灵活编排:通过服务的复用,柔性编排,可以快速响应业务的变化,支持复杂的业务流程。
  3. 局部扩展性高:系统被拆分为独立服务后,易于横向扩展,只需扩展必要的部分,成本更低,效果更好。

示例:订单履约能力的应用服务划分

如图所示,订单履约能力是零售企业业务能力地图中的 L2 业务能力。订单履约能力可以细分为多个末级业务能力:ToC 履约服务、订单派单、订单管理、拣货管理、发货管理和履约逆向。

基于这些末级业务能力,我们可以设计出相应的应用服务。

应用结构设计

应用结构描述了应用服务内部的层次结构和组织关系,它决定了系统的模块化程度,以及后续的开发和维护难度。

应用结构的抽象层次

在应用结构设计中,我们通常会把系统抽象为不同的层次。比如,将系统划分为系统级、应用级、模块级和代码级。

这种抽象级别的划分帮助我们在不同层面处理复杂性,确保系统结构清晰且易于维护。如图所示:

  • 系统级:关注的是各个系统的整体布局和治理方式,比如各个系统之间的关系,以及它们如何协同工作。
  • 应用级:聚焦于各个应用的整体架构,包括应用与其他应用的交互方式,以及各个应用在整个系统中的角色。
  • 模块级:对应用内部的进一步细化,它涉及到代码的模块化设计、数据和状态的管理等。通过合理的模块划分,可以提高代码的可维护性、可重用性,减少重复劳动。
  • 代码级:关注的是代码本身的结构和实现方式。这一层级的设计直接影响到代码的质量和实现细节。

抽象级别的存在,主要是为了帮助我们更好地管理系统的复杂性。

1、分解复杂度

如果将所有的细节混杂在一起,整个系统将变得难以理解、维护和扩展。通过设置不同的抽象级别,我们可以将系统的复杂性分解到各个层次,每个层次只需关注特定的功能和职责。

这种分层处理方式使开发人员在专注于系统某一部分时,无需过多关注其他部分的细节,从而大大简化了系统的设计和开发过程。

2、团队协作边界清晰

在大型项目中,通常会有多个团队并行开发。如果系统没有明确的边界,各团队之间很容易产生冲突和重复劳动。

通过清晰的抽象级别划分,不同团队可以专注于系统的不同层次或模块,互不干扰。

3、扩展性强

随着业务需求的变化,系统往往需要不断地扩展和升级。如果系统的架构设计没有合理的抽象级别,扩展和升级就会变得异常困难,甚至可能引发系统的全面重构。

而在有抽象级别的系统中,变更往往只需要聚焦在特定的层次上进行,而不会影响整个系统。例如,一次业务改造只影响模块级别,我们可以在不改变系统整体架构的情况下,替换或新增某个模块,以满足新的业务需求。

应用结构如何划分?

在前文中,我们提到应用服务的设计方法,那么应用服务如何通过一步步转化为代码结构呢?

应用服务会由一系列的应用结构来实现。如图所示。

基于应用服务的划分方案,我们可以进一步细化应用结构,以便更好地组织和管理系统功能。

这个过程涉及多个层次的设计方法:

  • 系统和子系统的划分应与业务域和业务子域的粒度保持一致。这有助于我们更好地将业务需求映射到技术实现。
  • 一个或多个相关的应用服务可组合成一个可独立部署的应用单元。
  • 应用单元内部可进一步分层。例如,参考领域驱动设计(DDD)的分层方法,可分为用户界面层、应用层、领域层和基础设施层。
  • 应用单元各层级内部可细分为多个模块,每个模块又包含多个代码单元。

在上述设计方法中,一个应用服务可以单独部署,也可以多个应用服务组合在一起部署。

那应用单元有哪些划分的具体原则呢?应用的划分原则可以参考以下:

1、业务划分原则

最关键的是参考应用服务的划分边界。如果需要提高应用的粒度,可以参考业务域和业务子域的划分。

将相同业务变更因素的功能和数据整合,提升系统内聚性。同时,把不同业务变更因素的功能和数据分开,减少系统耦合度。

2、技术划分原则

在业务初期,尽量从单体应用开始,避免过早划分应用单元,以减少分布式数据库事务和数据不一致的问题。

应用单元内部可进一步分层,避免应用间出现循环依赖或双向依赖,始终保持不同层级间的单向依赖,高层级可以依赖低层级,同层级间不应互相依赖。

仅当真正遇到技术痛点时,例如规模、性能、安全等问题,才考虑拆分应用。如果不拆分会严重影响业务稳定性,则应进行拆分。不要为了拆分而拆分,因为每次拆分都会增加系统复杂度。

示例:订单履约的应用结构划分

如图所示,是订单履约的应用结构划分。

应用层定义软件的应用功能,它负责接收用户请求,协调领域层能力来执行任务,并将结果返回给用户,核心模块包括:

  • C端履约服务

    • 预计送达时间:为消费者提供订单的预计处理时间、配送时效等,通常基于订单处理时间、配送情况、配送距离等多种因素计算。
    • 实时订单状态查询:允许消费者实时查看他们的订单所处阶段。包括订单待接单、拣货、打包、已发货、配送中等状态。
    • 配送轨迹跟踪:提供订单从出库到最终送达的完整路径跟踪,消费者可以查看订单的当前位置和过往的配送节点,了解配送进度。
    • 配送信息修改:在订单还未最终发出之前,消费者可能需要更改配送信息,如地址或配送时间。
    • 配送费用明细:显示消费者的订单配送费用的详细分解,包括配送费、包装费、服务费等。
    • 确认收货:消费者可以通过系统确认收货,是完成订单流程的最后一步。
  • B端管理模块:
    • 订单派单:接收来自销售平台的订单,并按照既定规则自动分配给对应的门店/仓库。
    • 订单管理:全面管理订单的生命周期,包括订单的确认、处理、状态跟踪、修改和取消等管理操作。
    • 拣货管理:管理仓库内的拣货操作,确保商品被准确无误地从货架上拣选出来,并进行打包和发货。
    • 发货管理:全面管理发货单的生命周期,根据订单的地址、商品大小、重量和客户选择的履约方式,匹配合适的发货方式,并对发货流程进行跟踪。
    • 逆向履约:当客户不满意或需退换商品时,逆向履约模块负责处理退货请求,并管理退货退款和换货流程。

领域层是业务逻辑的核心,专注于表示业务概念、业务状态流转和业务规则,沉淀可复用的服务能力,模块包括:

  • 履约服务表达:负责向客户提供履约服务的明确信息。包括预计的送货时间、费用计算、服务选项(如定时达、次日达等)以及履约可达性要求。
  • 订单履约调度:提供订单履约调度的核心能力,确保订单被高效地处理和执行。它涉及订单从接收到最终准备配送的所有调度和处理过程,包括订单拆分、分配、拣货、包装、发货等。

订单履约系统与其他系统的依赖关系:

  • 商品管理系统:提供的商品信息,包括价格、规格、描述、分类、SKU等。
  • 中央库存系统:需要访问中央库存系统来确认下单商品的实物库存情况,包括库存数量和库存位置。
  • 配送系统:一旦商品打包完成,将依赖配送系统来处理商品的实际配送工作,包括配送安排、跟踪和状态更新。配送系统提供的配送状态和时间信息,对于订单履约系统中订单状态的更新至关重要。
  • 基础数据系统:提供组织机构信息、用户权限信息、服务商信息等基础数据。这些标准化的数据确保各个系统数据的一致性
  • 数据分析系统:订单履约系统将产生大量数据,包括订单数据、履约过程数据、配送时效数据等,这些数据需传输到数据分析系统。数据分析系统基于采集到的数据,提供分析与洞察,帮助优化订单履约流程,提升客户满意度,并提供预测分析,来辅助库存管理和需求预测。

本文已收录于,我的技术网站:tangshiye.cn 里面有,算法Leetcode详解,面试八股文、BAT面试真题、简历模版、架构设计,等经验分享。

SaaS架构:应用服务、应用结构设计的更多相关文章

  1. .NET SAAS 架构与设计 -SqlSugar ORM

    1.数据库设计 常用的Saas分库分为2种类型的库 1.1 基础信息库 主要存组织架构 .权限.字典.用户等 公共信息 性能优化:因为基础信息库是共享的,所以我们可以使用 读写分离,或者二级缓存来进行 ...

  2. Saas系统架构的思考,多租户Saas架构设计分析

    ToB Saas系统最近几年都很火.很多创业公司都在尝试创建企业级别的应用 cRM, HR,销售, Desk Saas系统.很多Saas创业公司也拿了大额风投.毕竟Saas相对传统软件的优势非常明显. ...

  3. 要想不踩SaaS那些坑,得先了解“SaaS架构”

    摘要:围绕当下许多企业青睐的SaaS应用开发,华为云开发者技术服务工程师程泽在DTT首期带来主题为 <SaaS云原生应用典型架构> 的DTT首期直播分享. 本文分享自华为云社区<DT ...

  4. 转 多租户SaaS架构

    当使用Techcello框架开发云端多租户SaaS应用程序时,它继承了经过验证和测试的架构蓝图和工程结构.但开发人员仍然会保留灵活性,自由和控制权,以修改和扩展能力以适应其应用要求.此外,SaaS平台 ...

  5. HRMS(人力资源管理系统)-SaaS架构设计-概要设计实践

    一.开篇 前期我们针对架构准备阶段及需求分析这块我们写了2篇内容<HRMS(人力资源管理系统)-从单机应用到SaaS应用-架构分析(功能性.非功能性.关键约束)-上篇><HRMS(人 ...

  6. SaaS架构经验总结

    2B Saas系统最近几年都很火.很多创业公司都在尝试创建企业级别的应用 cRM, HR,销售, Desk Saas系统.很多Saas创业公司也拿了大额风投.毕竟Saas相对传统软件的优势非常明显. ...

  7. 平台级 SAAS 架构的基础:统一身份管理系统

    https://my.oschina.net/bochs/blog/2248954 业内在用户统一身份认证及授权管理领域,主要关注 4 个方面:集中账号管理(Account).集中认证管理(Authe ...

  8. 新零售SaaS架构:组织管理的底层逻辑与架构设计

    想要深入理解零售企业的组织架构,是非常困难的一件事.因为大部分人都没有实际经营过一家零售企业,更没有参与设计过零售企业的组织架构. 调研商家时,我们只能了解商家组织架构的现状,我们也很难和企业高层直接 ...

  9. 新零售SaaS架构:商品系统架构设计

    SaaS产品就像一座冰山,冰山以上的部分是功能.数据(可见部分).用户界面,冰山以下是系统架构.完整的数据模型.开放体系.非功能性需求(扩展性.可维护性.性能.安全等). 短期内想要快速上线产品,可能 ...

  10. 新零售SaaS架构:多租户系统架构设计

    什么是多租户? 多租户是SaaS领域的特有产物,在SaaS服务中,租户是指使用SaaS系统的客户,租户不同于用户,例如,B端SaaS产品,用户可能是某个组织下的员工,但整个企业组织是SaaS系统的租户 ...

随机推荐

  1. 【Tomcat】IDEA工程没有EE规范的jar包?

    发现了一个问题,我安装了2种版本的Tomcat 一个是8版本,另一个是10版本 我在已经使用8版本的工程中,更换成使用10版本,当然一开始部署运行正常 但是关闭了工程之后,再次打开就发现,这些EE规范 ...

  2. 绝对要收藏!!! JavaEE开发常用注解

    目录 前言 1.Mybatis常用注解 2.SpringMVC常用注解 3.Spring常用注解 1. IoC注解 2. DI注解 3. 事务注解 4.SpringBoot常用注解 5.Lombok注 ...

  3. 【转载】 CUDA中的Unified Memory

    为了结合上篇 文章   https://www.cnblogs.com/devilmaycry812839668/p/13264080.html 对RTX显卡是否能够实现P2P通信功能,同时专业级别显 ...

  4. 【转载】 【Java分享客栈】我曾经的两个Java老师一个找不到工作了一个被迫转行了

      本文作者: 福隆苑居士 本文链接: https://www.cnblogs.com/fulongyuanjushi/p/16182465.html 版权声明: 本博客所有文章除特别声明外,均采用 ...

  5. uniapp tabBar配置后不显示

    pages 和tabbar 箭头所指位置 第一个必须一样 写法也要完全一致 上面这样写 下面这样写 这样都不能匹配上正常显示

  6. Java核心技术之Date相关

    import java.time.DayOfWeek; import java.time.LocalDate; import java.util.Scanner; /** * @author Suns ...

  7. 瑞芯微 | 摄像头ov13850移植笔记

    <1.瑞芯微rk356x板子快速上手> <2.Linux驱动|瑞芯微rtc-hym8563移植笔记> <3.Linux驱动 | Linux内核 RTC时间架构-基于瑞芯微 ...

  8. 使用Istio服务网格进行微服务网络治理

    在Rainbond中,用户可以对不同的应用设置不同的治理模式,即用户可以通过切换应用的治理模式,来按需治理应用,这样带来的好处便是用户可以不被某一个ServiceMesh框架所绑定,且可以快速试错,能 ...

  9. luoguP3330 [ZJOI2011] 看电影--组合数学--高精度

    \(luoguP3330\) [ZJOI2011] 看电影 废了老命想题解 $$luogu$$ $$HZOI$$ 题意 到了难得的假期,小白班上组织大家去看电影.但由于假期里看电影的人太多,很难做到让 ...

  10. 树上倍增求 LCA 模板

    void dfs(int x,int fa,int d){ deep[x]=d;dp[x][0]=fa; for(int i=1;i<=lg2[deep[x]];++i){ dp[x][i]=d ...