宝兰德服务器部署(BES AppServer)
本小节,讲解宝兰德 BES AppServer 的部署方式。
| 原组件 | 宝兰德组件 | 作用 |
|---|---|---|
| Tomcat | BES Application Server(BES AppServer) | 运行 Java 后端应用 |
| Redis | BES CacheDB | 缓存、登录令牌、分布式锁、限流和消息 |
BES CacheDB 的安装、项目连接和 Redis 兼容性验证,可参考 《国产信创数据库》。Tomcat 的 WAR 部署,可参考 《Tomcat WAR 部署》。东方通的部署,可参考 《东方通服务器部署》。
注意:本文尚未在宝兰德介质上验收!
本文根据项目源码,以及宝兰德、Spring Boot 的公开资料整理,没有在 BES AppServer 的实际介质上完成部署验收。依赖坐标、版本号、授权方式和控制台操作,以你从宝兰德取得的介质及对应手册为准。
# 1. 环境准备
① 从 宝兰德官网 (opens new window) 或商务渠道,获取对应产品的安装介质、授权文件和部署手册。
注意,BES AppServer、CacheDB 是不同产品,需要分别准备安装介质和授权。
② 按项目分支,确认 BES AppServer 的版本。外部容器的最低要求,来自对应 Spring Boot 版本的 System Requirements:
| 项目分支 | JDK | Spring Boot | Servlet 命名空间 | 外部 Servlet 容器要求 |
|---|---|---|---|---|
master | 8 | 2.7.x | javax.servlet | Servlet 3.1+ |
master-jdk17 | 17+ | 3.5.x | jakarta.servlet | Servlet 5.0+ |
master-jdk25 | 25 | 4.x | jakarta.servlet | Servlet 6.1+ |
宝兰德有多个产品线,同样叫 “9.5” 的还有 9.5.2、9.5.5 等多个历史版本,只看 “9.5” 无法判断是否兼容。公开资料中,BES Lite 9.5 支持的是 Servlet 3.1(javax),只适用于 master 分支;master-jdk17、master-jdk25 分支需要支持 Jakarta EE(jakarta.*)、并满足上表 Servlet 版本的 BES 版本,具体版本号请向宝兰德确认。
另外,项目的 WebSocket 基于 Spring WebSocket 实现,不同分支对 BES 的要求如下:
master分支(Spring Framework 5.3):默认只识别 Tomcat、Jetty、Undertow、GlassFish、WebLogic、WebSphere 等容器的 WebSocket 实现。如果 BES 介质没有提供可识别的实现,项目启动时就会报No suitable default RequestUpgradeStrategy found错误,需要由宝兰德提供兼容的实现。不需要 WebSocket 时,可以配置yudao.websocket.enable=false关闭,站内信推送等 WebSocket 功能也会一并关闭。master-jdk17分支(Spring Framework 6.2):在 Tomcat、Jetty、Undertow 等以外的容器上,使用 Jakarta WebSocket 2.1 的标准升级接口,所以 BES 还需要支持 Jakarta WebSocket 2.1,否则站内信推送等 WebSocket 功能无法使用。master-jdk25分支(Spring Framework 7):在 Jetty 以外的容器上,使用 Jakarta WebSocket 2.1+ 的标准升级接口,所以 BES 除了满足上表的 Servlet 6.1+,还需要支持 Jakarta WebSocket 2.1 及以上版本。
③ 先准备项目数据库和缓存,确认后端使用 java -jar 可以独立启动、登录。关系型数据库、BES CacheDB 可参考 《国产信创数据库》。
# 2. BES AppServer 部署
BES AppServer 是 Java 应用服务器,可以作为外部服务器部署 WAR,也可以使用厂商的嵌入式组件替换 Spring Boot 内嵌 Tomcat。
# 2.1 WAR 方式
① 参考 《Tomcat WAR 部署》,完成 yudao-server 的 WAR 打包类型、Tomcat 的 provided 依赖和启动类配置。
注意,spring-boot-starter-validation 也依赖了 tomcat-embed-el,所以 WAR 中会保留它,供参数校验使用。如果 BES 启动时报 jakarta.el 相关的类冲突,并且 BES 本身提供了 EL 实现,可以参考 《东方通服务器部署》 将它设置为 provided。
② 在 yudao-server/pom.xml 增加 Maven profile,关闭 repackage,生成供外部 BES 部署的标准 WAR:
<profiles>
<profile>
<id>bes-war</id>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
如果原来已有 profiles,将这个 profile 合并进去。项目根目录执行:
mvn clean package -pl yudao-server -am -Pbes-war -DskipTests
产物为 yudao-server/target/yudao-server.war。检查归档内容:
unzip -l yudao-server/target/yudao-server.war | grep -E "BOOT-INF|lib-provided|tomcat-embed"
标准 WAR 使用 WEB-INF/classes、WEB-INF/lib,不包含 BOOT-INF、WEB-INF/lib-provided;tomcat-embed-* 只应剩下 tomcat-embed-el。
疑问:是否需要像其它项目那样,注释 WebSocket、排除 JPA?
不需要。网上 BES 的部署教程中,会注释 ServerEndpointExporter、排除 Hibernate 的 JPA 自动配置。而项目没有使用 @ServerEndpoint、ServerEndpointExporter,WebSocket 通过 Spring 的 WebSocketConfigurer 注册;也没有引入 Hibernate ORM、JPA,所以不涉及这两处修改。
③ 按对应版本手册安装、启动 BES AppServer,再通过管理控制台部署 WAR,将应用前缀(上下文)设置为 /。前端访问的 /admin-api、/app-api 都位于根路径下。
启动 BES 的 JVM 前设置 SPRING_PROFILES_ACTIVE,加载你准备好的环境配置。数据库、CacheDB 的地址和密码也需要配置到该环境中;容器内的 127.0.0.1 指向容器自身。
注意,WAR 部署时 server.port 不再生效,端口由 BES 的监听器决定。配置文件中的 spring.boot.admin.client.url 使用了 ${server.port},需要将 server.port 改成 BES 的应用端口,或直接修改该地址;前端、反向代理指向的后端端口,也要改成 BES 的应用端口。
BES 的安装目录、启动脚本、端口和控制台操作随版本变化,按对应介质手册操作。
# 2.2 嵌入式方式
使用厂商提供的 Spring Boot 嵌入式 starter 替换内嵌 Tomcat,配置授权后通过 java -jar 启动。
① 从宝兰德获取与项目 Spring Boot 版本匹配的嵌入式介质,按介质说明将 jar 安装到本地 Maven 仓库或私服。这些 jar 不在 Maven 中央仓库。
注意,介质需要与分支匹配:面向 Spring Boot 2.x(javax)的介质只适用于 master 分支;master-jdk17、master-jdk25 分支需要面向对应 Spring Boot 3.x、4.x(jakarta)的介质。向宝兰德索取介质时,说明项目的 Spring Boot 版本,并以介质附带的说明确认依赖坐标和版本。
② 修改 yudao-server/pom.xml,排除内嵌 Tomcat,并引入宝兰德的嵌入式 starter:
<!-- 排除内置 Tomcat -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 宝兰德嵌入式 starter:groupId、artifactId、version 以厂商介质为准 -->
<dependency>
<groupId>{groupId}</groupId>
<artifactId>{artifactId}</artifactId>
<version>{version}</version>
</dependency>
WebSocket、国密等可选模块,按介质说明一并引入。
③ 打包后,确认 jar 中不再包含 tomcat-embed-core、tomcat-embed-websocket:
mvn clean package -pl yudao-server -am -DskipTests
unzip -l yudao-server/target/yudao-server.jar | grep -E "tomcat-embed|bes"
如果 Tomcat 仍然通过其它依赖传递进来,需要逐一排除,避免同时存在两个 Web 容器。
④ 按介质手册放置授权文件,再启动项目:
java -jar yudao-server/target/yudao-server.jar --spring.profiles.active=dev
启动日志中不再出现 Tomcat started on port,而是 BES 的启动信息。之后登录管理后台,并验证文件上传、WebSocket 等功能。授权缺失或过期时,获取对应版本的有效授权。