• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Redisson集成到nacos配置心的问题

武飞扬头像
竹杖芒鞋敲代码
帮助1

背景

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

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhiafjih
系列文章
更多 icon
同类精品
更多 icon
继续加载