美文网首页
springboot redis的配置 被环境变量覆盖

springboot redis的配置 被环境变量覆盖

作者: NazgulSun | 来源:发表于2019-07-19 11:08 被阅读0次

    问题描述

    我们在docker 容器里有两个 应用。

    • kgraph 为web app
    • redis 为redis, kgraph 使用如下配置连接到redis

    redis:
    host: redis
    password:
    port: 6379
    database: 0
    timeout: 1000
    pool:
    max-active: 50
    max-wait: 3000
    max-idle: 8
    maxTotal: 1024
    maxWaitMillis: 1000

    我们使用 @Value{redis.port} 去拿数据。
    Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private int com.inkdrop.config.cache.CacheConfiguration.redisPort; nested exception is org.springframework.beans.TypeMismatchException: Failed to convert value of type [java.lang.String] to required type [int]; nested exception is java.lang.NumberFormatException: For input string: "tcp://172.17.0.3:6379"

    非常奇怪的是发现了 redis.port 被 替换成了"tcp://172.17.0.3:6379"。

    原因分析

    springboot 中的redis.port 变量被优先级高的变量覆盖。

    参考
    https://github.com/docker-library/redis/issues/53
    https://docs.docker.com/network/links/
    这两篇文章, docker 在配置 内部子 容器连接的时候,会生存一些列的 环境变量。
    {alias_port} 就是其中一个, 在我们的case 里面就是 redis_port
    而这个环境变量 和我们的 redis.port 刚好重合。

    springboot 启动时候,环境变量的优先级大于 profile 配置文件的优先级。
    并且环境变量的 A_B 会转成 A.B

    解决方案, 不使用docker的links feature,因为是legacy的了。
    或者是 在环境变量命名的时候,不要重复。

    第一种是正确的方法,因为第二种的话, 使用的人并不知道我要避免和环境变量不要冲突。

    相关文章

      网友评论

          本文标题:springboot redis的配置 被环境变量覆盖

          本文链接:https://www.haomeiwen.com/subject/ybrjlctx.html