基本情况:项目始终不能正确加载配置文件里的内容;

表象:

由于ribbon默认的超时时间是1000毫秒,也就是1秒,这肯定是不行的,一请求就会报错:

error: "Gateway Timeout"
message: "com.netflix.zuul.exception.ZuulException: Hystrix Readed time out"
status: 504

所以就在application.properties里配置全局的参数:

接下来就是无休止的坑了,零零散散纠缠了我好几天:这里配置的ribbon.ConnectTimeout和ribbon.ReadTimeout始终就是不生效!

 

经过我一层一层深入的debug源码,绕过了千山万水,问题逐渐清晰起来,真相也逐渐浮出水面:

首先直接看下图,由于项目使用springcloud里的zuul、ribbon、feign,也就是Netflix的套餐组件,配置文件的加载使用了archaius框架,下图是所有的配置文件会加载组装到这个实现类dynamicPropertySupportImpl,里面的configList里存放着容器里的不同环境的配置文件:

我找了很久发现,里面加载的application.properties里的配置内容,竟然只有一个“version”,这根本不是我的application.properties文件嘛。。。所以肯定是存在同一个文件冲突了!

首先从我自己的项目里排查一遍,发现没有重复文件。

然后“ctrl+h”全局搜索“application.properties”,看看我发现了什么:

原来nacos-client-1.0.0.jar里有一个重名配置文件:

真凶就是他了!

 

我们再来大致回顾一下springboot项目加载配置文件的规则和优先级:

1、Spring Boot 提供的 SpringApplication 类会搜索并加载 application.properties 文件来获取配置属性值。SpringApplication 类会依次在下面位置搜索该文件。

  • 项目当前目录的“/config”子目录。
  • 项目当前目录。
  • classpath 中的“/config”包。
  • classpath

2、spring boot项目中同时存在application.properties和application.yml文件时,两个文件都有效,但是application.properties的优先级会比application.yml高。

3、bootstrap.yml 先于 application.yml 加载。

此外,如果你在相同优先级位置同时有application.properties和application.yml,那么application.yml里面的属性就会覆盖application.properties里的属性。

 

这样我终于可以舒口气了,看来对springboot和springcloud里的很多细节都知之甚少,才会导致这次的挫败。有时间还是要耐心仔细的研究学习底层原理才行。

 

修改后再来看看,恢复正常:

再次请求,没有报超时错误了。

这里记录下整个跳坑的经历,希望对大家有一点点帮助。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐