返回

Nacos 配置刷新引发的数据库连接失败 1045 问题详解

后端

Spring Cloud + Nacos + Jasypt:解决配置刷新后数据库连接 1045 异常

配置管理与 Jasypt

微服务架构中,配置管理至关重要,Spring Cloud + Nacos 是一个流行的解决方案,用于轻松管理配置。Jasypt 库可用于加密敏感数据,例如数据库密码,以确保安全性。

问题:数据库连接失败异常

使用 Spring Cloud + Nacos + Jasypt 时,在修改 Nacos 配置并重新发布后,可能遇到数据库偶尔连接失败的问题,并报出 1045 异常。

原因分析

此问题源于 Spring Boot 自动刷新配置并重新加载应用程序上下文。然而,Jasypt 加密的数据库密码在应用程序上下文中被缓存,因此不会更新。应用程序使用缓存的加密密码尝试连接数据库,但该密码已过期,导致连接失败。

动态加密解密解决方案

为解决此问题,我们可以使用 Jasypt 的动态加密解密功能。通过实现 EncryptablePropertySource 接口,我们可以创建一个动态加密解密的属性源。当应用程序刷新配置时,该属性源会自动更新加密密码,确保应用程序成功连接数据库。

实现步骤

  1. 添加 Jasypt 依赖:
<dependency>
  <groupId>com.github.ulisesbocchio</groupId>
  <artifactId>jasypt-spring-boot-starter</artifactId>
  <version>3.0.4</version>
</dependency>
  1. 创建动态加密解密属性源:
@Bean
public EncryptablePropertySource encryptablePropertySource() {
  JasyptStringEncryptor encryptor = new JasyptStringEncryptor();
  encryptor.setPassword(ENCRYPTION_KEY);
  return new EncryptablePropertySource("encryptedProperties", encryptor);
}
  1. 添加加密的数据库密码:
encryptedProperties.spring.datasource.password=ENC(SXVY6ymqc1WWBl2cX0VjGQ==)
  1. 配置 Jasypt:
jasypt:
  encryptor:
    password: ${ENCRYPTION_KEY}
  1. 重启应用程序

总结

通过使用 Jasypt 的动态加密解密功能,我们可以轻松解决 Spring Cloud + Nacos + Jasypt 配置刷新后导致的数据库连接失败 1045 异常。此方法确保应用程序在更新配置后仍能成功连接数据库。

常见问题解答

  1. 如何生成加密密钥?
    您可以使用 Jasypt 提供的 PBEWithMD5AndDES 加密器通过调用 encryptor.encrypt() 方法生成密钥。

  2. 如何添加多个加密的属性?
    您可以在 encryptablePropertySource() 方法中添加多个 Property 对象,每个对象包含一个加密的属性键值对。

  3. Jasypt 是否支持其他加密算法?
    是的,Jasypt 支持多种加密算法,例如 AES、PBEWithMD5AndTripleDES 和更多。

  4. 在 Jasypt 中使用加密密钥是否安全?
    将密钥存储在环境变量或配置文件中,并确保这些文件受到适当保护非常重要。

  5. 我可以在 Java 代码中使用动态加密解密功能吗?
    是的,您可以通过直接使用 EncryptablePropertySource 接口实现此功能。