SpringBoot+Vue项目从Tomcat迁移至TongWeb的实战指南与性能调优
2026/8/22 3:32:42 网站建设 项目流程

1. 项目概述:从Tomcat到TongWeb的国产化迁移

最近在做一个信创适配的项目,客户要求将原有的SpringBoot+Vue前后端分离应用,从Tomcat迁移到国产的东方通TongWeb应用服务器上。这个需求现在越来越普遍,尤其是在一些对技术自主可控有要求的政企、金融项目中。一开始我也觉得,不就是换个中间件吗?把pom.xml里的Tomcat依赖换成TongWeb的,重新打个包部署不就完了?但实际操作下来,发现从环境准备、依赖配置、打包方式到部署优化,每一步都有不少细节和“坑”。特别是Vue这种纯前端项目在TongWeb上的部署,和传统的SpringBoot内嵌Tomcat直接打JAR包运行的模式有很大不同。网上资料比较零散,这次我把整个从零开始的部署流程、遇到的问题以及性能调优的点,系统地梳理一遍,希望能帮你绕过我踩过的那些坑。

简单来说,这个过程的核心是将前后端分离的Vue项目,通过构建成静态资源,并整合到SpringBoot后端项目中,最终部署到TongWeb容器中。它解决了在信创环境下,使用国产中间件承载现代化Web应用的问题。无论你是刚开始接触信创部署的开发者,还是正在为项目国产化改造寻找方案的架构师,这篇从实战中总结的指南都会很有参考价值。

2. 环境准备与TongWeb基础配置

2.1 TongWeb的获取与安装

首先,你得有TongWeb。东方通官网会提供试用版或正式版的下载,根据你的操作系统(通常是Linux)选择对应版本。这里假设你是在一台国产化Linux服务器(如麒麟、统信UOS)上操作。

下载完成后,得到一个类似TongWeb7.0-*.tar.gz的压缩包。安装过程很简单,解压到指定目录即可:

# 假设上传到 /opt 目录 cd /opt tar -zxvf TongWeb7.0-*.tar.gz # 解压后会生成一个 TongWeb7.0 的目录 mv TongWeb7.0 /usr/local/tongweb

解压即安装,TongWeb是绿色版的。接下来需要关注几个关键目录:

  • bin/: 启动脚本所在目录。startserver.sh用于启动,stopserver.sh用于停止。
  • conf/: 配置文件目录,这里的server.xml相当于Tomcat的server.xml,是核心配置。
  • webapps/: 默认的应用部署目录,你打包好的WAR文件就放在这里。
  • logs/: 日志目录,排查问题必看。

注意:生产环境强烈建议创建一个专用的系统用户(如tongweb)来运行TongWeb,而不是直接使用root,这涉及到安全基线要求。你需要修改bin/目录下脚本以及相关文件的所有权。

2.2 启动验证与基础管理

进入bin目录,直接运行启动脚本:

cd /usr/local/tongweb/bin ./startserver.sh

启动成功后,默认会监听9060端口(管理控制台)和8080端口(应用访问)。你可以通过浏览器访问http://服务器IP:9060来打开TongWeb的管理控制台。默认用户名和密码通常在安装文档或conf/tongweb-users.xml中配置,首次登录后请立即修改。

在控制台里,你可以像操作Tomcat一样管理数据源、部署应用、查看服务器状态。不过,我们部署Vue+SpringBoot项目,更常见的做法是通过命令行或CI/CD工具直接放置WAR包到webapps目录,让TongWeb自动解压部署。

2.3 Java环境与项目环境准备

TongWeb运行依赖于JDK。你需要确保服务器上安装了与你的项目兼容的JDK版本(通常是JDK 8或11)。信创环境下,可能需要使用达梦、麒麟等操作系统自带的JDK,或者使用符合要求的OpenJDK发行版。使用java -version确认。

对于你的SpringBoot项目,首先需要在本地开发环境或构建服务器上完成代码调整。核心改动就在pom.xml中。

3. SpringBoot项目核心改造:依赖与打包

这是将项目从“SpringBoot内嵌Tomcat可执行JAR”模式,转变为“可在TongWeb中部署的WAR包”模式的关键一步。

3.1 修改pom.xml:排除Tomcat,引入TongWeb

原来的SpringBoot项目很可能内嵌了Tomcat,打包方式为jar。现在我们需要改成war包,并替换容器依赖。

<!-- 1. 修改打包方式为 war --> <packaging>war</packaging> <dependencies> <!-- 2. 移除内嵌的Tomcat依赖(如果是spring-boot-starter-web引入的) --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <!-- 排除内嵌的Tomcat --> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!-- 3. 添加Tomcat依赖,但scope为provided,表示容器会提供 --> <!-- 这是为了本地开发和测试时,还能以war模式在IDE中运行 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <!-- 4. 关键:添加TongWeb的依赖 --> <!-- 你需要将TongWeb提供的jar包安装到本地Maven仓库,或上传到公司私服 --> <dependency> <groupId>com.tongweb</groupId> <artifactId>tongweb-spring-boot-starter</artifactId> <!-- 名称可能不同,以实际jar包为准 --> <version>7.0</version> <!-- 版本与你的TongWeb一致 --> <scope>provided</scope> <!-- 必须是provided,因为部署时TongWeb容器已包含 --> </dependency> <!-- 其他项目依赖保持不变 --> </dependencies>

实操心得tongweb-spring-boot-starter这个依赖的准确groupIdartifactIdversion必须从TongWeb官方提供的依赖包中获取。通常东方通会提供一个tongweb-xxx.jar文件,你需要使用mvn install:install-file命令将其安装到本地仓库。这一步如果依赖不对,会导致部署时类冲突或类找不到,是第一个大坑。

3.2 修改SpringBoot启动类

为了让SpringBoot应用支持在外部Servlet容器(TongWeb)中启动,需要修改主启动类,使其继承SpringBootServletInitializer并重写configure方法。

import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; @SpringBootApplication public class YourApplication extends SpringBootServletInitializer { // 继承 @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { // 指向原本的启动类 return application.sources(YourApplication.class); } public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }

3.3 Vue前端项目的构建与整合

前后端分离项目,前端Vue代码需要单独构建。

  1. 构建Vue项目:在你的Vue项目根目录下,运行构建命令,生成静态文件(通常在dist目录)。

    npm run build # 或 yarn build

    这会产生index.html以及一堆jscss、图片等静态资源。

  2. 整合到SpringBoot:将dist目录下的所有内容,复制到SpringBoot项目的src/main/resources/static目录下。这是SpringBoot默认的静态资源路径。

    • 操作后,你的static目录里应该直接就是index.htmljs/css/等,而不是一个dist文件夹。
    • 确保src/main/resources/application.properties.yml中,没有配置spring.web.resources.static-locations来覆盖默认值,否则可能导致静态资源访问不到。

为什么这么做?这样打包后的WAR包,既包含了后端Java代码,也包含了前端构建好的静态资源。当WAR包部署到TongWeb后,SpringBoot会像提供普通静态资源一样提供这些前端文件。前端路由(如Vue Router的history模式)需要后端配合,这通常通过一个通用的错误页面转发到index.html来实现,我们稍后在配置中解决。

3.4 打包生成WAR文件

在项目根目录执行Maven打包命令:

mvn clean package -DskipTests

如果一切顺利,你会在target目录下看到生成的你的项目名-版本.war文件。这个WAR包就是我们要部署到TongWeb的最终产物。

注意事项:打包前务必确认tongweb-spring-boot-starter依赖已正确引入且作用域为provided。可以检查打包后的WAR包内WEB-INF/lib目录,不应该包含tomcat-embed-*.jartongweb-*.jar。这些容器相关的jar包应该由TongWeb在运行时提供。

4. 部署与TongWeb关键配置

4.1 部署WAR包到TongWeb

部署方式很简单,将上一步生成的WAR文件,复制到TongWeb的webapps目录下。

cp /path/to/your-project.war /usr/local/tongweb/webapps/

TongWeb会自动解压这个WAR包(生成一个同名的文件夹)并加载应用。你可以通过查看logs/catalina.out(或TongWeb对应的主日志文件)来观察启动过程。

访问应用:如果WAR包名为myapp.war,部署成功后通常可以通过http://服务器IP:8080/myapp来访问你的应用。如果你想用根路径(http://服务器IP:8080/)访问,有两种方法:

  1. 将WAR包重命名为ROOT.war再部署。
  2. 在TongWeb的conf/server.xml中配置Context路径,但更推荐第一种,简单直接。

4.2 解决Vue Router的History模式问题

如果你的Vue项目使用了history模式(URL中没有#),那么当用户直接访问一个前端路由(如/dashboard)或刷新页面时,TongWeb会试图将这个路径当作一个后端请求去处理,结果肯定是404。我们需要配置TongWeb,将所有未知路径的请求都转发到前端的index.html,由Vue Router来处理。

在SpringBoot中,我们可以创建一个简单的错误页面控制器来实现:

import org.springframework.boot.web.servlet.error.ErrorController; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest; @Controller public class VueRouteController implements ErrorController { @RequestMapping("/error") public String handleError(HttpServletRequest request) { // 获取当前错误状态码 Object status = request.getAttribute("javax.servlet.error.status_code"); if (status != null) { Integer statusCode = Integer.valueOf(status.toString()); // 如果是404,则返回index.html,交给前端路由处理 if (statusCode == 404) { return "forward:/index.html"; } } // 其他错误可以返回自定义错误页面,这里简单处理 return "error"; } // Spring Boot 2.5+ 需要重写此方法,返回错误路径 public String getErrorPath() { return "/error"; } }

这样,任何后端没有映射的请求(导致404),都会被这个控制器捕获,并转发到/index.html,Vue应用被加载后,路由器就能根据URL正确渲染对应的组件了。

4.3 TongWeb性能与稳定性调优

部署上去能访问只是第一步,要让应用稳定运行,还需要对TongWeb进行一些调优。网上有人反馈“tongweb容器运行一天就开始变卡”,这通常与内存、线程池配置不当有关。

  1. 内存设置:修改bin/setenv.sh(如果没有就创建)来调整JVM参数。

    # 设置JVM堆内存,根据服务器物理内存调整,一般建议为系统内存的1/4到1/2 export JAVA_OPTS="-server -Xms4096m -Xmx4096m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m $JAVA_OPTS" # 添加GC日志和内存溢出Dump,便于排查 export JAVA_OPTS="$JAVA_OPTS -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump -Xloggc:/path/to/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps"

    -Xms-Xmx设置成一样,避免堆内存动态调整带来的性能波动。

  2. 连接器配置:修改conf/server.xml,找到HTTP/1.1的Connector配置(端口通常是8080)。

    <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" maxThreads="500" <!-- 最大线程数,根据业务量和服务器性能调整 --> minSpareThreads="50" <!-- 最小空闲线程数 --> acceptCount="100" <!-- 等待队列长度 --> maxConnections="10000" <!-- 最大连接数 --> compression="on" <!-- 开启压缩,提升静态资源传输效率 --> compressionMinSize="1024" compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json" />
    • maxThreads:这是最重要的参数之一。设置太小,并发请求多时会排队等待,响应变慢;设置太大,会导致线程上下文切换开销剧增,同样变卡。需要根据压测结果调整。
    • acceptCount:当所有工作线程都在忙时,新来的请求会进入等待队列,这个值就是队列长度。队列满了之后,新请求会被拒绝。
  3. 禁用AJP连接器:如果你没有用到AJP(比如前面没有Apache HTTP Server),建议将conf/server.xml中的AJP Connector注释掉,减少资源占用和安全风险。

实操心得:“运行一天变卡”的问题,除了检查上述配置,一定要监控日志和服务器资源。重点看:

  • logs/catalina.outlogs/localhost.yyyy-MM-dd.log是否有内存溢出(OutOfMemoryError)或大量异常堆栈。
  • 使用topfree -h命令查看服务器CPU、内存使用情况。
  • 使用jpsjstack命令查看Java进程的线程状态,是否有大量线程阻塞或死锁。
  • 检查应用本身是否有内存泄漏,例如未关闭的数据库连接、大对象缓存未清理等。很多时候,“变卡”的根因在应用代码,而不是中间件。

5. 常见问题排查与解决方案实录

在实际部署过程中,我遇到了不少问题,这里把典型的问题和解决方法列出来,你可以直接对照排查。

问题现象可能原因排查步骤与解决方案
应用启动失败,unable to start embedded tongweb1.pom.xml中TongWeb依赖不正确或缺失。
2. 依赖作用域不是provided,导致打包时包含了TongWeb的jar,与容器冲突。
3. JDK版本不兼容。
1. 检查pom.xml,确认TongWeb依赖的groupIdartifactId完全正确,且来自正确安装的jar包。
2. 解压WAR包,检查WEB-INF/lib/下是否有tongweb-*.jartomcat-embed-*.jar。如果有,说明作用域不对,应改为provided
3. 确认服务器上java -version输出与TongWeb要求的版本一致。
静态资源(JS/CSS/图片)访问4041. Vue构建的dist内容没有正确复制到src/main/resources/static下。
2. SpringBoot静态资源路径被自定义配置覆盖。
3. TongWeb中应用的上下文路径(Context Path)不对。
1. 检查打包后的WAR包内容,确认static目录下存在前端资源。
2. 检查application.properties,确保没有设置spring.web.resources.static-locations
3. 访问时确认URL路径。如果WAR包叫app.war,访问路径应为http://ip:8080/app/。尝试直接访问一个确切的静态文件,如http://ip:8080/app/js/app.xxx.js来定位。
前端页面空白,或路由跳转后404Vue Router的history模式未在后端正确配置。按照上文4.2节的方法,创建VueRouteController,将404错误转发到index.html。确保该控制器被Spring扫描到。
应用运行一段时间后响应变慢,甚至卡死1. TongWeb线程池耗尽。
2. 数据库连接池泄漏。
3. 应用内存泄漏(如缓存无限增长、未关闭的流)。
4. 服务器资源(CPU、内存、磁盘IO)耗尽。
1. 调优server.xml中的maxThreadsacceptCount等参数(见4.3节)。
2. 检查应用日志,看是否有数据库连接获取超时的异常。检查连接池配置(如HikariCP的maximumPoolSizeleakDetectionThreshold)。
3. 在出现卡顿时,使用jmap -heap <pid>jmap -histo:live <pid>分析内存对象。配合GC日志分析。
4. 使用topvmstatiostat监控系统资源。检查logs/catalina.out是否有OOM错误。
管理控制台(9060端口)无法访问1. 防火墙或安全组未开放9060端口。
2.conf/server.xml中管理控制台的Connector配置被修改或禁用。
3. 用户权限文件配置错误。
1. 检查防火墙规则:firewall-cmd --list-all(CentOS 7+) 或iptables -L
2. 检查conf/server.xml,确认有端口为9060的Connector且未被注释。
3. 检查conf/tongweb-users.xml,确认配置了具有manager-gui角色的用户。
部署时WAR包不自动解压webapps目录权限不足,或TongWeb的autoDeploy属性被设置为false1. 检查webapps目录及其父目录的读写权限,确保运行TongWeb的用户有权写入。
2. 检查conf/server.xmlHost标签的autoDeploy属性,确保为true

独家避坑技巧

  • 依赖管理是第一步,也是最重要的一步。在正式打包前,最好创建一个干净的Maven本地仓库,单独安装TongWeb的依赖并测试一个最简单的SpringBoot Hello World WAR包能否成功部署。这能提前排除90%的依赖冲突问题。
  • 日志是你的第一手资料。遇到任何问题,不要慌,首先打开/usr/local/tongweb/logs/catalina.out,从文件末尾往前看错误堆栈。TongWeb的日志格式和Tomcat很像,排查思路是相通的。
  • 先保证后端API能通,再整合前端。可以先注释掉前端静态资源,单独测试SpringBoot的REST API在TongWeb上能否正常访问。然后再整合Vue静态文件,这样问题隔离,更容易定位。
  • 性能调优一定要有依据。不要凭感觉修改maxThreads等参数。使用jmeterwrk等工具对应用进行压测,结合jvisualvmArthas监控应用运行状态,找到瓶颈后再针对性调整。

整个从Tomcat迁移到TongWeb部署Vue项目的过程,本质上是对SpringBoot部署模型和国产中间件特性的一次深入理解。它不仅仅是改个依赖那么简单,涉及到打包方式、运行原理、资源配置和问题排查思路的转变。当你按照上面的步骤走通一遍后,以后再遇到其他国产中间件(如金蝶AAS、中创InforSuite等)的迁移需求,也会触类旁通。记住,耐心看日志,理性做调优,大部分问题都能迎刃而解。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询