• Spring Cloud第一次请求报错问题


    一、原因 

    我们在使用Spring Cloud的Ribbon或Feign来实现服务调用的时候,第一次请求经常会经常发生超时报错,而之后的调用就没有问题了。造成第一次服务调用出现失败的原因主要是Ribbon进行客户端负载均衡的Client并不是在服务启动的时候就初始化好的,而是在调用的时候才会去创建相应的Client,所以第一次调用的耗时不仅仅包含发送HTTP请求的时间,还包含了创建RibbonClient的时间,这样一来如果创建时间速度较慢,同时设置的超时时间又比较短的话,很容易就会出现上面所描述的显现。

    二、Ribbon timeout默认值

    RibbonClientConfiguration 类中,Ribbon的默认timeout时间默认设置为1秒

    public class RibbonClientConfiguration {
        public static final int DEFAULT_CONNECT_TIMEOUT = 1000;
        public static final int DEFAULT_READ_TIMEOUT = 1000;
        public static final boolean DEFAULT_GZIP_PAYLOAD = true;
        @RibbonClientName
        private String name = "client";
        @Autowired
        private PropertiesFactory propertiesFactory;
    
        public RibbonClientConfiguration() {
        }
    }

    DEFAULT_READ_TIMEOUT默认设置为1秒,如果第一次请求响应时间超过了1秒,就会产生超时错误,我们可以在application.yml文件中做如下设置:

    #建议3-5秒
    ribbon:
    ReadTimeout: 5000
    ConnectTimeout: 5000
    #Ribbon的饥饿加载(eager-load)模式
    eager-load:
    #开启Ribbon的饥饿加载模式
    enabled: true
    #指定需要饥饿加载的客户端名称、服务名
    clients: spring-application-name服务名称

    Eclipse或者Intellij IDEA里,这两个timeout时间属性是不会有提示的,这个很正常。不是所有的属性,IDE都能正常提示的,不过没关系,不影响使用的。只要你配置了,Ribbon就好按照你配置的来。

    三、feign请求超时问题 (断点调试经常遇到 )

    解决办法如下: 

     开启hystrix,配置hystrix的超时时间

    #feign客户端启动hystrix断路保护
    feign: hystrix: enabled:
    true hystrix: command: default: execution: isolation: thread: #断路器超时时间 默认1秒,首次访问时间比较长,容易造成访问超时的问题,这边设置成5秒以解决该问题 timeoutInMilliseconds: 60000

     

  • 相关阅读:
    Java可变参数
    为什么static方法中不可以调用非static方法
    用注解@DelcareParents实现引用增强
    在SpringBoot中用SpringAOP实现日志记录功能
    梳理一下我理解的aop
    包裹iframe的div与iframe存在高度差的问题解决方案
    非跨域情况下iframe 高度自适应的问题解决(一)
    flex布局较之float布局的优点新发现
    webpack4 动态导入文件 dynamic-import 报错的解决方法
    vue chrome 浏览器调试工具devtools插件安装
  • 原文地址:https://www.cnblogs.com/shaolixin/p/11491791.html
Copyright © 2020-2023  润新知