tomcat 单host 模式原理介绍详看这里
base 为普通 springboot 改造成的基座,改造内容为在 pom 里增加如下依赖
<!-- 这里添加动态模块相关依赖 -->
<!-- 务必将次依赖放在构建 pom 的第一个依赖引入, 并且设置 type= pom,
原理请参考这里 https://sofaserverless.gitee.io/docs/contribution-guidelines/runtime/multi-app-padater/ -->
<dependency>
<groupId>com.alipay.sofa.serverless</groupId>
<artifactId>sofa-serverless-base-starter</artifactId>
<version>${sofa.serverless.runtime.version}</version>
<type>pom</type>
</dependency>
<!-- end 动态模块相关依赖 -->
<!-- 这里添加 tomcat 单 host 模式部署多web应用的依赖 -->
<dependency>
<groupId>com.alipay.sofa</groupId>
<artifactId>web-ark-plugin</artifactId>
</dependency>
<!-- end 单 host 部署的依赖 -->
biz 包含两个模块,分别为 biz1 和 biz2, 都是普通 springboot,修改打包插件方式为 sofaArk biz 模块打包方式,打包为 ark biz jar 包,打包插件配置如下:
<!-- 修改打包插件为 sofa-ark biz 打包插件,打包成 ark biz jar -->
<plugin>
<groupId>com.alipay.sofa</groupId>
<artifactId>sofa-ark-maven-plugin</artifactId>
<version>${sofa.ark.version}</version>
<executions>
<execution>
<id>default-cli</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<skipArkExecutable>true</skipArkExecutable>
<outputDirectory>./target</outputDirectory>
<bizName>${bizName}</bizName>
<!-- 单host下需更换 web context path -->
<webContextPath>${bizName}</webContextPath>
<declaredMode>true</declaredMode>
</configuration>
</plugin>
注意这里将不同 biz 的web context path 修改成不同的值,以此才能成功在一个 tomcat host 里安装多个 web 应用。
- 执行 mvn clean package -DskipTests
- 启动基座应用 base,确保基座启动成功
- 执行 curl 命令安装 biz1 和 biz2
curl --location --request POST 'localhost:1238/installBiz' \
--header 'Content-Type: application/json' \
--data '{
"bizName": "biz1",
"bizVersion": "0.0.1-SNAPSHOT",
// local path should start with file://, alse support remote url which can be downloaded
"bizUrl": "file:///path/to/springboot-samples/samples/web/tomcat/biz1/target/biz1-web-single-host-0.0.1-SNAPSHOT-ark-biz.jar"
}'
curl --location --request POST 'localhost:1238/installBiz' \
--header 'Content-Type: application/json' \
--data '{
"bizName": "biz2",
"bizVersion": "0.0.1-SNAPSHOT",
// local path should start with file://, alse support remote url which can be downloaded
"bizUrl": "file:///path/to/springboot-samples/samples/web/tomcat/biz2/target/biz2-web-single-host-0.0.1-SNAPSHOT-ark-biz.jar"
}'
如果想验证热部署,可以通过多次卸载多次部署,然后验证请求是否正常
curl --location --request POST 'localhost:1238/uninstallBiz' \
--header 'Content-Type: application/json' \
--data '{
"bizName": "biz1",
"bizVersion": "0.0.1-SNAPSHOT"
}'
- 发起请求验证
curl http://localhost:8080/biz1
返回 hello to /biz1 deploy
curl http://localhost:8080/biz2
返回 hello to /biz2 deploy
说明,单host模式应用多次热部署正常。
- 也可以验证基座调用模块能力
curl http://localhost:8080/order1
curl http://localhost:8080/order2
这里主要使用简单应用做验证,如果复杂应用,需要注意模块做好瘦身,基座有的依赖,模块尽可能设置成 provided,尽可能使用基座的依赖。
- cd 到 static-deploy-demo 目录下。
- 执行 run_static_deploy_on_unix_like.sh 脚本。
- 构建 web/tomcat 项目。
- 把 biz1 和 biz2 的构建产物移动到 ./biz 目录下。
- 在基座启动时扫描该上述目录,完成静态合并部署。
- 观测日志,进行验证。
观测到如下关键日志,代表静态合并部署开始了:
2023-xx-xx xx:xx:xx.xxx INFO 39753 --- [ main] arklet : start to batch deploy from local dir:./biz
2023-xx-xx xx:xx:xx.xxx INFO 39753 --- [ main] arklet : Found biz jar file: ~/sofa-serverless/samples/springboot-samples/web/tomcat/static-deploy-demo/./biz/biz1-web-single-host-0.0.1-SNAPSHOT-ark-biz.jar
2023-xx-xx xx:xx:xx.xxx INFO 39753 --- [ main] arklet : Found biz jar file: ~/sofa-serverless/samples/springboot-samples/web/tomcat/static-deploy-demo/./biz/biz2-web-single-host-0.0.1-SNAPSHOT-ark-biz.jar
观测到如下关键日志,代表静态合并部署成功了:
2023-xx-xx xx:xx:xx.xxx INFO 39753 --- [ main] arklet : ~/sofa-serverless/samples/springboot-samples/web/tomcat/static-deploy-demo/./biz/biz1-web-single-host-0.0.1-SNAPSHOT-ark-biz.jar, SUCCESS, Install Biz: biz1:0.0.1-SNAPSHOT success, cost: 4756 ms, started at: xx:xx:xx,xxx, BatchDeployResult
2023-xx-xx xx:xx:xx.xxx INFO 39753 --- [ main] arklet : ~/sofa-serverless/samples/springboot-samples/web/tomcat/static-deploy-demo/./biz/biz2-web-single-host-0.0.1-SNAPSHOT-ark-biz.jar, SUCCESS, Install Biz: biz2:0.0.1-SNAPSHOT success, cost: 4756 ms, started at: xx:xx:xx,xxx, BatchDeployResult
可以通过执行如下 curl 验证是否部署成功:
curl http://localhost:8080/biz1
curl http://localhost:8080/biz2