Redisson集成到nacos配置中心的问题
- 背景
- 本地的配置方式
- 放到nacos配置中心的配置文件redisson.yaml
- 出现的问题
- 解决办法
- | 控制符
- 补充
背景
因为微服务项目都需要用到redisson,所以就想着将配置提取出来放到nacos上作为共享配置使用,nacos显示已经加载配置文件了,但项目启动后却没有起作用,本地使用的配置是有作用的
本地的配置方式
spring:
application:
name: xxx-service
redis:
redisson:
file: classpath:redisson.yml
放到nacos配置中心的配置文件redisson.yaml
spring:
redis:
redisson:
config:
# 集群模式
clusterServersConfig:
# 如果当前连接池里的连接数量超过了最小空闲连接数,而同时有连接空闲时间超过了该数值,
# 那么这些连接将会自动被关闭,并从连接池里去掉。时间单位是毫秒。默认10000
idleConnectionTimeout: 10000
# 同节点建立连接时的等待超时。时间单位是毫秒。默认10000
connectTimeout: 5000
# 等待节点回复命令的时间。该时间从命令发送成功时开始计时。默认3000
timeout: 3000
......
这个配置文件看上去没有任何问题,能加载也能读取相关变量,但是就是不能被redisson使用
出现的问题
nacos加载配置文件的时候会进行处理,将文件压缩成一行,一般没问题,但是redisson的配置中会出现一些特殊配置项,比如
codec: !<org.redisson.codec.MarshallingCodec> { }
具体源码没深究,猜测的原因是因为redisson需要读取这些特殊配置,所以针对文件内容不允许换行(乱猜的,很可能不对,欢迎指正)
解决办法
使用 yaml 的特殊字符 | 即可解决问题。
spring:
redis:
redisson:
config: |
# 集群模式
clusterServersConfig:
# 如果当前连接池里的连接数量超过了最小空闲连接数,而同时有连接空闲时间超过了该数值,
# 那么这些连接将会自动被关闭,并从连接池里去掉。时间单位是毫秒。默认10000
idleConnectionTimeout: 10000
# 同节点建立连接时的等待超时。时间单位是毫秒。默认10000
connectTimeout: 5000
# 等待节点回复命令的时间。该时间从命令发送成功时开始计时。默认3000
timeout: 3000
......
| 控制符
| 这个控制符的作用是保留文本每一行尾部的换行符。|会保证整段文本最后有且只有一个换行符。使用 |+ 可以保留整段文本最后的所有换行符,使用 |- 可以删除整段文本最后的所有换行符。
补充
今天追了一下redisson获取config的源码,其中有下面这么一段代码,从代码中可以看出他存储config是以字符串的方式存储的
public class RedissonProperties {
private String config;
private String file;
public RedissonProperties() {
}
....
然后还有这么一段代码,从代码中可以知道先是获取字符串配置信息然后再进行解析
Config config;
if (this.redissonProperties.getConfig() != null) {
try {
config = Config.fromYAML(this.redissonProperties.getConfig());
} catch (IOException var20) {
try {
config = Config.fromJSON(this.redissonProperties.getConfig());
} catch (IOException var19) {
var19.addSuppressed(var20);
throw new IllegalArgumentException("Can't parse config", var19);
}
}
}
---------------------------
public static Config fromYAML(String content) throws IOException {
ConfigSupport support = new ConfigSupport();
return (Config)support.fromYAML(content, Config.class);
}
最后我们再回到yaml的特殊字符 | 上去,根据 | 字符代表的含义可以知道它会保留争端文本的最后一个换行符,举例来说
YAML格式
key: |
a
b
c
实际效果
“key”: “a\nb\nc\n”
所以答案就显而易见了,只有加了| 才符合redisson读取字符串类型的config信息