如何在老旧Tomcat部署JDBC环境的Spring Cloud Config及多环境应用
解决方案:Spring Cloud Config Server(jdbc环境)与客户端(dev/prod环境)的独立配置
这其实是个非常常见的场景——Config Server的运行profile(用来指定它自身的配置存储方式,比如jdbc)和客户端的业务profile(用来拉取对应环境的业务配置,比如dev/prod)是完全独立的,不会互相干扰。下面是具体的实现步骤:
1. 配置并部署Config Server到老旧Tomcat(启用jdbc环境)
首先要确保Config Server以war包形式部署,并且启动时激活jdbc profile:
1.1 打包Config Server为war包
修改Config Server的pom.xml:
- 将
<packaging>设置为war - 排除内置Tomcat依赖(避免和外部Tomcat冲突):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
- 确保你的启动类继承
SpringBootServletInitializer:
@SpringBootApplication @EnableConfigServer public class ConfigServerApplication extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(ConfigServerApplication.class); } public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class, args); } }
1.2 配置Config Server的jdbc环境
创建application-jdbc.yml(或application-jdbc.properties),配置数据库连接和Config Server的jdbc存储规则:
spring: datasource: url: jdbc:mysql://your-db-host:3306/config_db?useSSL=false&serverTimezone=UTC username: db_user password: db_password driver-class-name: com.mysql.cj.jdbc.Driver cloud: config: server: jdbc: # 自定义查询SQL(如果你的表结构和默认不一致) sql: SELECT profile, `key`, value FROM config_properties WHERE application = ? AND profile = ? AND label = ?
然后选择一种方式激活jdbc profile:
- 方式一:在
application.yml中默认激活
spring: profiles: active: jdbc
- 方式二:通过Tomcat启动参数指定(更灵活,适合不同部署场景)
在Tomcat的bin/catalina.sh(Linux)或catalina.bat(Windows)中添加:# Linux示例 export JAVA_OPTS="$JAVA_OPTS -Dspring.profiles.active=jdbc":: Windows示例 set JAVA_OPTS=%JAVA_OPTS% -Dspring.profiles.active=jdbc
1.3 部署到Tomcat
将打包好的war包放到Tomcat的webapps目录下,启动Tomcat即可。此时Config Server会以jdbc环境运行,从指定数据库中读取配置。
2. 配置客户端Spring Boot应用(启用dev/prod环境)
客户端只需要指定Config Server的地址,以及自己的业务profile即可:
2.1 配置客户端的bootstrap文件
注意:必须使用bootstrap.yml或bootstrap.properties,因为Config Server的配置需要在应用启动早期加载,优先级高于application.yml。
示例bootstrap.yml:
spring: application: name: your-client-app-name # 对应数据库中application字段的值 cloud: config: uri: http://your-tomcat-host:8080/config-server-war-name # Config Server的访问地址 profiles: active: dev # 或者prod,根据业务环境选择
2.2 确保数据库中存在对应客户端的配置
在Config Server连接的数据库中,确保存在对应客户端的dev/prod环境配置。比如你的配置表结构如下:
| application | profile | label | key | value |
|---|---|---|---|---|
| your-client-app-name | dev | master | server.port | 8081 |
| your-client-app-name | dev | master | app.feature.enabled | true |
| your-client-app-name | prod | master | server.port | 8082 |
| your-client-app-name | prod | master | app.feature.enabled | false |
这样客户端启动时,会根据自己的spring.profiles.active值,从Config Server拉取对应环境的配置。
3. 关键注意事项
- 区分两个profile的作用:Config Server的
jdbcprofile是用来告诉它“用数据库存储配置”,而客户端的dev/prodprofile是用来获取“对应业务环境的配置”,两者完全独立,不会互相覆盖或冲突。 - Tomcat版本兼容性:老旧Tomcat可能版本较低,比如Tomcat 7仅支持Spring Boot 1.x,Tomcat 8.5+支持Spring Boot 2.x,需要根据Tomcat版本调整Spring Boot的版本。
- 配置优先级:客户端的
bootstrap文件优先级高于application文件,必须用它来配置Config Server相关参数,否则可能出现配置加载失败的情况。
内容的提问来源于stack exchange,提问作者Code Junkie




