OBPM 后端架构总览¶
OBPM(myApps 低代码平台)后端是基于 Spring Boot 3.3.5 + Java 17 + Spring Cloud 2023.0.3 的微服务系统,源码位于 trunk2018/java(Maven 多模块工程,groupId com.teemlink,版本 5.x.nightbuild)。平台提供表单/视图/流程/报表的设计、运行与管理能力,支持多种服务发现(Consul / Eureka / Nacos)与多种部署形态(微服务、WAR、Lite 单体)。
本文是 design/java/ 的总览主文档:
| 专题文档 | 内容 |
|---|---|
| [[module-dependency]] | 模块分层依赖矩阵、每模块职责、Feign 服务间调用 |
| [[service-discovery-variants]] | consul/eureka/nacos/war 四类变体差异、主类清单、配置链 |
核心机制专题(动态表单、工作流引擎、workspace 存储等)见 design/ 上级目录的既有文档([[../dyna-form]]、[[../workspace-structure-and-mechanism]] 等)。
1. 技术栈¶
| 类别 | 选型 |
|---|---|
| 语言 / 运行时 | Java 17 |
| 框架 | Spring Boot 3.3.5、Spring Cloud 2023.0.3、Spring Cloud OpenFeign |
| 服务发现 | Consul(默认)、Eureka、Nacos(按部署变体选择) |
| 注册中心健康检查 | /actuator/health(management.endpoints.web.exposure.include=health,metrics) |
| 数据库 | MySQL 5.7+ / Oracle / PostgreSQL / SQL Server / KingBase / OceanBase(每表单字段类型有多数据库 DAO 实现) |
| 连接池 | Druid(com.alibaba.druid) |
| 缓存 | 两级:Caffeine(一级)+ Redis(二级),由 myapps.cache.provider 选择(redis / caffeine) |
| 消息 | ActiveMQ(spring.activemq.broker-url=tcp://localhost:61616) |
| AI(obpm-ai) | LangChain4j 1.3.0(open-ai、community-dashscope)、Qwen3、Milvus/Lucene 向量存储、HanLP |
| 报表 | ureport3(源码内嵌模块)、DynamicReports 6.0.0 |
| 文档转换 | Aspose(obpm-converter) |
| SQL 解析 | ANTLR 生成的解析器(obpm-sqlparser,cn.myapps.sqlparser.codegen.SqlBase*) |
2. 微服务拆分与端口¶
以各 *-consul 变体的 application.properties 实际值为准(server.port 与 server.servlet.context-path):
| 服务 | spring.application.name | 端口 | Context Path | 职责 |
|---|---|---|---|---|
| 网关 | obpm-gateway | 8080 | / |
API 网关,路由分发(见 §3) |
| 设计器 | obpm-designer | 8082 | /designer |
表单/视图/流程/报表设计,设计内容以 XML 落盘 workspace |
| 运行时 | obpm-runtime | 8083 | /obpm |
发布应用的运行时服务 |
| 消息 | obpm-message | 8084 | /message |
消息推送与通知 |
| 知识管理 | obpm-kms | 8085 | /kms |
KMS 知识管理(企业网盘等) |
| 文件转换 | obpm-converter | 8086 | /converter |
文件格式转换(Aspose) |
| 管理中心 | obpm-manager | 8087 | /manager |
创建域/部门/用户,为域分配软件 |
| 用户中心 | obpm-usercenter | 8088 | /usercenter |
用户管理(不能独立使用) |
| 定时任务 | obpm-job | 8089 | /job |
定时任务(Quartz,quartz.properties) |
| 认证 | obpm-signon | 8010 | /signon |
用户认证、授权、单点登录 |
| 日志 | obpm-logger | 8020 | /logger |
日志收集 |
| Lite 单体 | obpm-lite | 8888 | — | 轻量单体部署(聚合全部服务,见 §4.3) |
注意:端口以本文为准;
trunk2018/java/CLAUDE.md中记载的部分端口(如 signon 8085、kms 8084)与源码实际配置不一致。
3. 网关路由¶
网关(obpm-gateway-consul/src/main/resources/application.properties)采用 Spring Cloud Gateway:
显式路由(4 条):
| 路径谓词 | 目标 |
|---|---|
Path=/signon/** |
lb://obpm-signon |
Path=/obpm/** |
lb://obpm-runtime |
Path=/kms/** |
lb://obpm-kms |
Path=/message/** |
lb://obpm-message |
发现定位器:spring.cloud.gateway.discovery.locator.enabled=true —— 其余服务(designer、manager、job、converter、logger、usercenter 等)通过 Consul 服务发现自动按默认规则(/{service-name}/**)路由,与各服务的 context-path 约定一致。
默认过滤器:PreserveHostHeader。
4. 部署形态¶
4.1 微服务(默认)¶
每个服务选择一种服务发现变体(*-consul / *-eureka / *-nacos)独立进程运行,通过网关 8080 统一入口访问。变体差异详见 [[service-discovery-variants]]。
4.2 WAR 部署¶
*-war 模块打包为 war(packaging=war),主类继承 SpringBootServletInitializer(如 obpm-runtime-war 的 RuntimeApp)。WAR 变体内置 ConsulListener:以 @ConditionalOnConsulEnabled 判断,若类路径存在 Consul 则在容器启动完成后手动触发 ConsulAutoServiceRegistration.start() 完成注册——即 WAR 部署在外部 Tomcat 时仍可接入 Consul 服务发现。
4.3 Lite 单体(obpm-lite)¶
LiteApp(obpm-lite/src/main/java/cn/myapps/run/LiteApp.java)单进程聚合全部业务模块:
@ComponentScan覆盖cn.myapps.common/core/designtime/job/kms/logger/manager/message/runtime/signon/usercenter/report/ai/converter等全部包- **默认不依赖**服务发现、MQ、Redis(可通过
application.properties开启) - 服务间调用不再走注册中心:Feign 客户端通过
${myapps.feign.lite.url:}直连本进程 HTTP 端口(见 [[module-dependency]] §3) - 启动流程:
Environment.init(args)→AsposeUtil.ensureMacOsLocaleForAspose()(macOS 下 Aspose 兼容)→SpringApplicationBuilder.run
obpm-upgrade 依赖 obpm-lite,为系统升级工具。
5. 分层架构¶
graph TD
subgraph 变体层["部署变体(薄壳:主类 + 注册中心依赖 + 配置)"]
CONSUL["*-consul"] --- EUREKA["*-eureka"] --- NACOS["*-nacos"] --- WAR["*-war"]
end
subgraph 业务服务层["业务服务(可独立部署)"]
RUNTIME[runtime 运行时]
DESIGNER[designer 设计器]
SIGNON[signon 认证]
KMS[kms 知识管理]
MESSAGE[message 消息]
MANAGER[manager 管理中心]
USERCENTER[usercenter 用户中心]
JOB[job 定时任务]
CONVERTER[converter 文件转换]
LOGGER[logger 日志]
REPORT[report 报表]
AI[ai AI 服务]
end
subgraph 核心层
CORE["core(runtime/dynaform、workflow、designtime、authtime 等核心库)"]
COMMON["common(工具类、常量、application-base.properties)"]
SQLPARSER["sqlparser(ANTLR SQL 解析,独立)"]
end
LITE["lite(单体聚合,依赖全部业务服务)"]
UPGRADE["upgrade(升级工具,依赖 lite)"]
CONSUL & EUREKA & NACOS & WAR --> 业务服务层
RUNTIME & DESIGNER & KMS & MANAGER & JOB & REPORT & USERCENTER & AI --> CORE
SIGNON & MESSAGE & CONVERTER & LOGGER --> COMMON
CORE --> COMMON
LITE --> 业务服务层
UPGRADE --> LITE
依赖矩阵与每模块职责详见 [[module-dependency]]。
6. 核心包结构(obpm-core)¶
obpm-core/src/main/java/cn/myapps/core/
runtime/ # 运行时核心
dynaform/ # 动态表单系统
document/ # 文档管理(DQL 解析器、多数据库 DAO)
form/ # 表单字段与表单处理
workflow/ # 工作流引擎(storage 存储实现)
log/ logger/ # 日志
scheduler/ # 调度
widget/ print/ report/ mobile/ macro/ counter/ comment/ callback/ common/
designtime/ # 设计时服务(application 应用管理、form 表单设计服务)
authtime/ # 认证授权(user、department、domain 多租户域)
datamodel/ # 数据模型
common/ # 通用 DAO 接口、数据模型
init/ # 初始化(InitApplicationTable 动态表初始化)
scheduler/ support/ util/ web/ constans/
关键架构模式:
- Process 工厂模式:
ProcessFactory为各实体创建进程实例;标准命名*Process接口 +*ProcessBean实现(如DocumentProcess、UserProcess、DepartmentProcess)。 - 动态表单系统:表单对应运行时动态表,每种数据库有独立 DAO 实现(
Mysql*DAO、Oracle*DAO、PostgreSQL*DAO…);表单结构由FormTableProcess/FormDesignTimeService管理。 - 基于域的多租户:
Domain实体(cn.myapps.core.authtime.domain),每域拥有独立的应用与用户集。 - 设计态文件存储:设计定义以 JAXB XML 存于
{myapps.storage.root}/workspace,Designer 写盘、Runtime 缓存读取 +url.index热加载,详见 [[../workspace-structure-and-mechanism]]。
7. 配置管理链¶
obpm-common/src/main/resources/application-base.properties # 基础配置(日志、eureka 客户端、feign 超时、缓存、MQ 等)
↓ spring.config.import: optional:application-base.properties
各服务 application.yml(提示不要覆盖此文件中的属性)
↓
各变体 application.properties(端口、context-path、myapps.storage.root 等)
↓ Environment.init(args) 启动时覆盖(存储根路径解析等)
myapps.storage.root(默认示例 C:\storage)决定 workspace 与日志位置:日志写入 ${myapps.storage.root}/logs/service/{app}@{ip}_{port}.log(单文件 200MB,保留 7 天)。
8. 构建与运行¶
| 操作 | 命令 |
|---|---|
| 构建指定变体 | mvn clean package -Dmaven.test.skip=true -pl obpm-runtime-consul -am |
| Lite 安装 | mvn clean install -Dmaven.test.skip=true -pl obpm-lite -am |
| 单个服务运行 | 各 *-consul 模块 run.bat / debug.bat |
| H2 DAO 测试 | mvn test -Dtest=H2DocStaticTblDAOTest_Simple -pl obpm-core(或根目录 run-h2-dao-tests.sh) |
环境搭建与源码导读见 source-code-development-guid/(环境搭建、web/service 源码解读)。