Nacos 配置刷新引发的数据库连接失败 1045 问题详解
2023-10-21 00:07:46
Spring Cloud + Nacos + Jasypt:解决配置刷新后数据库连接 1045 异常
配置管理与 Jasypt
微服务架构中,配置管理至关重要,Spring Cloud + Nacos 是一个流行的解决方案,用于轻松管理配置。Jasypt 库可用于加密敏感数据,例如数据库密码,以确保安全性。
问题:数据库连接失败异常
使用 Spring Cloud + Nacos + Jasypt 时,在修改 Nacos 配置并重新发布后,可能遇到数据库偶尔连接失败的问题,并报出 1045 异常。
原因分析
此问题源于 Spring Boot 自动刷新配置并重新加载应用程序上下文。然而,Jasypt 加密的数据库密码在应用程序上下文中被缓存,因此不会更新。应用程序使用缓存的加密密码尝试连接数据库,但该密码已过期,导致连接失败。
动态加密解密解决方案
为解决此问题,我们可以使用 Jasypt 的动态加密解密功能。通过实现 EncryptablePropertySource
接口,我们可以创建一个动态加密解密的属性源。当应用程序刷新配置时,该属性源会自动更新加密密码,确保应用程序成功连接数据库。
实现步骤
- 添加 Jasypt 依赖:
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.4</version>
</dependency>
- 创建动态加密解密属性源:
@Bean
public EncryptablePropertySource encryptablePropertySource() {
JasyptStringEncryptor encryptor = new JasyptStringEncryptor();
encryptor.setPassword(ENCRYPTION_KEY);
return new EncryptablePropertySource("encryptedProperties", encryptor);
}
- 添加加密的数据库密码:
encryptedProperties.spring.datasource.password=ENC(SXVY6ymqc1WWBl2cX0VjGQ==)
- 配置 Jasypt:
jasypt:
encryptor:
password: ${ENCRYPTION_KEY}
- 重启应用程序
总结
通过使用 Jasypt 的动态加密解密功能,我们可以轻松解决 Spring Cloud + Nacos + Jasypt 配置刷新后导致的数据库连接失败 1045 异常。此方法确保应用程序在更新配置后仍能成功连接数据库。
常见问题解答
-
如何生成加密密钥?
您可以使用 Jasypt 提供的PBEWithMD5AndDES
加密器通过调用encryptor.encrypt()
方法生成密钥。 -
如何添加多个加密的属性?
您可以在encryptablePropertySource()
方法中添加多个Property
对象,每个对象包含一个加密的属性键值对。 -
Jasypt 是否支持其他加密算法?
是的,Jasypt 支持多种加密算法,例如 AES、PBEWithMD5AndTripleDES 和更多。 -
在 Jasypt 中使用加密密钥是否安全?
将密钥存储在环境变量或配置文件中,并确保这些文件受到适当保护非常重要。 -
我可以在 Java 代码中使用动态加密解密功能吗?
是的,您可以通过直接使用EncryptablePropertySource
接口实现此功能。