如何根据数据库配置选择对应Nacos的bootstrap.yml配置文件?
实现方案
Spring Cloud 中 bootstrap 配置的加载时机早于 Spring 应用上下文初始化,所以我们需要在环境准备阶段插入自定义的数据库查询逻辑,根据返回值指定要激活的 bootstrap 配置 profile,即可实现动态加载对应 Nacos 配置的需求。
具体操作步骤
1. 调整配置文件命名
保持你现有的 bootstrap-a.yml、bootstrap-b.yml 两个配置文件,对应 profile a 和 b,新增基础 bootstrap.yml 用来配置查询数据库所需的固定参数:
# bootstrap.yml 基础配置 custom: db: # 存储loadVariable的数据库连接信息 url: jdbc:mysql://你的数据库地址:3306/库名?useUnicode=true&characterEncoding=utf8 username: 数据库用户名 password: 数据库密码
两个Nacos配置示例:
# bootstrap-a.yml 配置 spring: cloud: nacos: discovery: server-addr: NacosA实例IP:8848 config: server-addr: NacosA实例IP:8848
# bootstrap-b.yml 配置 spring: cloud: nacos: discovery: server-addr: NacosB实例IP:8848 config: server-addr: NacosB实例IP:8848
2. 实现自定义启动监听器
实现 SpringApplicationRunListener 接口,在环境准备阶段查询数据库获取 loadVariable,并设置激活的profile:
package 你的包名; import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplicationRunListener; import org.springframework.core.env.ConfigurableEnvironment; import java.sql.*; public class DynamicNacosConfigListener implements SpringApplicationRunListener { public DynamicNacosConfigListener(SpringApplication application, String[] args) { } @Override public void environmentPrepared(ConfigurableEnvironment environment) { // 读取基础配置中的数据库连接信息 String dbUrl = environment.getProperty("custom.db.url"); String dbUsername = environment.getProperty("custom.db.username"); String dbPassword = environment.getProperty("custom.db.password"); String loadVariable = null; // 手动创建JDBC连接查询配置(此时Spring容器未初始化,不能注入DataSource) try (Connection conn = DriverManager.getConnection(dbUrl, dbUsername, dbPassword); PreparedStatement ps = conn.prepareStatement("SELECT config_value FROM 你的配置表 WHERE config_key = 'loadVariable'"); ResultSet rs = ps.executeQuery()) { if (rs.next()) { loadVariable = rs.getString("config_value").trim(); } } catch (SQLException e) { throw new RuntimeException("查询loadVariable配置失败", e); } // 根据返回值设置激活的profile if ("A".equals(loadVariable)) { environment.addActiveProfile("a"); } else if ("B".equals(loadVariable)) { environment.addActiveProfile("b"); } else { throw new IllegalArgumentException("非法的loadVariable值: " + loadVariable); } } }
3. 注册监听器
在项目 resources/META-INF/spring.factories 文件中添加如下配置,让Spring启动时加载自定义监听器:
org.springframework.boot.SpringApplicationRunListener=你的包名.DynamicNacosConfigListener
验证方式
启动项目后,可通过启动日志查看激活的profile,同时登录对应Nacos控制台即可确认服务是否注册到目标实例。
内容的提问来源于stack exchange,提问作者flower
相关产品推荐
相关产品推荐

