美文网首页
skywalking的日常维护1:com.netflix.zuu

skywalking的日常维护1:com.netflix.zuu

作者: rock_fish | 来源:发表于2021-08-20 15:12 被阅读0次

    1. 浏览器页面的现象

    拓扑页面无数据
    F12查看请求的响应信息

    {"timestamp":1629431149673,"status":500,"error":"Internal Server Error","exception":"com.netflix.zuul.exception.ZuulException","message":"GENERAL"}
    

    2. webapp中的日志

            at com.netflix.hystrix.HystrixCommand.queue(HystrixCommand.java:378)
            at com.netflix.hystrix.HystrixCommand.execute(HystrixCommand.java:344)
            at org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter.forward(RibbonRoutingFilter.java:158)
            ... 67 common frames omitted
    Caused by: java.lang.RuntimeException: java.net.SocketTimeoutException: Read timed out
            at rx.exceptions.Exceptions.propagate(Exceptions.java:58)
            at rx.observables.BlockingObservable.blockForSingle(BlockingObservable.java:464)
            at rx.observables.BlockingObservable.single(BlockingObservable.java:341)
            at com.netflix.client.AbstractLoadBalancerAwareClient.executeWithLoadBalancer(AbstractLoadBalancerAwareClient.java:112)
            ... 129 common frames omitted
    Caused by: java.net.SocketTimeoutException: Read timed out
            at java.net.SocketInputStream.socketRead0(Native Method)
    

    3. 原理分析

    熔断器启用
    feign.hystrix.enabled=true
    hystrix.command.default.execution.timeout.enabled=true
    
    1. 断路器的超时时间,下级服务返回超出熔断器时间,即便成功,消费端消息也是TIMEOUT,所以一般断路器的超时时间需要大于ribbon的超时时间,ribbon真正去调用下级服务

    2. 当服务的返回时间大于ribbon的超时时间,会触发重试

    3. 断路器默认的超时时间为1000ms,太小了,参考如下方式调试

    hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=60000
    
    断路器hystrix详细设置
    • 当在配置时间窗口内达到此数量的失败后,进行短路。
      默认20个:
    hystrix.command.default.circuitBreaker.requestVolumeThreshold=20
    
    • 短路多久以后开始尝试是否恢复
      默认5s:
    hystrix.command.default.circuitBreaker.sleepWindowInMilliseconds=5
    
    • 出错百分比阈值,当达到此阈值后,开始短路。
      默认50%:
    hystrix.command.default.circuitBreaker.errorThresholdPercentage=50%
    
    ribbon超时设置
    • ribbon请求连接的超时时间,限制3秒内必须请求到服务,并不限制服务处理的返回时间
      ribbon.ConnectTimeout=3000
      ribbon.SocketTimeout=5000

    • 请求处理的超时时间 下级服务响应最大时间,超出时间消费方(路由也是消费方)返回timeout
      ribbon.ReadTimeout=5000

    • 单独设置某个服务的超时时间,会覆盖其他的超时时间限制,服务的名称以注册中心页面显示的名称为准,超时时间不可大于断路器的超时时间
      service-a.ribbon.ReadTimeout=50000
      service-a.ribbon.ConnectTimeout=50000

    重试机制

    • 该参数用来开启重试机制,默认是关闭 默认是关闭 默认是关闭
      spring.cloud.loadbalancer.retry.enabled=true

    • 对所有操作请求都进行重试
      ribbon.OkToRetryOnAllOperations=true

    • 对当前实例的重试次数
      ribbon.MaxAutoRetries=1

    • 切换实例的重试次数
      ribbon.MaxAutoRetriesNextServer=1

    根据如上配置,当访问到故障请求的时候,它会再尝试访问一次当前实例(次数由MaxAutoRetries配置), 如果不行,就换一个实例进行访问,如果还是不行,再换一次实例访问(更换次数由MaxAutoRetriesNextServer配置),如果依然不行,返回失败信息。

    4.修复

    修改配置 :src/main/assembly/webapp.yml

    server:
      port: 8080
    
    collector:
      path: /graphql
      ribbon:
        ReadTimeout: 50000
        ConnectTimeout: 5000
        # Point to all backend's restHost:restPort, split by ,
        listOfServers: xxx.xx.xxx.xxx:12800
    
    hystrix:
      command:
        default:
          execution:
            timeout:
              enabled: true
            isolation:
              thread:
                timeoutInMilliseconds: 60000
    

    参考:
    SpringCloud进阶–Zuul与Ribbon的Timeout配置

    spring cloud各种超时时间及重试设置

    相关文章

      网友评论

          本文标题:skywalking的日常维护1:com.netflix.zuu

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