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信息