美文网首页java相关工作生活
Spring Cloud Feign 使用的坑

Spring Cloud Feign 使用的坑

作者: 时间道 | 来源:发表于2019-07-03 20:19 被阅读0次

    背景

    项目采用 springcloud 架构,使用 feign 做接口调用,项目已经运行很长时间。
    最近刚发现服务重启后的一段时间访问很慢,有很多如下的日志:

    2019-07-02 18:26:06.406 INFO  [http-nio-8080-exec-1] org.springframework.context.annotation.AnnotationConfigApplicationContext:583 8d40dc484a9e5e79202d8f1705501502 - Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@1b9834d4: startup date [Tue Jul 02 18:26:06 CST 2019]; parent: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@53b32d7
    2019-07-02 18:26:06.425 INFO  [http-nio-8080-exec-1] org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor:155 8d40dc484a9e5e79202d8f1705501502 - JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
    

    断点发现,都是在调用 feign 接口时,才会触发 spring的 refresh,所以进一步查看为什么会触发这个机制,接着查看,发现 feign 使用的 ribbon的loadbalance 方式导致的。
    然后看了下官方文档,发现确实有eager-load这个相关的配置。

    解决方案

    spring cloud 使用用 feign 的 loadbalance做接口调用,默认是延迟加载eager-load=false,
    第一次请求(针对每个client的)的时候才会加载,导致第一次请求会慢,并发的时候也容易造成等待现象。

    可以通过设置,在初始化时直接加载,会延长一些启动时间。需要把不开启延迟加载的 serviceid 配置一下,必须配置ribbon.eager-load.clients,要不然不生效。
    设置参考如下:

    ribbon.eager-load.enabled=true
    ribbon.eager-load.clients=dispatcher-driver-service,driverCommonService,passenger-settlementGroup-service,passenger-syrepoGroup-service
    

    zuul 使用 ribbon 时,也有通用的问题,对应的配置为:
    zuul.ribbon.eager-load.enabled=true

    参考资料

    相关文章

      网友评论

        本文标题:Spring Cloud Feign 使用的坑

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