简介:《APaaS技术架构、业务中台介绍.pdf》是一份面向企业架构师、研发负责人及低代码平台研究者的技术资料,系统梳理了APaaS平台的总体定位、技术框架与业务中台落地路径。内容涵盖oneBuilder、oneStudio、oneData、oneBusiness等商业化组件,以及元编程、双容器+插件机制、在线Studio、交互与视觉系统、元数据驱动设计、前端多端框架等核心技术点,并介绍了应用市场、应用托管等落地场景,适合用于平台选型、方案评审和内部技术培训。资料还详细展开了元数据注册、模型关系、应用依赖与分组、前后端框架分层等设计细节,能够帮助读者理解低代码平台从底层建模到业务交付的实现方式。资源为单个PDF文档,约5.5MB,便于下载后直接阅读或归档。目前已有963人浏览学习,属于关注度较高的架构类资料。
1. APaaS技术架构拆解:一份把低代码和中台揉进同一套体系的方案
APaaS技术架构这份材料,我拿到手读第一遍的感受是:它把「低代码」和「中台」这两件经常被分开讲的事,真正揉进了一套可落地的体系里。很多团队说要做中台,方案里全是组织架构和流程图,到代码层面就断了;说要做低代码,又往往止步于表单拖拽。这份文档从元数据驱动、双容器、六大引擎一路写到公有云/私有云部署和业务中台落地,是一份能对着画架构图、能照着做选型的完整方案。它适合低代码平台选型、中台建设评估、以及想搞清楚「平台上那些可视化配置到底怎么跑起来的」的研发和架构师。整份材料信息密度很高,我拆的时候做了取舍,下面按实施顺序讲。
2. 元数据驱动与元编程:建模体系从 Module 到 Model 的四个层级
2.1 元数据不只是表结构:它是模型的运行时契约
很多低代码平台把元数据当成数据库字段的简单映射,这是最常见的误解。数式这份方案里的元数据,规范了功能、格式设计、语法规则,实现的是可规范、可校验、可分析的数据结构——也就是说,元数据既是设计期你能配置什么的边界,也是运行期引擎怎么解释配置的依据。系统管理员通过拖拽完成业务配置,靠的就是这层解释逻辑,而不是生成一堆临时表。
我一般会把元数据理解为三部分:对象定义、行为定义、展示定义。对象定义描述数据结构和对象间关系,行为定义描述业务动作和扩展点,展示定义描述菜单、视图和交互。三者都注册到统一的 ModelData 里,由平台统一管理版本和校验规则。
{ "module": "trade.order", "model": "Order", "inherited": { "mode": "classic", "from": "trade.base.BaseOrder" }, "fields": [ { "name": "orderNo", "type": "string", "length": 32, "storage": true }, { "name": "amount", "type": "decimal", "precision": 10, "scale": 2 }, { "name": "buyerId", "type": "string", "relation": "member.Buyer" } ], "actions": [ { "name": "submit", "type": "server", "handler": "submitOrder" } ], "views": [ { "name": "orderList", "type": "list", "menu": "交易/订单管理" } ] }这段示意里,storage: true表示该字段落库,relation声明了与买家模型的对象关系,actions把服务器动作挂到模型上,views把列表页挂到菜单目录。一套元数据定义同时覆盖了「对象、行为、展示以及对象间关系」,这正好对应原文里 DDD 设计规范的说法。
2.2 Module 家族:入口、依赖、互斥、分组四个语义
Module 在方案里承担着类似 Java 包的角色,是产品结构的入口。它名下挂了五个管理维度:ModuleCategory 做应用类型分类,根结点对应一个实体库;ModuleDependency 管理应用之间的依赖关系;ModuleExclusion 管理互斥关系;ModuleGroup 做分组管理,支持按组批量操作。
实际用的时候,依赖关系决定了应用安装顺序——被依赖的模块必须先行安装。互斥关系则解决更微妙的冲突:两个应用如果同时扩展同一个 Model 的同一个字段,或者同时定制了某个视图上的同级扩展点,安装期就该被拦截,而不是等运行期数据错乱再去查。Group 则是给应用市场的批量管理用的:一批行业解决方案包按组上下架,按组升级回退,运维成本能省不少。
这里给一个经验判断:依赖关系建议画成有向无环图,平台安装器按拓扑序执行;互斥关系别只做声明,要在安装器里做实际校验,否则这两个配置就是摆设。看过不少平台把 ModuleExclusion 定义了一堆,安装时根本不检查,最后线上同时装了两个改同一模型的插件,页面直接白屏。
2.3 Model 与 ModelField:跨模块继承的三种形态
Model 是对象模型的管理抽象。ModelField 定义字段组成、对象间关系、展示相关属性和是否存储等性质。ModelRelation 定义模型与应用的关系,ModelConstraint 定义唯一约束或 check 规则。这些都好理解,真正要注意的是 ModelInherited 的三种继承形态。
方案里明确写了三种:经典继承、扩展继承、代理继承。经典继承就是父子表共享主键,子表通过外键关联父表,业务上最常用;扩展继承只对父表做字段补充,不动父表结构;代理继承不改表结构,通过视图或服务层把多个模型的数据组合对外暴露。关键约束在后面这句话:在不同 Module 下 Model 继承只能通过新建表形式进行。
这句话的信息量很大。它等于说跨模块继承不允许 alter 父表,只能新建子表。这样设计是为了保证应用可安装、可升级、可回退——每个模块的数据结构变化都收敛在自己新建的表空间里,不会动到别的模块已经在用的表。差量描述设计也是同一目的:系统迭代升级时,通过计算新旧元数据差异生成增量变更,而不是整个覆盖。
2.4 UI 交互四件套:Menu、View、Action、ExtPoint 的联动链路
菜单、视图、动作、扩展点这四样东西,在低代码平台里是按一条链路串起来的。Menu 定义菜单展示;View 定义对象展示形式,分为 List、Form 等;Action 描述对象行为,细分为 ViewAction(窗口动作)、UrlAction(路由动作)、ServerAction(服务器动作);ExtPoint 定义服务器动作的扩展点。
我梳理出的触发链路是:用户点菜单 → 打开对应 View(列表或表单) → 界面上触发某个动作 → 窗口动作处理弹窗页面流转,或路由动作跳转,或服务器动作发起到服务端的操作 → 服务器动作执行到扩展点,扩展点允许在不改原动作的情况下插入自定义逻辑。
联动关系可以这样理解:
| 层级 | 元素 | 职责 |
|---|---|---|
| 入口层 | Menu | 决定功能从哪个菜单进入 |
| 展示层 | View | 决定对象以 List / Form 形式展示 |
| 行为层 | Action | 区分窗口、路由、服务器三类行为 |
| 扩展层 | ExtPoint | 在服务器动作上留出插拔位 |
这四件套是后面讲开发者模式的基础。在线 Studio 里的界面编辑、逻辑编辑,最后都会落到这四类元数据上。先把这个链路记住,后面看双容器和引擎机制会顺很多。
3. 双容器与六大引擎:低代码平台前后端到底怎么跑
3.1 前端容器:Core Engine、UI Components 与业务模式库的分层
前端部分被拆成了三层:Core Engine、UI Components、业务场景与模式库。Core Engine 是跨平台多端处理的核心机制,负责对应用结构化数据的加工存取、基于模型的数据访问(含权限和安全)、路由和渲染、逻辑行为的触发执行,以及视图各层级的扩展机制。UI Components 是无业务含义的基础组件库,视觉风格统一,平台相关,不同端各有实现。业务场景与模式库由 UI Components 聚合而成,封装了数据存取动作,包含页面与门户、视图、字段三类部件。
这个分层最值得借鉴的地方,是把「无业务含义」和「有业务含义」做了硬隔离。文本、图片、日期这些组件不感知业务,搜索框、商品列表、数据表单这些模式才承载业务语义。承载业务语义的部分可被动态注册和替换,也可以在主题里定制。前端 DSL 语法和解析引擎的存在,让页面从研发态走向配置态——一句界面的修改不再需要前端发版,配置数据变了,渲染跟着变。
多端研发最头疼的就是同一套界面逻辑在不同平台各写一遍。Core Engine 把路由、渲染、权限、数据访问统一掉之后,UI 组件只需要按平台出不同实现版本,业务模式库完全复用,这正好应对原文说的「不用再担心多端研发带来的困扰」。
3.2 后端六大引擎:Maker、Action、Fun、Event、Data、Process 各自的职责
后端容器是六类引擎加模块生命周期管理。原文只给了引擎名称,没有逐个解释。按这类平台常见的职责划分:Maker 能力引擎负责对象定义和表单生成的落地,把元数据里的 Model 定义转换成可运行的业务对象;Action 动作引擎负责执行服务器动作和窗口动作,是行为层的执行器;Fun 函数引擎提供可复用函数库,在线函数式编程就挂在它上面;Event 事件引擎处理事件分发,触发器发出的业务事件都由它接;Data 数据引擎统一数据访问层,模型查询、权限过滤都走这一层;Process 流程引擎负责工作流和状态机流转。
六大引擎配合 CDM 通用数据模型获得动态输出业务处理能力的特性,是这套平台响应业务变化的核心。传统开发模式下,加一个业务动作要改代码发版;在引擎模式下,动作的定义、事件的绑定、流程的编排都是配置数据,引擎在运行期解释执行。变更的粒度从「改代码」降到「改配置」,这就是低成本开发的来源。
这里给一条排查经验:引擎再多,故障定位时先看事件有没有进 Event 引擎,再看动作有没有被 Action 引擎执行,最后看数据落库是不是走了 Data 引擎。分层清晰的前提下,每一层都应有运行日志和耗时统计,不然配置态出问题就是黑匣子,谁也说不清是引擎 bug 还是配置写错。
3.3 Hook + 插件机制:AOPExtends 与开放封闭原则怎么落地
系统遵循开放封闭原则,靠的是 Hook 加插件机制来实现 AOPExtends——平台功能可以被无缝快速地插拔扩展。扩展手段有替换实现、设置扩展点、插拔式组件、在线函数式编程、流程编排五种。替换实现是将原有实现整体换掉;设置扩展点是保留原逻辑,在指定位置插入新逻辑;插拔式组件是前端模式库层面的替换;在线函数式编程和流程编排则是在不改动平台代码的前提下调整业务逻辑。
这部分最有价值的设计是预览环境与生产环境隔离。动态扩展机制越灵活,线上出问题的概率就越高,所以平台把预览环境单独隔离出来,每次扩展变更先发布到预览环境验证,确认业务正确后再推到生产。原文强调预览「不但可以保证程序正确,也可以保证业务正确」,这句话是点睛——程序正确是编译和跑通,业务正确是流程和单据流转符合预期,两件事都要在发布前验证。
增量更新机制也值得单独说。业务增量扩展只更新差量描述部分,系统资源消耗极低。实际操作中我一般会建议:每次增量更新前自动对比新旧元数据版本,生成变更清单,人工确认清单内容无误后再执行。平台能做增量,不等于增量不需要评审。
3.4 在线 Studio:入口、模型、行为、视图、权限的一站式编辑
开发者模式里塞了五块编辑区:界面、逻辑、数据、流程、常规。界面编辑区提供菜单管理和页面自定义,前端组件通过拖拽配置在线定义模型对象的界面,还有向导录制编辑。逻辑编辑区是重头戏:窗口动作定义弹窗行为,服务器动作支持脚本和 DSL 两种模式,URL 动作定义路由跳转,触发任务为模型的增删改查配置触发器,定时任务按绝对时间、相对时间、定时循环执行逻辑。
// 定时任务示例:每天凌晨两点批量关闭超时未支付订单 def task = event.trigger("dailyCloseOrder") task.when(cron: "0 0 2 * * ?") task.execute { def orders = model.query("Order") .where("status = 'UNPAID' and createTime < now() - 1d") .list() orders.each { it.invokeAction("close", reason: "timeout") } log.info("closed ${orders.size()} orders") }这段示意里,event.trigger注册了一个名为 dailyCloseOrder 的触发器,when指定 cron 表达式控制执行频率,model.query走 Data 引擎做模型查询,invokeAction触发 Order 模型上的 close 服务器动作。事件引擎负责调度,数据引擎负责查询,动作引擎负责执行业务动作——三个引擎在一次定时任务里完成了协作。数据编辑区提供 ER 图查看模型依赖结构,模型处理支持增删改和模型访问权限配置。流程编辑区是图形化界面,覆盖多种流程节点。常规区统一管理文件和国际化,支持多语言、时区、日期格式、货币汇率等配置。
这套一站式编辑把「从入口、模型、行为、视图、权限」全链路打通,核心价值是让不懂开发的人也能完成定制——这话在原文里出现过,但实际落地中,它依赖的是前面讲的元数据契约足够完整。
4. 系统方案与配置环境:公有云、私有云的选型和容量预估
4.1 存储和中间件:公有云全家桶与私有云自建选型对照
这套方案的部署选型分成公有云和私有云两条路,对照起来看特别清晰。
| 能力项 | 公有云方案 | 私有云方案 |
|---|---|---|
| 数据库 | RDS MySQL | 主备高可用自建 MySQL |
| 缓存 | 云数据库 Redis 集群版 | 自建 Redis 集群 |
| 对象存储 | 阿里云 OSS | 自建 Minio 集群 |
| 应用托管 | 阿里云 EDAS | 自研 PaaS + dubbo + zookeeper |
| 消息队列 | RocketMQ | 自部署消息队列 |
| 负载均衡 | SLB | Nginx 集群 |
| 持续交付 | EDAS 内置 DevOps | Jenkins + Kubernetes |
| 监控 | EDAS 主机/容器/JVM/业务监控 | 基于 Pinpoint 定制的监控应用 |
公有云方案基本是阿里云全家桶,EDAS 托管应用和持续交付,SLB 做负载均衡,运维压力小。私有云方案选 dubbo 加 zookeeper 搭分布式集群,Jenkins 配合 Kubernetes 做持续集成,Nginx 集群做负载均衡。选型判断通常看两个变量:数据合规要求和中长期成本。公有云胜在省运维,私有云胜在数据不出域,但私有云的 dubbo+zookeeper 这套组合对运维能力要求不低,三台 ZK 节点挂掉两台就够你忙一晚上。
存储方案里有一个决策点容易忽略:数式提供统一的数据库策略方案,安装所有应用时提前规划好数据库策略,系统自动完成数据库和数据表安装、IP 路由指定。这意味着数据库的 schema 变更不是手工执行的,而是由平台按元数据差量自动生成的。规划阶段就要把库表拆分策略定好,不然应用装到一半发现分库分表规则和路由规则对不上,回退成本极高。
4.2 硬件配置与容量预估:从实例规格倒推支撑能力
原文给了一套具体的硬件推荐方案,这里把核心配置整理一下,方便做容量对标:
| 环境 | 用途 | 配置 | 数量 |
|---|---|---|---|
| 开发环境 | ECS 开发服务器 | CentOS 7.3 / 4核32G / 200G | 1 |
| 测试环境 | ECS 测试服务器 | CentOS 7.3 / 4核32G / 200G | 1 |
| 预发环境 | ECS 预发服务器 | CentOS 7.3 / 4核32G / 200G | 2 |
| 正式环境 | 前台 WEB 服务器 | CentOS 7.3 / 4核32G / 200G | 2 |
| 正式环境 | 后台 WEB 服务器 | CentOS 7.3 / 4核32G / 200G | 2 |
| 正式环境 | 各业务应用服务器 | CentOS 7.3 / 4核32G / 200G | 4 |
| 正式环境 | Elasticsearch + ZK | CentOS 7.3 / 4核32G / 200G | 3 |
| 正式环境 | 消息队列 | CentOS 7.3 / 4核32G / 200G | 2 |
| 正式环境 | SLB 负载均衡 | CentOS 7.3 / 4核16G / 200G | 2 |
| 正式环境 | RDS MySQL | 4核8G / 1T | 2 |
这套配置预估支撑活跃用户 100 万、日均订单 10 万、高峰期每分钟 1000 订单。对照实际项目经验,这个估算是偏保守的——业务应用节点 4 台、WEB 节点前后台各 2 台,做水平扩展时按比例加节点就行。前中台 WEB 负载均衡用 SLB,这里有个细节:SLB 本身不跑业务逻辑,2 台 4核16G 主要处理连接和转发,瓶颈通常在带宽和连接数,不在 CPU。
资源规划上有一条血泪经验:所有节点无状态化是这套架构能水平扩展的前提。前后端节点全部无状态处理,状态统一放 Redis,必要时用 Redis Cluster 分片。如果业务代码里私藏了本地 session 或本地缓存,扩容再多节点也白搭,负载均衡一转发,用户就掉登录。上线前检查这个点,能省掉后面大半的扩容事故。
4.3 集成、监控与应用托管:装完应用之后才见真章
集成对接分数据集成和系统 API 集成两种。数据集成含 EXCEL 导入导出方案,以及企业内部系统与数式系统间数据自动导入导出方案对接。API 集成支持两条路:企业内部系统定制开发主动集成数式企业中台,或定制协议转换的集成中间件做系统间转换。
私有云监控方案值得一提:数式提供标准监控应用,基于开源软件 Pinpoint 定制开发,用户安装监控应用后,就可以对已安装的所有应用做全链路系统和业务监控。全链路监控在微服务架构里几乎是刚需,一次用户请求跨应用、跨引擎、跨数据库,没有链路追踪,排查问题全靠猜。Pinpoint 这条路的好处是开源底子,坏处是定制深度取决于实施团队对 Pinpoint 的熟悉程度,建议预留一周左右的二次开发时间。
# 私有云环境安装中台产品前的环境预检 kubectl get nodes -o wide # 确认 K8s 节点数与调度状态 kubectl get sc # 确认存储类,Minio 对接前先建好 Bucket free -g && df -h # 检查内存余量与磁盘空间 java -version # 必须 JDK8,引擎对高版本 JDK 兼容性不稳定 node -v && yarn -v # 前端依赖版本要锁定这段预检命令按「基础设施→存储→运行时→构建工具」四层排查。kubectl get sc容易被漏,但 Minio 对接时如果没有可用的存储类,PVC 会一直 Pending,应用装到一半卡住,排查起来耽误时间。Java 版本必须锁 JDK8,很多低代码引擎在 JDK11 以上会有字节码兼容问题,这是安装阶段最常见的坑之一。
应用生命周期管理方面,数式自研的 pamirs-apps 在用户态提供应用安装、卸载、升级能力,一键完成。基于数式平台研发的应用通过 EDAS 保证应用调用互通,所有应用以统一标准对外暴露访问路径。多租户通过多数据库实例完成物理层隔离,支持高速通道构建混合云,连接私网数据库。
5. 避坑排查:实施 aPaaS 架构时最容易误判的五个环节
5.1 翻车一:SPU/SKU 建模把跨 Module 继承当成普通改表
现象:在两个应用模块间共享一套商品模型,A 模块给 Model 加了两个字段,发布后 B 模块的列表页字段错乱,回退时数据被连带影响。
原因:原文明确「在不同 Module 下 Model 继承只能通过新建表形式进行」,跨模块扩展父表结构是被禁止的。直接把字段加到共享模型上,等于违反了继承约束。
解决:跨模块扩展一律走继承新建子表。父模块的 Model 保持稳定,子模块通过扩展继承创建新表补充字段。改动前先查 ModelInherited 元数据,确认继承形态是经典、扩展还是代理,再决定字段落在哪张表上。
5.2 翻车二:把「流程与数据模型解耦」理解成「两者无关」
现象:交易流程调整了节点顺序和分支条件,订单表结构没动,结果是流程跑通了,但状态字段的值和流程节点完全对不上,对账直接崩。
原因:解耦指的是运行期流程编排与数据存储解耦,设计和建模期两者必须一起考虑。交易系统的特点里明确写了「交易流程与数据模型解耦:数据模型保持稳定、常态化;交易流程灵活定制」,但数据模型的稳定靠的是预先抽象,不是流程改完再补字段。
解决:每次流程编排变更,先列出流程涉及的所有状态流转,对照 Order 模型的 status 字段取值是否覆盖。流程分支每多一条路径,状态机里就要有对应的状态节点和迁移规则。先有数据模型,再配流程引擎,顺序不能反。
5.3 翻车三:权限四层模型只配了菜单,没配字段级审计
现象:用户按角色配了菜单和模型访问权限,打开表单后能看到不属于他权限范围内的敏感字段,数据审计日志里也查不到关键字段的变更记录。
原因:方案的权限模型有四层:资源权限约束可访问的菜单和表单字段,模型访问权限细分到增删改查,模型行记录权限细分到每一行,用户行为权限控制页面操作。只配了菜单,相当于第一层都没做完,后面的行权限和行为权限更是空转。
解决:按四层顺序逐个补齐:先摸底数和表单字段,再配模型增删改查,然后配行记录权限,最后给页面操作挂行为权限。字段级数据审计要单独开启,方案里支持字段级审计,但默认未必全开,上线前做一次权限矩阵验证,用两个测试账号交叉登录检查越权路径。
5.4 翻车四:拿低代码当零代码,差量发布跳过预发评审
现象:管理员在在线 Studio 里拖拽配置完成一个业务对象,直接发布到生产,触发大表 DDL,线上业务卡死,回滚命令执行了半小时。
原因:元编程的差量描述设计在系统升级时会生成增量 DDL。低代码降低的是编码门槛,不是变更评审门槛。跳过预发环境预览直接上生产,大表加字段、加索引的代价一点不会少。
解决:所有模型结构变更强制走预发环境预览。方案本身提供预览能力且预览环境与生产隔离,这是设计好的逃生通道。发布前确认变更清单里涉及的 DDL 类型,大表加字段评估锁表时间,必要时选业务低峰期执行。
5.5 翻车五:多租户隔离粒度照抄公有云,私有云资源直接被打爆
现象:私有云环境照搬公有云的多数据库实例方案,每个租户一个独立数据库实例,十几个租户上线后资源耗尽,扩容成本远超预算。
原因:方案在应用环境部分明确「基于数式研发的应用天然支持多租户,并通过多数据库实例完成物理层多租户」,这是公有云架构。私有云资源有限,物理隔离的粒度必须按租户量级分档。
解决:大租户独享数据库实例,中小租户共享实例、分库分表隔离。隔离粒度在安装应用前规划好数据库策略,平台会自动完成数据库和路由指定。租户量级和资源预算在一张表里拉清楚,再决定隔离方案,不要一个模板套所有客户。
6. 用业务中台验证架构:商品、交易、建站怎么在建模体系里落
6.1 商品管理的类目属性体系:把 SPU/SKU 落到 Model 上
商品模块是检验元数据建模能力最好的试金石。SPU 是标品定义,与卖家无关;商品在 SPU 之下,关联卖家、价格、物流等交易数据;SKU 是销售最小单位,挂销售属性。用 iPhone XS 举例,它是 SPU,白色和黑色是两个 SKU,颜色是销售属性。类目分前台后台:前台类目服务消费者导航,层级一般为三级;后台类目服务商家内部分类,属性关联后台类目,创建商品时继承类目属性。模型上,SPU、商品、SKU 天然是三层继承关系,用扩展继承新建表,每层只补自己这层该有的字段。
6.2 交易核心:状态机与原子部件拼装订单流程
交易核心的搭建思路是从界面、流程、功能点三个维度拆出原子部件,外部系统通过这些部件快速装配不同交易流程。实物商品和虚拟商品可以并存,多套流程通过下单信息路由到指定流程。订单、子订单、支付单、发货单、退款单五类单据灵活拆分,流程与数据模型解耦,用状态机快速拼装流程。落到建模体系里,这五类单据共用一套模型骨架,通过继承产生各自的扩展字段,Process 引擎负责状态流转,Action 引擎负责校验规则和渠道对接。
6.3 建站管理:模板、组件与多站点的三件套
建站系统把站点定义为页面的有序组合,店铺是 B2B2C 站点的最小单位,模板是包含页面、布局结构、风格样式、功能模块及部分应用数据的整体方案,组件是页面上的功能应用——文字、图片、轮播、导航条、商品分类、排行榜、搜索框都属于组件。装修系统做到所见即所得,运营可以快速搭建前台网站,商家随时装修发布店铺,支持多语言 UI 呈现。这套机制与前端框架里的 UI Components 和业务场景模式库完全对应:模板对应视图布局配置,组件对应模式库的部件注册。
从第一次拆这份方案到现在,我养成了一个习惯:每次评估中台或低代码平台,先按「元数据建模 → 引擎机制 → 部署方案 → 业务模块推演」四步走一遍,任何一步讲不清楚的,直接淘汰。这份材料把四步都讲透了,适合下载下来对照自己项目的实际建模过程再过一遍。希望帮到你。
本文还有配套的精品资源,点击获取