简洁应用框架VSEF - 业务解构模版

简介: 简洁应用框架VSEF - 业务解构模版




当一个应用系统上部署多个“业务模块”的时候,我们期望有一个统一的结构模版,这个结构模版是“业务架构”和“技术架构”的一个重要衔接,本文就是对这个结构模版的一些探索。


原型


 结构设计


先回顾一下《简洁应用框架VSEF的架构》中提到的总体结构。

VSEF 总体结构

 结构样例

模块:

  1. 客户端:vsef-archetypes-client
  2. 业务逻辑:vsef-archetypes-application



vsef-archetypes-application 目录结构:

原型目录结构截图如下: 原型目录结构截图


 执行模版


业务流程 l3.process 处理背后,可以考虑一些共性的东西,作为模版,减少重复工作,常见的一些点有:

  1. 异常如何处理
  2. 是否有幂等需要
  3. 是否需要并发加锁
  4. 是否需要提供组件协议
  5. 是否有数据库和消息操作
  6. .......

在原型示例处理流程中,继承了处理模版。



示例处理流程继承处理模版


这个模版里面植入了“幂等校验与处理”的抽象。

处理模版中抽象了“幂等校验与处理”逻辑


【延伸扩展】下面是V2交易框架中的一个比较复杂的处理模版,可以作为抽象的大图参考。

 模型抽象


除了处理过程的抽象,我们有时也会都处理的上下文进行抽象,可以节省各个流程的转换过程。
因为我们处理模版中,没有非常复杂的具体逻辑包装,同时为了不对使用者提供太多约束,所以模型只是简单的输入 Request、输出 Result 抽象。


原型中处理模版对模型的抽象


但是,随着业务活动的增多,是可以进一步细化,但这也意味着通用性会降低,这不应该属于通用框架的部分,会属于具体落地的效能讨论主题,这里就不展开了。


【延伸扩展】下面会展示一下V2里面的最终模型模型逻辑,可以做为后续设计的一个参考。


案例


 价保 priceinsurance


  • 场景介绍


主要功能:基于下单的订单信息,重新请求营销等系统,计算当前价格和价差,进行赔付。

V2 价保业务活动分析


  • 原型结构

原型选取4个入口案例:申请价保服务、提交价保服务、申请并提交服务、异步check消息处理。


主要的结构如下图所示:

价保原型功能结构大图


  • 关注点


业务活动组合


价保中有个场景是“申请并提交价保服务”,这个服务需要结合“渲染价保服务”、“申请价保服务”。这里的处理策略可能有这样几种:

  1. Process独立:新写一个“申请并提交价保处理流程”,独立编排。
  2. Process聚合:写一个“申请并提交价保服务”,调用“渲染价保服务”、“申请价保服务” 的 l3.process 服务。
  3. API 聚合:写一个“申请并提交价保服务”,调用“渲染价保服务”、“申请价保服务” 的API实现。


价保中采用的是API聚合,因为除了核心逻辑,比如错误码的转换、限流等,都会包含在API里面,所以为了尽可能得保持逻辑一致,还是在当做黑盒处理比较好,聚合服务不要去理解原子服务背后的具体细节。


抽象模型


价保的模版中,模型的抽象保留了“减少约束”的思想,直接用抽象类型,且无继承约束。

价保的处理模版模型抽象约束为无


这样做有个非常舒服的案例是“异步check”消息的处理,可以直接使用消息处理的上下文,作为Request和Result,减少了转换陈本。当然,这会造成很难复用活动节点,这里采用服务脚本直连能力的方法是比较好的。但是在模型抽象层面的思考还是有意义的。


使用消息输入输出作为处理流程的上下文

业务身份能力


价保有个业务身份能力,需要计算业务身份实例,用于后面的扩展寻找插件。这里业务身份的策略是:follow下单时的业务身份。

价保业务身份计算能力


扩展服务机制


扩展作为一种服务,其扩展机制是可以自定义的。


在价保原型中,会议一些校验、价差计算、渲染的业务扩展,为了支持这些扩展,扩展区域主要设计了几个模块:

  1. ext - 扩展服务模块 :扩展服务的实现,负责寻找插件,回收结果。
  2. plugins - 插件模块:实现业务扩展的插件,可以托管在应用代码库内,也可以通过二方包方式集成进来。
  3. sdk - 扩展SDK模块:模型和方法定义,作为衔接 ext 扩展服务 和 plugins 插件实现的桥梁。


价保扩展服务设计

 拼团 groupon


  • 场景介绍


主要功能:招商侧可提报优惠、团信息;下单时,基于设置信息进行hold订单,当支付订单数达到成团人数,则拼团成功,创建物流单;否则,拼团超时失败,快速退款,关闭订单。

拼团业务活动分析


  • 原型结构


原型选取2个入口案例:订单支付消息、拼团查询服务。
主要的结构如下图所示:

拼团原型功能结构大图


  • 关注点


业务脚本


拼团原型中,有一个查询的case。这个case中,直接使用了业务脚本服务,在业务脚本中调用了 l5.ability 中的数据能力获取了数据,并进行了简单转换。

拼团查询服务直接使用 l5.ability


子流程串联


拼团的时候,接到付款消息,需要区分开团订单还是参团订单,走不同的处理流程。在“参团or开团流程”中展示了如何串联2个业务脚本。

"参团or开团流程" 串联了2个子业务流程


数据操作


拼团和价保都是一样的,操作数据的时候,通过定义依赖接口进行解耦,同时模型会使用业务能力中的“领域模型”,不会直接依赖DO。数据服务,负责理解领域依赖接口,实现数据转换。

拼团数据服务不直接依赖DO


总结


由于follow原型结构,价保、拼团的项目结构是一样的。如果对这个类似的“应用架构”进行边界定义,当一个应用上部署多个“子业务应用”的时候,可以类比 docker 的思想的,做较多的统一服务(更多的可以是理解层面),也便于新业务模块的快速初始化。与 docker 的差异是,这种抽象程度进一步走进了具体的业务单元。


业务应用架构 - 业务逻辑层的“集装箱”


团队介绍


我们是交易平台-平台产品服务团队。团队主要从事交易链路交付工作,在交付工作中,抽象和建设横向产品能力(如:预售、电子凭证等),团队关注业务架构、DDD等理论与实践,致力于高效、稳定地实现业务接入,并抽象赋能。

目录
打赏
0
0
0
0
197
分享
相关文章
C# 10.0中Lambda表达式的改进:更简洁、更灵活的代码编写体验
【1月更文挑战第21天】随着C#语言的不断发展,Lambda表达式作为一种简洁、高效的函数式编程工具,在C# 10.0中迎来了重要的改进。本文将详细探讨C# 10.0中Lambda表达式的新特性,包括参数类型的推断增强、自然类型的Lambda参数以及Lambda表达式的属性改进等。这些改进不仅简化了Lambda表达式的编写过程,还提升了代码的可读性和灵活性,为开发者带来了更优质的编程体验。
《解锁ArkTS模型封装与抽象:代码复用与维护的进阶之道》
在鸿蒙系统中使用ArkTS开发时,高效管理和运用AI模型至关重要。通过封装和抽象,隐藏模型实现细节并提供简洁接口,能提升代码复用性、稳定性和可扩展性。封装使模型内部变化不影响外部调用,降低耦合度;抽象提取共性操作,简化代码结构。这不仅提高开发效率,还增强代码可维护性和团队协作效率,为复杂智能应用奠定基础。
62 21
微信小程序组件封装与复用:提升开发效率
本文深入探讨了微信小程序的组件封装与复用,涵盖组件的意义、创建步骤、属性与事件处理,并通过自定义弹窗组件的案例详细说明。组件封装能提高代码复用性、开发效率和可维护性,确保UI一致性。掌握这些技能有助于构建更高质量的小程序。
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
83 2
Vue3+TypeScript前端项目新纪元:揭秘高效事件总线Mitt,轻松驾驭组件间通信的艺术!
【8月更文挑战第3天】Vue3结合TypeScript强化了类型安全与组件化开发。面对大型应用中复杂的组件通信挑战,可通过引入轻量级事件发射器Mitt实现事件总线模式。Mitt易于集成,通过简单几步即可完成安装与配置:安装Mitt、创建事件总线实例、并在组件中使用`emit`与`on`方法发送及监听事件。此外,利用TypeScript的强大类型系统确保事件处理器正确无误。这种方式有助于保持代码整洁、解耦组件,同时提高应用的可维护性和扩展性。不过,在大规模项目中需谨慎使用,以防事件流过于复杂难以管理。
192 1
【Vue 2】一个高效的低代码表单,可视化设计,一键生成源码
Variant Form 是一款基于 Vue 2 的低代码表单生成器,采用可视化拖拽设计界面,支持一键生成完整源码,大幅降低开发复杂度。其高度自定义特性可满足多种场景需求,无论是简单输入框还是复杂多级表单,都能轻松实现。此外,项目完全开源免费,适合有个性化需求的企业和开发者。主要功能包括拖拽式表单设计、自定义 CSS 样式、国际化多语言等,兼容 IE 11 浏览器,并支持导出 Vue 组件及 HTML 源码。通过简单的安装步骤即可在本地环境中搭建和使用 Variant Form,大幅提升开发效率。
175 0
一文就知道uniapp等跨端开发的使用场景,学习成本,如何快速使用,基本语法等
uniapp是一个跨平台开发各种各样应用的一套框架。只需要写一套代码,可以适配多达14种产品类型,比如H5移动端、微信小程序及各种其他小程序,ios、安卓等接近原生APP的应用(可以上架到App Store或应用商店)。所以这里的多端,指的并不是PC、平板、手机端,而是移动端优先,开发者可以一次编码,分别编译为小程序和 Android 以及 iOS 应用,实现多端开发
371 0
第八章(应用场景篇) 中大型项目的解构:从单体应用到微前端
第八章(应用场景篇) 中大型项目的解构:从单体应用到微前端
148 0
Go语言模块导入的实践与技巧:提升代码重用与模块化开发效率
【2月更文挑战第9天】在Go语言中,模块导入是实现代码重用和模块化开发的关键环节。本文将介绍Go语言中模块导入的实践与技巧,包括本地模块的导入、远程模块的导入、导入路径的解析与重定向、导入别名与包的重命名等,旨在帮助读者更加高效地进行Go语言的项目开发。
构建高效前端项目:模块化与组件化的最佳实践
【2月更文挑战第13天】在现代前端开发的浪潮中,模块化和组件化已经成为提升项目可维护性和开发效率的核心原则。本文深入探讨了如何通过合理的模块划分、组件设计以及工具选择来优化前端项目结构,同时确保代码的复用性和可测试性。我们将从理论出发,结合实例分析,为前端开发者提供一套行之有效的最佳实践指南。
388 0