Sping-Cloud使用BUG-01-网关超时

27 篇文章 0 订阅
9 篇文章 0 订阅

使用BUG-01-网关超时

BUG场景

是酱紫的,使用的时候,请求过网关到微服务,2秒以内的请求没有问题,超过的就报超时,【zuul就熔断了】

BUG报错

zuul 报错:timed-out and no fallback available,failed and no fallback available

com.netflix.zuul.exception.ZuulException: Forwarding error
        at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.forward(RibbonRoutingFilter.java:143)
        at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.run(RibbonRoutingFilter.java:107)
        at com.netflix.zuul.ZuulFilter.runFilter(ZuulFilter.java:112)

java.net.SocketTimeoutException: Read timed out
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(SocketInputStream.java:152)
        at java.net.SocketInputStream.read(SocketInputStream.java:122)
        at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:166)
        at org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:90)

解决方案1

timed-out and no fallback available这个错误基本是出现在Hystrix熔断器,熔断器的作用是判断该服务能不能通,如果通了就不管了,调用在指定时间内超时时,就会通过熔断器进行错误返回。

  • 把超时时间设长

    hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000  # 默认值为1000(1秒)
    
  • 把超时发生异常属性关闭

    hystrix.command.default.execution.timeout.enabled: false  
    
  • 禁用feign的hystrix

    feign.hystrix.enabled: false  
    

上面设置其中一个即可。[只是关闭熔断,但是超时的这个错误还是存在的]
上面设置只是针对熔断器的错误关闭,并不能解决根本问题,比如Feign客户端调用远程服务时,默认为8秒超时时间,如果在规定时间内没有返回,同样会跳转到熔断器进行处理。即使关闭了熔断器的错误,但是总的错误处理还会是有这个问题出现。

解决方案2

解决超时问题的根本,就要从请求超时时间入手,因为有些服务可能存在调用时间长的问题,所以直接配置:

ribbon.ReadTimeout=60000
ribbon.ConnectTimeout=60000
这些才是真正解决请求超时的问题,如果不设置这个,被调用接口很慢时,会出现Read Timeout on Request。
ribbon.maxAutoRetries=0  :而针对调用失败重试的次数也可以设置

其他资料

  • 配置说明

    hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000  # 默认值为1000(1秒)
    ribbon:
        ConnectTimeout: 250             :请求连接的超时时间
        ReadTimeout: 1000               :请求处理的超时时间
        OkToRetryOnAllOperations: true  :对所有操作请求都进行重试
        MaxAutoRetriesNextServer: 2     :切换实例的重试次数
        MaxAutoRetries: 2               :对当前实例的重试次数
    # 断路器的超时时间需要大于ribbon的超时时间,不然不会触发重试
    

这里面ribbon和hystrix是同时生效的,哪个值小哪个生效,另一个就看不到效果了。

  • 官方说明:官方文档

    如果您想配置套接字超时以及通过Zuul代理请求读取超时,则根据您的配置,您有两个选项:
    如果Zuul使用服务发现,则需要使用ribbon.ReadTimeout和ribbon.SocketTimeout功能区属性配置这些超时 。
    如果您通过指定URL来配置Zuul路由,则需要使用 zuul.host.connect-timeout-millis和zuul.host.socket-timeout-millis。

具体使用调试

自己使用的时候,使用的是如下配置

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 5000 

ribbon:  
  ReadTimeout: 60000  
  ConnectTimeout: 60000  
  maxAutoRetries: 0         

zuul:
  host:
    connect-timeout-millis: 60000
    socket-timeout-millis: 60000

2018-06-14 小杭


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小_杭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值