\345\206\205\347\275\256app\350\260\203\346\225\264.md
... ...
@@ -0,0 +1,109 @@
1
+### 方案设计文档
2
+
3
+#### 背景和目标
4
+本方案旨在优化现有系统的内置应用管理方式,通过外置化内置应用、精简 Dockerfile 以及调整应用市场功能,来实现减小镜像大小、简化工程维护,并增强内置应用的灵活性和可维护性。
5
+
6
+#### 主要调整内容
7
+
8
+1. **内置应用外置化**
9
+2. **精简 Dockerfile**
10
+3. **应用市场调整**
11
+4. **通过 MinIO 挂载方式加载应用**
12
+
13
+---
14
+
15
+### 详细方案
16
+
17
+#### 1. 内置应用外置化
18
+
19
+**目标:**
20
+- 将内置应用与普通应用一样,通过挂载的方式统一加载到 `apps` 目录下。
21
+
22
+**好处:**
23
+- 减小镜像大小。
24
+- 减少引擎代码工程中内置应用的 jar 包维护,使项目工程更简洁。
25
+- 可直接沿用已有的apps目录作为挂载点。
26
+
27
+
28
+#### 2. 精简 Dockerfile
29
+
30
+**目标:**
31
+- 去掉 Dockerfile 中的 `cp` 命令,不再需要拷贝源码中的内置应用到镜像中。
32
+
33
+**实现步骤:**
34
+- 删除 Dockerfile 中与内置应用相关的 `COPY` 和 `CMD` 命令。
35
+
36
+
37
+#### 3. 应用市场调整
38
+
39
+**目标:**
40
+- 调整应用市场功能,允许安装内置应用,并通过种子数据的方式预安装所有的内置应用,同时支持内置应用的升级。
41
+
42
+**实现步骤:**
43
+- 修改应用市场的配置和逻辑,允许内置应用的安装和升级。
44
+- 通过种子数据的方式预先配置所有内置应用,并在系统初始化时自动安装这些应用。
45
+
46
+
47
+#### 4. 通过 MinIO 挂载方式加载应用
48
+
49
+**目标:**
50
+- 通过将存储应用市场 jar 的 MinIO 挂载到镜像中,直接加载内置应用和业务应用,而不需要下载 jar。
51
+
52
+**实现步骤:**
53
+- 使用 Kubernetes 的 CSI(Container Storage Interface)驱动将 MinIO 存储挂载到容器中,更为具体方式参考业界方案。
54
+- 修改应用的启动脚本或配置文件,使其能够从挂载的 MinIO 目录中加载应用。
55
+
56
+**示例:**
57
+```yaml
58
+apiVersion: v1
59
+kind: PersistentVolume
60
+metadata:
61
+ name: minio-pv
62
+spec:
63
+ capacity:
64
+ storage: 10Gi
65
+ accessModes:
66
+ - ReadWriteMany
67
+ csi:
68
+ driver: minio.csi.min.io
69
+ volumeHandle: "minio-volume"
70
+ volumeAttributes:
71
+ bucket: "apps"
72
+
73
+---
74
+
75
+apiVersion: v1
76
+kind: PersistentVolumeClaim
77
+metadata:
78
+ name: minio-pvc
79
+spec:
80
+ accessModes:
81
+ - ReadWriteMany
82
+ resources:
83
+ requests:
84
+ storage: 10Gi
85
+
86
+---
87
+
88
+apiVersion: v1
89
+kind: Pod
90
+metadata:
91
+ name: app-pod
92
+spec:
93
+ containers:
94
+ - name: app-container
95
+ image: my-app-image
96
+ volumeMounts:
97
+ - mountPath: "/apps"
98
+ name: minio-apps
99
+ volumes:
100
+ - name: minio-apps
101
+ persistentVolumeClaim:
102
+ claimName: minio-pvc
103
+```
104
+
105
+### 总结
106
+
107
+通过上述方案,内置应用不再打包在镜像中,而是通过挂载的方式统一加载到 `apps` 目录下。此举不仅减小了镜像大小,还简化了工程维护。同时,应用市场也进行了相应调整,允许安装内置应用并支持其升级。最后,作为更简洁的方式,可考虑通过 MinIO 挂载的方式加载应用,进一步简化了应用的加载过程。
108
+此外,可解决在多个容器同时启动时并发拷贝内置应用可能导致的 jar 包找不到的 bug,如下:
109
+![pic](http://iidp.chinasie.com:9999/iidpminio/home/error.png) http://iidp.chinasie.com:9999/iidpminio/home/error.png