springboot项目东方通TongWeb改造适配
一、背景
在全球化背景下,为确保国家安全、推动产业升级、满足市场需求和技术进步,国产化成为国家发展战略的重要组成部分,旨在打造一个更加安全、自主、可控的信息技术生态环境。本文章的背景就是客户企业响应国产化政策,要求系统能够适配东方通,在东方通TongWeb上部署运行。
二、改造项目介绍
本文章改造适配的项目是使用的前后端分离的框架,只记录后端springboot项目的改造适配的过程。改造的项目使用的springboot是2.4.3版本。项目在生产环境都是打包成jar包,用jar包部署运行。
三、适配东方通
本文章记录的适配方式有两种,一种是嵌入式适配,在pom.xml中直接配置依赖,嵌入内置TongWeb容器,替代Tomcat,适配完成后打包成可执行 jar 包,按照原来的jar包方式部署运行。另外一种是打包成可执行 war 包,使用TongWeb进行安装部署。
本次项目适配版本:
tongweb嵌入式版本是TongWeb7.0.E.6_P8。
TongWeb企业版的版本是TongWeb7.0.4.9_M3。
1.嵌入式适配
根据东方通官方文档介绍,TongWeb 嵌入式版 Web 容器需要结合 Spring Boot 框架应用,TongWeb 应用服务器运行所需的 jar 资源包,可以根据不同的场景进行引入分别支持以下四种方式引入容器依赖 jar 资源包。
• 方式一:pom.xml中直接配置依赖
• 方式二:嵌入可执行 jar 包
• 方式三:嵌入可执行 war 包
• 方式四:作为外部 jar 包
本次采用的适配方式是方式一,在pom.xml中直接配置依赖。
1.1 pom.xml中直接配置依赖
在springboot项目的pom.xml中配置tongweb-spring-boot-starter依赖,同时排除掉springboot自带的 tomcat 的依赖。(在前面改造项目介绍时提到了springboot的版本,是因为这种方式不同的springboot版本引入相关依赖的版本不同)
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-tomcat
com.tongweb.springboot
tongweb-spring-boot-starter-2.x
7.0.E.6_P8
如果在pom.xml中单独引入了tomcat相关的依赖,也需要去掉。比如下图的就是本次项目中的tomcat相关依赖,全部注释掉了。
1.2 修改Server容器相关配置
在application.properties中配置的server相关参数都是tomcat的,使用tongweb替换了tomcat后,相关的server参数需要修改。
原来的参数配置:
########################Spring Server容器相关配置(默认使用Tomcat作为server)
#编码格式
server.tomcat.uri-encoding = UTF-8
#最小备用线程数
server.tomcat.threads.min-spare = 250
#可创建的最大线程数。超过这个请求数后,进入排队队列(服务器CUP核心数的200~250倍之间)
server.tomcat.threads.max = 2000
#等待队列数,上面配置超出后的请求暂时放在这里
server.tomcat.accept-count = 1000
#同一时间能接受的最大连接数(>可创建的最大线程数+等待队列数)
server.tomcat.max-connections = 3500
#请求等待超时时间5s
server.tomcat.connection-timeout = 500000ms
#取消tomcat上传文件大小限制
server.tomcat.max-swallow-size = -1
server.tomcat.max-http-form-post-size = -1
修改后的参数配置:
########################Spring Server容器相关配置(使用TongWeb作为server)
#设定URI的解码字符集
server.tongweb.uri-encoding = UTF-8
#最小工作线程,连接池中应用保护的最小空余线路数
server.tongweb.min-spare-threads = 250
#设置tongweb的最大工作线程数
server.tongweb.max-threads=2000
#最大等待队列大小
server.tongweb.accept-count = 1000
#设置最大连接数
server.tongweb.max-connections = 3500
#连接超时时间 (毫秒) 使用值 -1 表示没有(即无限)超时。 Spring Boot 1.x与Spring Boot 2.x 中涉及时间单位配置入参单位均不同,
# Spring Boot 2.x支持ms、s、m、h、d等时间单位,默认ms,Spring Boot仅支持Int或Long型数值 默认值:20000
server.tongweb.connection-timeout= 500000ms
#请求体能吞下的最大数量
server.tongweb.max-swallow-size = -1
#最大post请求大小,单位为KB、MB。 如果不加单位默认采用Byte作为单位,
# 例: server.tongweb.max-http-post-size=1,表示1字节。 不配置该参数表示不限
#server.tongweb.max-http-post-size=2MB
1.3 配置license相关参数
嵌入式版 TongWeb 启动需依赖授权文件校验,申领授权文件(license.dat)需要联系东方通销售人员。嵌入式版 TongWeb 支持两种授权认证方式,分别是“本地认证”和“远程认证”。
本地认证:
通过读取本地的 license.dat 文件进行授权认证。
支持“通过配置文件配置”和“通过启动参数配置”两种方式。
远程认证:
License Server 远程认证,是通过远程搭建的 License Server 服务进行远程授权认证。
支持“通过配置文件配置”和“通过启动参数配置”两种方式。
几种认证方式详细可以查看东方通官方文档,本项目适配使用的是本地认证,通过配置文件配置的方式。在application.properties文件中添加如下配置。
#东方通license相关
server.tongweb.license.type = file
server.tongweb.license.path = C:\tongweb\license.dat
将以上几个步骤的事情做完,第一种嵌入式适配基本上大功告成!!
2.打包成war包在TongWeb企业版部署web应用
以TongWeb企业版部署war包的这种方式适配,就不需要在pom.xml中引入tongweb相关的依赖了。TongWeb企业版已经有相关的类,如果再引入相关依赖war应用包里的WEB-INF/lib目录下有tongweb相关的jar,这样导致TongWeb企业版的类调用TongWeb嵌入版的类来解析TongWeb企业版的conf/default-web.xml文件,这样部署的时候会有如下报错。
2.1 pom.xml中排除tomcat配置依赖并修改打包方式
在springboot项目的pom.xml中排除掉springboot自带的 tomcat 的依赖。
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-tomcat
如果在pom.xml中单独引入了tomcat相关的依赖,也需要去掉。比如下图的就是本次项目中的tomcat相关依赖,全部注释掉了。
在pom.xml中修改项目的打包方式为war包。
war
2.2 增加类 ServletInitializer
新建一个ServletInitializer类继承SpringBootServletInitializer,放在启动类同目录。
package com.ty;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(IntePDMApplication.class);
}
}
还有种方式可以启动类直接继承SpringBootServletInitializer,重写对应的configure方法。
2.3 修改Server容器相关配置
和第一种嵌入式的一样,可参考前面的第一种方式的内容,这里不再赘述。
2.4 配置license相关参数
和第一种嵌入式的一样,可参考前面的第一种方式的内容,这里不再赘述。
2.5 修改server.servlet.context-path
在application.properties文件中注释掉server.servlet.context-path配置。(这里如果不注释掉,在TongWeb企业版中部署成功了,访问不到对应接口,在TongWeb企业版部署应用的时候可以在页面配置对应的前缀)
将以上几个步骤的事情做完,第二种打包成war包在TongWeb企业版部署web应用的适配基本上大功告成!!
四、小结
以上两种方式的适配改造步骤仅供参考,具体方式可以根据实际项目适配的情况选择。其中还有很多可以优化的地方,欢迎指教。