IIDP 平台应用市场功能现状梳理
概述
本文档详细描述了 IIDP 平台应用市场的相关功能,包括应用的上传、上架、安装、更新、卸载和删除的具体流程和技术实现。以下内容基于单机版平台的功能实现。
1. 应用上传
功能描述
上传应用的 JAR 包到 meta_attachment
中,对于重复的文件也会当作新的文件处理。优化建议:可以实现一键秒传功能,即如果文件的 MD5 值相同则无需重复上传。
实现细节
-
方法签名:
public String putObject(InputStream inputStream, String fileType, String originalFilename, String bucketName)
-
上传流程:
- 最终调用
base_file
中的upload
方法。 - 在
meta_attachment
中新增一条记录。 - 点击保存后,调用
create
方法,在应用市场创建一条记录,并设置app_market
为noUp
。
- 最终调用
点击展开puml
@startuml
start
:浏览器端上传jar包和前端zip包;
:调用 /file/upload 接口;
:调用 meta_attachment 模型的 upload 方法(这个方法继承自base_file模型);
:根据 minio 配置信息构建 minioTemplate;
:调用 putObject 上传到 minio apps桶下;
:计算 md5 值;
:在 meta_attachment create 新增一条附件记录;
:返回到浏览器;
:用户点击保存;
:调用 meta_app_store 元模型upload 方法;
:将前端上传的 jar 包下载到 apps/uploads 目录下;
:获取 app 的信息 (name, version, summary 等);
:在 meta_app_store 新增一条记录,并设置 state 为 noup;
if (app 有依赖?) then (是)
:在 meta_app_store_dependency 表中新增一条或多条依赖的 app id 信息;
endif
stop
@enduml
分布式模型下,与单机版一致
2. 应用上架
功能描述
计算依赖图,检查依赖的应用是否在应用市场中,修改应用状态为 up
。此过程相当于一次干运行(dry run)。
实现细节
- 依赖检查:确保所有依赖的应用均在应用市场中。
-
状态修改:将应用状态设置为
up
。
点击展开puml
@startuml
start
:如果是单个上架;
: 获取整个应用市场的app,并计算当前待上架app的依赖图;
: 依次检查待上架app的依赖是否已经存在;
if (存在?) then (是)
: 修改app_market状态为up;
else (否)
: 返回上架失败;
endif
stop
@enduml
分布式模式相比于单机版的不同点在于会做一次机审(machineAuditAppGroupContainer),并将初态 loadBussinessApps2Redis
3. 应用安装
功能描述
应用必须先上架后才能安装。安装过程中会获取依赖的应用,初始化策略注册菜单的权限策略,加载应用的配置信息和系统变量,并将状态修改为 installed
。
实现细节
-
安装方法:
installApps
- 获取依赖的应用,调用
buildAppDataInfo
方法。 - 调用
doInstallApps
方法。 - 调用
postInstall
方法。 - 加载种子数据
loadSeedData
。
-
状态修改:将应用状态设置为
installed
。
展开puml
@startuml
start
: 如果是单机模式;
: 从应用市场获取待安装的app信息;
: 根据模式获取loader,这是是单机版的loader;
: 从应用市场获取待安装的app的依赖图,并获取依赖app;
if (依赖的app存在?) then (是)
: 所有的依赖,计算需要安装的引用,更新的应用,初始化: 插入应用,更改应用,初始化菜单等;
: 下载新jar包;
: 恢复之前软删除的其他资源,比如menu、view等;
: doInstallApps、postInstall 统一的方法;
: 调用安装事件 startUpEvent;
else (否)
: 返回上架失败;
endif
stop
@enduml
分布式模式下,请求首先会达到master节点,通过exeMod是否为local来决定是否转发,如果不为local则转发给边车,边车再启动一个容器,然后周期性等待容器就绪,并请求installApps接口,最终完成业务app的安装。
4. 应用卸载
功能描述
除了卸载选中的当前应用,还需要卸载其所依赖的应用。修改数据状态为 uninstalled
,软删除应用的其他资源状态(如菜单、视图等),清理内存中的相关信息。
实现细节
-
状态修改:将应用状态设置为
uninstalled
。 -
资源清理:
- 移除内存信息。
- 清理
appContainer
中的metas
、models
。 - 清理
appDataInfoMap
、appContainerMap
。 - 移除类加载器。
- 清理
appContainerMap
中的finalModelMap
。 - 移除自定义系统变量。
- 重新安装:安装需要重装的应用(按安装流程)。
展开puml
@startuml
start
: 如果是单机模式;
: 初始化当前模式的appLoader;
: 调用loader的uninstallApps方法;
: 获取待卸载的 appGroupContainer,以及 graphs 信息;
: 设置安装状态为 uninstalled;
: 软删除应用的其他资源状态,比如menue、view等;
: 清理出台metas,清理models,以及清理appDataInfoMap和 appContainerMap该app的key;
: 清理该app的类加载器,并设置为null;
: 清理 finalModelMap 终态信息;
: 移除自定义变量;
: 计算需要重装的app,并执行统一的 doInstallApps;
stop
@enduml
分布式模式下,请求首先会在master节点处理,master节点通过 exeMod 为null(即不等于 local)判断是否需要转发,需要转发则请求边车进行转发,边车(携带exeMode为local标记)会转发到真正的业务容器,然后这个业务容器执行卸载操作,移除终态元模型信息、移除策略等(删除操作会内存同步到其他容器,从而达到元模型的一致性)。
5. 应用更新
功能描述
对比应用市场的 MD5 值和已安装的 MD5 值(前提是应用已上架),如果不相等则激活更新。可优化点:仅在有新版本时提示更新,而不是仅基于 MD5 不相等。
实现细节
- MD5 比对:如果上架的应用版本低于已安装版本,也会提示更新,这是需要优化的点。
-
更新流程:
- 点击更新后,比对 MD5 不一致,则下载新的 JAR 包到
apps/modules
目录下。 - 按照install的逻辑执行,同时更新app信息到数据库中。
- 点击更新后,比对 MD5 不一致,则下载新的 JAR 包到
- 分布式模式下,更新会下载最近的jar包,然后调边车直接重启容器即可。
6. 应用删除
功能描述
已经安装过的应用不能删除。否则将直接删除 MetaAppStore
中的记录。
实现细节
- 删除限制:已安装的应用不可删除。
-
记录删除:直接删除
MetaAppStore
中的记录。
分布式模型下,与单机版一致
7. 安装逻辑详细描述 (doInstallApps
)
步骤描述
-
清空应用信息:清空
app
信息,元模型信息,移除类加载器等操作。 - 重置类加载器:通过最新的 JAR 文件设置类加载器,检测循环依赖和配置错误,计算应用安装顺序(基础应用在最前面)。
-
加载初始态元模型:
-
OriginalMeta
:直接通过convert
转换而来的元模型信息,没有继承扩展。 -
appDataInfoMap
:保存的是app.json
信息。 -
appContainerMap
:保存的是元模型相关信息。 -
appGroupContainer
:多个应用组成一个组的map
。
-
-
二次构建:
- 仅处理
ModelMeta
,即model
元模型,并处理继承扩展(仅解析)。
- 仅处理
-
最终构建:
- 处理继承扩展的场景,并构建父信息。
总结
以上是 IIDP 平台应用市场功能的详细技术文档。本文档涵盖了应用上传、上架、安装、更新、卸载和删除的具体实现细节和流程。通过对各功能模块的详细描述,能够帮助开发者更好地理解和使用 IIDP 平台的应用市场功能。同时也概述了分布式模式与单机版的差异点,关于分布式模式可以详细参考:http://192.168.175.198:10001/iidpwiki/%E5%88%86%E5%B8%83%E5%BC%8F%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84%E6%96%B9%E6%A1%88%E8%AE%BE%E8%AE%A1%E5%88%9D%E7%A8%BF.md