Ribbon的懒加载会导致一个问题就是Ribbon的懒加载是在第一次方法调用的时候才去初始化LoadBalancer
因为Ribbon的懒加载机制所以会导致在第一个方法调用时候才会去初始化LoadBalancer,然后第一个方法请求过来视乎不仅仅包含HTTP连接和方法的响应时间,还包括了LoadBalancer的创建耗时。假如你的方法本身就比较耗时的话,而且超时时间又设置的比较短,那么很大可能这第一次http调用就会失败。其实还有很多框架也实现了类似的懒加载功能,比如Hibernate的lazy-fetch,懒加载在大部分情况下可以节省系统资源开销,但某些情况下反而导致服务响应时间被延长。
之所以这类问题难以发现的原因,在于它无法稳定重现,比如只能通过重启来重现,对这种问题往往直接从生产环境的log入手去分析是比较有效的手段
解决这个问题就是更改Ribbon的加载方式,将懒加载改为饥饿模式:
开启Ribbon的狂暴模式-饥饿加载
ribbon.eager-load.enabled=true
ribbon.eager-load.clients=ribbon-consumer
第一个参数开启了Ribbon的饥饿加载模式,第二个属性指定了需要应用饥饿加载的服务名称。完成上面配置并再次重启服务,就会发现LoadBalancer初始化日志在方法调用之前就打印出来了。
网友评论