Redisson集成到nacos配置中心的问题

背景

因为微服务项目都需要用到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信息

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值