尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

SpringBoot+Vue项目从Tomcat迁移至TongWeb的实战指南与性能调优

SpringBoot+Vue项目从Tomcat迁移至TongWeb的实战指南与性能调优 1. 项目概述从Tomcat到TongWeb的国产化迁移最近在做一个信创适配的项目客户要求将原有的SpringBootVue前后端分离应用从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一样管理数据源、部署应用、查看服务器状态。不过我们部署VueSpringBoot项目更常见的做法是通过命令行或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 -- packagingwar/packaging dependencies !-- 2. 移除内嵌的Tomcat依赖如果是spring-boot-starter-web引入的 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId !-- 排除内嵌的Tomcat -- exclusions exclusion groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-tomcat/artifactId /exclusion /exclusions /dependency !-- 3. 添加Tomcat依赖但scope为provided表示容器会提供 -- !-- 这是为了本地开发和测试时还能以war模式在IDE中运行 -- dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-tomcat/artifactId scopeprovided/scope /dependency !-- 4. 关键添加TongWeb的依赖 -- !-- 你需要将TongWeb提供的jar包安装到本地Maven仓库或上传到公司私服 -- dependency groupIdcom.tongweb/groupId artifactIdtongweb-spring-boot-starter/artifactId !-- 名称可能不同以实际jar包为准 -- version7.0/version !-- 版本与你的TongWeb一致 -- scopeprovided/scope !-- 必须是provided因为部署时TongWeb容器已包含 -- /dependency !-- 其他项目依赖保持不变 -- /dependencies实操心得tongweb-spring-boot-starter这个依赖的准确groupId、artifactId和version必须从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代码需要单独构建。构建Vue项目在你的Vue项目根目录下运行构建命令生成静态文件通常在dist目录。npm run build # 或 yarn build这会产生index.html以及一堆js、css、图片等静态资源。整合到SpringBoot将dist目录下的所有内容复制到SpringBoot项目的src/main/resources/static目录下。这是SpringBoot默认的静态资源路径。操作后你的static目录里应该直接就是index.html、js/、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-*.jar或tongweb-*.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/访问有两种方法将WAR包重命名为ROOT.war再部署。在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.htmlVue应用被加载后路由器就能根据URL正确渲染对应的组件了。4.3 TongWeb性能与稳定性调优部署上去能访问只是第一步要让应用稳定运行还需要对TongWeb进行一些调优。网上有人反馈“tongweb容器运行一天就开始变卡”这通常与内存、线程池配置不当有关。内存设置修改bin/setenv.sh如果没有就创建来调整JVM参数。# 设置JVM堆内存根据服务器物理内存调整一般建议为系统内存的1/4到1/2 export JAVA_OPTS-server -Xms4096m -Xmx4096m -XX:MetaspaceSize256m -XX:MaxMetaspaceSize512m $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设置成一样避免堆内存动态调整带来的性能波动。连接器配置修改conf/server.xml找到HTTP/1.1的Connector配置端口通常是8080。Connector port8080 protocolHTTP/1.1 connectionTimeout20000 redirectPort8443 maxThreads500 !-- 最大线程数根据业务量和服务器性能调整 -- minSpareThreads50 !-- 最小空闲线程数 -- acceptCount100 !-- 等待队列长度 -- maxConnections10000 !-- 最大连接数 -- compressionon !-- 开启压缩提升静态资源传输效率 -- compressionMinSize1024 compressableMimeTypetext/html,text/xml,text/plain,text/css,text/javascript,application/javascript,application/json /maxThreads这是最重要的参数之一。设置太小并发请求多时会排队等待响应变慢设置太大会导致线程上下文切换开销剧增同样变卡。需要根据压测结果调整。acceptCount当所有工作线程都在忙时新来的请求会进入等待队列这个值就是队列长度。队列满了之后新请求会被拒绝。禁用AJP连接器如果你没有用到AJP比如前面没有Apache HTTP Server建议将conf/server.xml中的AJP Connector注释掉减少资源占用和安全风险。实操心得“运行一天变卡”的问题除了检查上述配置一定要监控日志和服务器资源。重点看logs/catalina.out和logs/localhost.yyyy-MM-dd.log是否有内存溢出(OutOfMemoryError)或大量异常堆栈。使用top、free -h命令查看服务器CPU、内存使用情况。使用jps和jstack命令查看Java进程的线程状态是否有大量线程阻塞或死锁。检查应用本身是否有内存泄漏例如未关闭的数据库连接、大对象缓存未清理等。很多时候“变卡”的根因在应用代码而不是中间件。5. 常见问题排查与解决方案实录在实际部署过程中我遇到了不少问题这里把典型的问题和解决方法列出来你可以直接对照排查。问题现象可能原因排查步骤与解决方案应用启动失败unable to start embedded tongweb1.pom.xml中TongWeb依赖不正确或缺失。2. 依赖作用域不是provided导致打包时包含了TongWeb的jar与容器冲突。3. JDK版本不兼容。1. 检查pom.xml确认TongWeb依赖的groupId、artifactId完全正确且来自正确安装的jar包。2. 解压WAR包检查WEB-INF/lib/下是否有tongweb-*.jar或tomcat-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中的maxThreads、acceptCount等参数见4.3节。2. 检查应用日志看是否有数据库连接获取超时的异常。检查连接池配置如HikariCP的maximumPoolSize、leakDetectionThreshold。3. 在出现卡顿时使用jmap -heap pid和jmap -histo:live pid分析内存对象。配合GC日志分析。4. 使用top、vmstat、iostat监控系统资源。检查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属性被设置为false。1. 检查webapps目录及其父目录的读写权限确保运行TongWeb的用户有权写入。2. 检查conf/server.xml中Host标签的autoDeploy属性确保为true。独家避坑技巧依赖管理是第一步也是最重要的一步。在正式打包前最好创建一个干净的Maven本地仓库单独安装TongWeb的依赖并测试一个最简单的SpringBoot Hello World WAR包能否成功部署。这能提前排除90%的依赖冲突问题。日志是你的第一手资料。遇到任何问题不要慌首先打开/usr/local/tongweb/logs/catalina.out从文件末尾往前看错误堆栈。TongWeb的日志格式和Tomcat很像排查思路是相通的。先保证后端API能通再整合前端。可以先注释掉前端静态资源单独测试SpringBoot的REST API在TongWeb上能否正常访问。然后再整合Vue静态文件这样问题隔离更容易定位。性能调优一定要有依据。不要凭感觉修改maxThreads等参数。使用jmeter、wrk等工具对应用进行压测结合jvisualvm或Arthas监控应用运行状态找到瓶颈后再针对性调整。整个从Tomcat迁移到TongWeb部署Vue项目的过程本质上是对SpringBoot部署模型和国产中间件特性的一次深入理解。它不仅仅是改个依赖那么简单涉及到打包方式、运行原理、资源配置和问题排查思路的转变。当你按照上面的步骤走通一遍后以后再遇到其他国产中间件如金蝶AAS、中创InforSuite等的迁移需求也会触类旁通。记住耐心看日志理性做调优大部分问题都能迎刃而解。
返回列表