首页 > 其他分享 >业务单系统架构设计心得(一)

业务单系统架构设计心得(一)

时间:2024-07-13 12:19:29浏览次数:14  
标签:架构设计 服务 流程 扩展 业务 api 心得 节点

作为一个业务开发工程师,工作中最多的是需求开发,把需求从ppt到落地实现。随着工作的深入,工作面也变得更广和更深,需要面对更多的系统,更加复杂的场景。这时完成功能实现是基本要求了,想要开发能力上一个台阶,需要做好架构设计。常见的架构有:洋葱架构、六边形架构、整洁架构、SOA架构、CQRS架构等等。



这些架构都有一个共同点,分层。针对业务开发系统,本文总结如下业务架构,总共分为5部分:api层、流程层、服务层、数据访问层、指令输出层。

1.api层功能:隔离本系统与外部其他系统的交互,交互方式有rpc接口,http,mq, 定时任务等方式。 api层接收和处理入口参数以及凭借和转换参数,映射为内部服务,并处理内部服务出参。api层不只是做转换,还需要理解内部服务的模型定义和领域能力,对参数建立合理的模型。

api层在设计上需要尽量满足以下四个原则:

  1. api层尽可能薄。api层不要业务逻辑,业务逻辑下沉到流程层和服务层里面。
  2. 满足弹性设计,减少后续对api定义的改动。api层是跟外部交互,接口定义上尽量减少变动。弹性设计方法有:
  • 对入参和出参使用一个大对象包装,后续变更参数时,变动收缩在对象内部;
  • 使用Map来传递一些可变参数;
  • 通过List实现参数规模的弹性,不断丰富Condition模型来支持更多的参数结构和含义,比如范围搜索、模糊搜索、并联或者互斥条件含义。
  1. 参数归一化。所有外部的请求,业务上一般需要记录上游方的调用信息,方便后面追溯请求和做业务监控。因而,需要抽离出公共模型,专门记录调用方相关信息。所有返回结果,根据是否成功有可能性:成功,失败。 在定义成功和失败上,为了便于上游,需要统一成功和失败的code,在设计返回结果时需要抽离出一个标准返回模型,统一定义成功和失败的code。比如http,只有200才表示成功,其他错误码都是不同失败原因。
  2. 上游参数映射:尽力隔离上游系统的领域内容,防止上游定义变更,带来的大批量修改灾难。

当然,api层可以做一些非业务功能,比如用户鉴权,接口限流。

2.流程层(biz层)负责流程编排。将服务层的逻辑串联起来完成业务逻辑。流程层主要负责组织串联服务,可以将组织串联功能沉淀出基础组件功能便于复用。 流程层可以留有简单的业务逻辑,如果本身不复杂,业务逻辑可以直接放到流程层,不必下沉到服务层再被流程层调用,业务架构设计中可根据情况具体分析。

3.服务层(service)系统核心模型和能力弹性的承载层,是系统功能和扩展性张力来源。服务层内部要进行划分成不同的功能区,划分方法可参考DDD,原则上各个功能区是独立的,不应存在跨功能区调用的情况。

4.数据访问层对接数据存储,对外提供统一的接口,屏蔽存储实现,数据存储有mySQL, Redis, ES等。

5.输出指令层输出指令数据,方式有RPC, MQ, 以及http等服务。在层级上跟数据访问层处于同一层级。输出指令层也是跟外部服务进行交互,如有必要进行参数映射,防止下游定义变更,带来的大批量修改灾难。

业务复用

随着系统壮大,越来越多新的功能加入,如果新功能跟现有功能在流程上具备相似之处,从原则上应该复用现有逻辑。复用现有逻辑,一方面能够减少开发量,只需要专注差异点的开发,能够快速交付上线;另一方面,从长远来看,便于维护,无需多次改动。

不同业务具备公共业务点和差异业务点,业务复用可以在两个地方实现:流程层重新编排和服务层子服务开启差异点扩展。

流程层重新编排是指各个业务线在流程层各自写一套服务编排逻辑,被编排的子服务可以分为公共子服务和差异子服务, 公共业务点放到公共子服务中,差异业务点放到差异子服务。

![流程重新编排示意图]

服务层子服务开启差异点扩展是指流程编排是相同的,在子服务中根据不同的业务线实现差异点,为了在子服务中实现差异点��需要在流程上下文中带上业务标识。

流程层重新编排适合差异点比较大的情况下,差异子服务并非一个服务的不同实现,这种情况下将差异点直接编排成子服务更合适。服务层子服务开启差异点适合差异比较小的场景,对于某个功能点各个服务都有自己不同的实现,这种有个好处是便于定义标准扩展接口,做成SPI还能够支持动态扩展。实际业务线采用哪种方式要根据具体业务来定,或者两种都采用。

扩展点

一个系统能够成为优秀系统,扩展能力是一个必备的能力。良好的扩展能力不仅能够帮助系统提高扩展,增强适应性,还能够简化系统结构,代码更加优雅。java中提供了多种机制对程序功能进行扩展,如继承,组合,多态,接口,内部类等,框架类比如Netty, Spring同样提供了大量自定义扩展点。同理,在业务系统架构设计中,剥离出变动部分,并设计为扩展点的形式,方便后续迭代。

链式扩展

用更形象的表述,就如数据结构中的链表一样,链表中的节点为扩展节点,链表将多个扩展节点串联起来执行。链式又可以分为单链和双链。单链中每个节点只有一个处理器,双链每个节点分为前置和后置处理器,双链在执行上,节点前置处理器先正序执行,执行完后,后置处理器再逆序执行。

![单链扩展点执行图]

![双链扩展点执行图]

链式扩展由扩展节点(扩展点的具体实现), 扩展节点链组成。链式扩展的扩展节点实现具备同等地位,图中ExtensionOne, ExtensionTwo, ExtensionThree都是对同一扩展点的不同实现。注册Extension时,将扩展节点编排成链,如果扩展节点无前后依赖关系,那么节点执行顺序可以任意编排。当然,有些扩展点是有前后的依赖关系,这种情况下就必须指定节点执行顺序。在Spring中,注册Extension变得更加简单。直接自动从Spring中上下文中找到所有扩展点的实现节点,在修改节点时,无需改动注册逻辑。

链式扩展应用广泛,在SpringMVC中,实现拦截器,提供日志打印,权限校验等工作。在订单业务系统中,也有很多应用。比如订单拆单流程,业务上有很多拆单规则比如大小件拆开,按照发货仓库拆开等等,一个订单经过拆单规则后,将拆分成多个子单。拆单规则通常是动态变化的,这里就非常适合采用链式扩展点。

![SpringMvc拦截器示意图]

星型扩展

星型扩展组成上有一个分发器和多个扩展节点。分发器根据分发条件分发到响应的扩展点进行处理。

![星型扩展组成]

星型扩展逻辑简化如下:

ini

复制代码if (命中业务A) {
	执行ExtensionOne;
} else if (命中业务B) {
	执行ExtensionTwo;
} else {
	执行ExtensionThree;
}

星型扩展的应用也很多,上一节中的业务复用,在服务层子服务开启业务复用,需要开启星型扩展来处理不同业务的差异点。 SPI虽然没有明显分发器,但也属于星型扩展的方式。

作者:扎Zn了老Fe
链接:https://juejin.cn/post/7323883238895190035
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  1. 如果有排版格式问题,请移步 《业务单系统架构设计心得(一)》,选择宽屏模式效果更佳。

标签:架构设计,服务,流程,扩展,业务,api,心得,节点
From: https://www.cnblogs.com/sjkzy/p/18299923

相关文章

  • 黑马程序员2024最新SpringCloud微服务开发与实战 个人学习心得、踩坑、与bug记录 Day4
    你好,我是Qiuner.为帮助别人少走弯路和记录自己编程学习过程而写博客这是我的githubhttps://github.com/Qiuner⭐️giteehttps://gitee.com/Qiuner......
  • 我的MYSQL学习心得, 自定义存储过程和函数
    转载:https://www.cnblogs.com/lyhabc/p/3793524.html我的MYSQL学习心得(一)简单语法我的MYSQL学习心得(二)数据类型宽度我的MYSQL学习心得(三)查看字段长度我的MYSQL学习心得(四)数据类型我的MYSQL学习心得(五)运算符我的MYSQL学习心得(六)函数我的MYSQL学习心得(七)查询我的MYSQ......
  • 学习了张传波老师的Scrum(敏捷方法论中的核心框架)后的心得体会
    1.Scrum的核心价值与实践在学习Scrum过程中,首先会深刻体会到Scrum所强调的核心价值:快速迭代、持续交付、客户为中心以及团队自组织。这些价值不仅改变了传统的软件开发流程,更推动了团队文化的转变,使团队能够更灵活地应对变化,更快地交付有价值的产品。2.角色转变与团队协作在Scr......
  • 轻松选型,高效开发——业务开发集市助您一臂之力
    在当今这个日新月异的时代,高效开发已成为企业保持竞争力的关键。为了满足市场对高效、灵活开发工具的迫切需求,OceanMind海睿思推出业务开发集市。这款开发工具汇集了众多丰富的、高度可定制的控件和组件,以及灵活的模板选型功能,旨在帮助企业快速响应并满足多变的客户需求。通过......
  • 利用产品用途功能,提高业务效率与信息安全
    随着企业业务的不断发展和市场环境的日益复杂,进销存软件作为企业管理的重要工具,其产品用途功能的应用前景愈发广阔。以销售员为例,在传统的进销存管理中,销售员往往能够接触到包括售卖成品原料信息在内的所有产品信息。然而,在实际业务场景中,销售员并不需要了解这些原料信息,......
  • 架构设计(2)云原生架构与实例部署
    云原生架构云原生架构是一种面向云环境设计和构建应用程序的方法论,旨在充分利用云计算的优势,如弹性、自动化和可扩展性,以实现更高效、可靠和灵活的应用部署和管理。以下是云原生架构的核心理念和关键特点:核心理念:容器化:将应用程序及其所有依赖(如库、配置)打包到容器中,实现环......
  • 业务开发时,接口不能对外暴露怎么办?
    在业务开发的时候,经常会遇到某一个接口不能对外暴露,只能内网服务间调用的实际需求。面对这样的情况,我们该如何实现呢?今天,我们就来理一理这个问题,从几个可行的方案中,挑选一个来实现。1.内外网接口微服务隔离将对外暴露的接口和对内暴露的接口分别放到两个微服务上,一个服务里所有......
  • 关于Linux发行版的心得体会
    这是一篇没有技术的博客,主要讲讲捣鼓迷你主机时装linux系统装各种软件服务时的感受。一开始选择的是Ubuntu24.04LTS,不得不说Ubuntu很漂亮,apt的包管理方式也挺舒服。不习惯的一点su命令切换逻辑好像跟其他发行版不一样,需要给用户设置root密码后才可以,似乎是为了安全的管理权限,Ubun......
  • 构建高可用性的淘客返利系统架构设计
    构建高可用性的淘客返利系统架构设计大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天和大家分享的是如何构建一个高可用性的淘客返利系统架构。一、系统架构设计概述构建一个高可用性的淘客返利系统,需要从系统架构的多个层面考虑,包括前端展示......
  • 简单的Java面向对象小游戏并使用三层架构(表示层、业务逻辑层、数据访问层)
    本人详解作者:王文峰,参加过CSDN2020年度博客之星,《Java王大师王天师》公众号:JAVA开发王大师,专注于天道酬勤的Java开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯山峯转载说明:务必注明来源(注明:作者:王文峰哦)简单的Java面......