springcloud+ribbon+nacos遇到的一个坑
基本情况:项目始终不能正确加载配置文件里的内容;表象:由于ribbon默认的超时时间是1000毫秒,也就是1秒,这肯定是不行的,一请求就会报错:error: "Gateway Timeout"message: "com.netflix.zuul.exception.ZuulException: Hystrix Readed time out"status: 504所以就在ap...
基本情况:项目始终不能正确加载配置文件里的内容;
表象:
由于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里的很多细节都知之甚少,才会导致这次的挫败。有时间还是要耐心仔细的研究学习底层原理才行。
修改后再来看看,恢复正常:
再次请求,没有报超时错误了。
这里记录下整个跳坑的经历,希望对大家有一点点帮助。
更多推荐
所有评论(0)