nacos连接数据库密码加密
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档nacos数据库密码加密简介修改源码打包发布简介nacos作为一款优秀的注册发现中心和配置管理工具,能够实现微服务配置的热更新,同时从代码中解耦出去,更加自由的控制服务的上线和下线,使所有的操作全部可视化,独立化.关于nacos的入门和配置官网都有非常详细的介绍nacos官网但是在nacos原生版本中,nacos持久化连接mysql数
·
简介
- nacos作为一款优秀的注册发现中心和配置管理工具,能够实现微服务配置的热更新,同时从代码中解耦出去,更加自由的控制服务的上线和下线,使所有的操作全部可视化,独立化.
关于nacos的入门和配置官网都有非常详细的介绍 - nacos官网
- 但是在nacos原生版本中,nacos持久化连接mysql数据库是通过配置文件读取数据库的ip、port、user及password的.
这其实是一种不安全的操作,如果数据库权限约束做的不好,那么数据库密码泄露将是一件很严重的事情.
修改源码
- 完成个性化定制,自定义数据库密码的加密方式,其实并不难,只需要修改nacos源码中数据库连接部分即可
- nacos数据库连接初始化所在的类是com.alibaba.nacos.config.service.DataSource包下的ExternalDataSourceServiceImpl类.完成数据库信息装配的方法是reload()方法.
- 我们需要做的只是在nacos读取到配置文件中的密码之后,并且将属性值赋值到实体类之前将密码解析出来即可,以下是源码以及修改的部分
@Override
public synchronized void reload() throws IOException {
List<HikariDataSource> dblist = new ArrayList<>();
try {
String val = null;
val = ApplicationUtils.getProperty("db.num");
if (null == val) {
throw new IllegalArgumentException("db.num is null");
}
int dbNum = Integer.parseInt(val.trim());
for (int i = 0; i < dbNum; i++) {
HikariDataSource ds = new HikariDataSource();
ds.setDriverClassName(JDBC_DRIVER_NAME);
val = ApplicationUtils.getProperty("db.url." + i);
if (null == val) {
fatalLog.error("db.url." + i + " is null");
throw new IllegalArgumentException("db.url." + i + " is null");
}
ds.setJdbcUrl(val.trim());
val = ApplicationUtils.getProperty("db.user." + i, ApplicationUtils.getProperty("db.user"));
if (null == val) {
fatalLog.error("db.user." + i + " is null");
throw new IllegalArgumentException("db.user." + i + " is null");
}
ds.setUsername(val.trim());
// nacos在这里读取数据库密码
//---------------------------------------------------------------------------------------
val = ApplicationUtils.getProperty("db.password." + i, ApplicationUtils.getProperty("db.password"));
if (null == val) {
fatalLog.error("db.password." + i + " is null");
throw new IllegalArgumentException("db.password." + i + " is null");
}
String trim = val.trim();
// 在这里可以自定义密码的解密规则,以最简单的base64为例,可以替换成自己的解密类
val=new String(Base64.getDecoder().decode(trim));
ds.setPassword(val);
//-------------------------------------------------------------------------------------------
val = ApplicationUtils.getProperty("db.maxPoolSize." + i, ApplicationUtils.getProperty("db.maxPoolSize"));
ds.setMaximumPoolSize(Integer.parseInt(defaultIfNull(val, "20")));
val = ApplicationUtils.getProperty("db.minIdle." + i, ApplicationUtils.getProperty("db.minIdle"));
ds.setMinimumIdle(Integer.parseInt(defaultIfNull(val, "50")));
ds.setConnectionTimeout(3000L);
// 每10分钟检查一遍连接池
ds.setValidationTimeout(TimeUnit.MINUTES.toMillis(10L));
ds.setConnectionTestQuery("SELECT 1 FROM dual");
dblist.add(ds);
JdbcTemplate jdbcTemplate = new JdbcTemplate();
jdbcTemplate.setQueryTimeout(queryTimeout);
jdbcTemplate.setDataSource(ds);
testJTList.add(jdbcTemplate);
isHealthList.add(Boolean.TRUE);
}
if (dblist == null || dblist.size() == 0) {
throw new RuntimeException("no datasource available");
}
dataSourceList = dblist;
new SelectMasterTask().run();
new CheckDBHealthTask().run();
} catch (RuntimeException e) {
fatalLog.error(DB_LOAD_ERROR_MSG, e);
throw new IOException(e);
} finally {
}
}
同时这个类中其他所有的属性都可以根据自己的需要去进行修改,也可以自己实现这个实现类的父接口,不过只是修改密码规则的话还是建议直接在这里修改
打包发布
- 修改完源码需要将源码包打包成可以使用的jar包
在nacos顶级包路径下打开控制台(IDEA的terminal也可以),输入以下命令
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U
- 然后等待打包成功.
打包好的包位置:nacos-xxx\distribution\target\nacos-server-xxx.zip - 修改配置文件中的密码,用自己定义的加密方式加密一遍
- 启动nacos,登录到控制台,日志没有报错那么修改nacos密码连接方式就完成了
以上就是修改nacos数据库连接的全部教程,其实很简单,希望能帮到你.
更多推荐
已为社区贡献1条内容
所有评论(0)