Demo项目采用Spring Cloud 微服务架构,各个SpringBoot项目通过Fegin进行相互调用,但是在使用过程中发现,第一次通过Feign调用其它服务时,总会走到熔断器进行熔断。定位发现Hystrix 熔断器的请求默认超时时间是1s。而第一次调用时会进行初始化ribbon相关组件,超过了1s,导致等待结果超时,就熔断了。
找了很多博客,很多给出的答案都是加大超时时间,比如给5s或者更长,我觉得这个是不正确的。虽然解决了这个问题,但是会有隐患:当这个接口并发大的时候,如果超时时间比较长,则会很快消耗完连接池的连。
更优雅的解决方式:
1. 开启ribbon 的饥饿初始化,即服务启动时就初始化ribbon和feign相关组件
ribbon:
eager-load:
enabled: true #开启饥饿加载 解决第一次feign调用失败的问题
clients: commodity-center #需要饥饿加载的服务名称
2. 开启DispatchServlet默认初始化
spring:
mvc:
servlet:
load-on-startup: 0 # 启动时立即初始化 dispatcherServlet,数值表示延迟多久进行自动初始化dispatcherServlet,0是立即初始化
配置后项目启动日志:
日志截图
然后再进行第一次Feign请求,问题已解决。
网友评论