Zuul ribbon 重试机制

问题描述:

Zuul转发POST请求接口异常,read timeout,没有进行重试,期望进行重试!

配置参数模拟

spring.cloud.loadbalancer.retry.enabled=true

ribbon.ConnectTimeout=5000

ribbon.ReadTimeout=5000

ribbon.OkToRetryOnAllOperations=true

ribbon.MaxAutoRetries=1

ribbon.MaxAutoRetriesNextServer=0

问题分析

  1. post请求read timeout 是否需要进行重试
  2. ribbon重试的条件是什么
  3. 为什么参数没有没有达到预期的重试效果

首先AbstractLoadBalancingClient的实现类有4个

先看下这些client开启的地方

org.springframework.cloud.netflix.ribbon.apache HttpClientRibbonConfiguration

在HttpClientRibbonConfiguration(按照spring的套路必有XXXConfiguration)

通过HttpClientRibbonConfiguration我们发现下面的代码:

HttpClientRibbonConfiguration开启了两个类

1.RibbonLoadBalancingHttpClient

2.RetryableRibbonLoadBalancingHttpClient(spring-try)

根据org.springframework.retry.support.RetryTemplate 类是否存在,来决定加载哪个ribbonbalance,这个类属于spring-retry包,

从工程中找了一下类,显然没有这个类。显然的是
RibbonLoadBalancingHttpClient ,我们来分析一下这个类是怎么被调用的

因为zuul 引入了ribbion和hystrix 所以我们从org.springframework.cloud.netflix.zuul.filters.route.support. AbstractRibbonCommand 进行入手,因为他继承了HystrixCommand,他的run方法里边必然是调用RibbonLoadBalancingHttpClient入口!

AbstractRibbonCommand里边有个地方需要注意

这里对Ribbon超时时间和hystrix的时间进行了一个校验,getribbontimeout 方法计算得出Ribbon超时时间 和当前的hystrix时间进行对比,hystrixTimeout小于ribbonTimeout,如果出现warn日志,这个就要注意了!

对于inithreadpool 这个方法大家要注意了,里边的hystrix参数很重要,这里就带过了!

结果快速的debug 终于到了关键的地方

这个地方是调用我们上面说的RibbonLoadBalancingHttpClient

这里边有两个关键的参数

OkToRetryOnAllOperations=false

如果这个参数开始,那么无论什么情况调用失败都会重试

okToRetryOnConnectErrors=false

这个是socket连接进行重试

这两个参数在RequestSpecificRetryHandler 类进行逻辑处理,这个方法是当我们zuul转发失败后触发的!

很显然我们配合的参数OkToRetryOnAllOperations是没用的,因为面试写死的false,okToRetryOnConnectErrors配置也是没用的,也是写死的false,那么只有一个条件可以触发,那就是ClientException ,这个异常类什么是否发生?大家可以自己看一下。

通过上面的分析发现RibbonLoadBalancingHttpClient触发retry的条件太苛刻了,只有发生ClientException的时候。

那么RetryableRibbonLoadBalancingHttpClient 如何呢?

我们引入了spring-retry包

略过一些繁琐的步骤,我们找到是否retry的地方

这里边有的变量retryable 他是什么了?进过参数的追踪的发现原来他是zuul.retryable变量默认是false,我们在配置文件设置成true

从代码中可以看出是用到了spring-retry 的 RetryTemplate进行retry!如果retryable设置成ture 才有后面的RetryPolicy策略

进入RetryPolicy我们看一下这个策略条件

RibbonLoadBalancedRetryPolicy 这个类

CanRetry 也就是get请求或者OkToRetryOnAllOperations=true的时候会发生retry

应为配置文件OkToRetryOnAllOperations=true ,所以只要失败就会try,这个做法时候合理吗?

OkHttpRibbonConfiguration开启了两个类

  1. RetryableOkHttpLoadBalancingClient(spring-retry)
  2. OkHttpLoadBalancingClient

我们先来开启OkHttpLoadBalancingClient

ribbon.okhttp.enabled=true

ribbon.httpclient.enabled=false

并没有重试机制

引入spring-retry包

开启RetryableOkHttpLoadBalancingClient 调用了retry策略

总结:

实现AbstractLoadBalancingClient的类有

1.RetryableOkHttpLoadBalancingClient(spring-retry)

开启条件

  1. ribbon.okhttp.enabled=true
  2. ribbon.httpclient.enabled=false
  3. 导入spring-retry

2.OkHttpLoadBalancingClient

开启条件

  1. ribbon.okhttp.enabled=true
  2. ribbon.httpclient.enabled=false

3.RibbonLoadBalancingHttpClient

开启条件

默认

4.RetryableRibbonLoadBalancingHttpClient(spring-try)

开启条件

  1. spring.cloud.loadbalancer.retry.enabled=true
  2. zuul.retryable=true
  3. 导入spring-try

Retry 次数计算

reTry次数的计算= (MaxAutoRetries*+1)*(MaxAutoRetriesNextServer+1)

超时最大时间

ribbonTimeout=(ribbonReadTimeout+ ribbonConnectTimeout) * (maxAutoRetries + 1) * (maxAutoRetriesNextServer+ 1)

引用CSDN HTTPCLIENT和OKHTTP对比

一、HttpClient:

HttpClient 是Apache的一个三方网络框架,网络请求做了完善的封装,api众多,用起来比较方便,开发快。实现比较稳定,bug比较少,但是正式由于其api众多,是我们很难再不破坏兼容性的情况下对其进行扩展。所以,Android团队对提升和优化httpclient积极性并不高。android5.0被废弃,6.0逐渐删除。

二、HttpURLConnection

HttpURLConnection是一个多用途、轻量级的http客户端。它对网络请求的封装没有HttpClient彻底,api比较简单,用起来没有那么方便。但是正是由于此,使得我们能更容易的扩展和优化的HttpURLConnection。不过,再android2.2之前一直存在着一些令人烦的bug,比如一个人可读的inputstream调用它的close方法的时候,会使得连接池实效,通常的做法就是禁用连接池。因此,在android2.2之前建议使用稳定的HttpClient,android2.2之后使用更容易扩展和优化的HttpURLConnection。

三、okhttp

支持Android 2.3及其以上版本;

支持Java JDK 1.7以上版本;

okhttp是专注于提升网络连接效率的http客户端。

1、它能实现同一ip和端口的请求重用一个socket,这种方式能大大降低网络连接的时间,和每次请求都建立socket,再断开socket的方式相比,降低了服务器服务器的压力。

2、okhttp 对http和https都有良好的支持。

3、okhttp 不用担心android版本变换的困扰。

4、成熟的网络请求解决方案,比HttpURLConnection更好用。

4、缺点,okhttp请求网络切换回来是在线程里面的,不是在主线程,不能直接刷新UI,需要我们手动处理。封装比较麻烦。

四、Volley

Volley是google在2013 io大会上推出的网络通信框架,特别适合处理数据量小,通信频繁的网络操作。优点是内部封装了异步线程,可直接在主线程请求网络,并处理返回的结果。同时可以取消请求,容易扩展。缺点是:面对大数据量的请求,比如下载表现糟糕,不支持https。Volley的底层在针对android2.3以下系统使用httpclicent,在android2.3以上采用HttpUrlConnection请求网络。

本公司的选择:

公司使用Volley框架来处理网络请求,但是,当数据量需求越来大的时候,Volley在面对大数据量的网络请求的表现并不好,加上公司大量采用https协议。于是,公司网络请求采用了Volley+okhttp。正如我们采用这种方式的优势有:

1、okhttp 不用担心android版本变换的困扰。

2、okhttp 对大数据量的网络请求支持非常好。

3、okhttp 同时支持http和https

4、okhttp 重用socket连接,网络请求效率非常高。

5、Volley框架在异步请求的封装非常好,对子线程网络请求,主线程更新UI支持非常好。能像Image-Loader一样轻松加载网络图片。

总之,网络请求底层采用okhttp,异步回调使用Volley框架。

后续还有对xutils 和 Retrofit2的分析。

作者:heqinglin8

来源:CSDN

原文:https://blog.csdn.net/langtop/article/details/77972855

版权声明:本文为博主原创文章,转载请附上博文链接!

Zuul ribbon 重试失效分析相关推荐

  1. 动态加载laydate 失效_弹簧的失效分析与预防技术参考

    弹簧是通用机械必不可少的部件.在工作过程中起到缓冲平衡.储能.自动控制.回位.安全保险等作用.在弹簧的使用过程中,机械故障往往是由于各种原因造成的.为此,有必要探讨弹簧失效的原因及预防措施. 导致弹簧 ...

  2. 名词解释失效安全_09失效分析复习题新

    (a) 1 -纤维区: 2 -放射区: 3 -剪切唇 (b) 1 -纤维区: 2 -放射区: 3 -最后破坏区 (c) 1 -纤维区: 2 -放射区: 3 -剪切唇 第一章 问答题 1 零件失效即失去 ...

  3. cat 常用的日志分析架构方案_芯片失效分析常用方法及解决方案

    一般来说,芯片在研发.生产过程中出现错误是不可避免的,就如房缺补漏一样,哪里出了问题你不仅要解决问题,还要思考为什么会出现问题.随着人们对产品质量和可靠性要求的不断提高,失效分析工作也显得越来越重要, ...

  4. resttemplate 请求重试_使用Spring Cloud Ribbon重试请求

    使用Spring Cloud Ribbon重试请求 在微服务调用中,一些微服务圈可能调用失败,通过再次调用以达到系统稳定性效果,本文展示如何使用Ribbon和Spring Retry进行请求再次重试调 ...

  5. colspan会影响内部单元格宽度失效_电感失效分析

    电感失效分析 01 电感的作用 我们通常所说的电感指的是电感器件,它是用绝缘导线(例如漆包线,沙包线等)绕制而成的电磁感应元件. 在电路中,当电流流过导体时,会产生电磁场,电磁场的大小除以电流的大小就 ...

  6. 第一次失效_特斯拉螺栓腐蚀失效分析_搜狐汽车

    本文车型速览 × 除了文章作者的主观观点外,我们正尝试基于全网可查的客观数据,为您提供中立.客观的参考依据: 本文部分车型速览: 展开 × 微信扫码,直接一次看完附近所有城市低价 (附近城市均有经销商 ...

  7. 深入分析Ribbon源码分析

    本文来分析下Ribbon源码 文章目录 Ribbon源码分析 负载均衡器 AbstractLoadBalancer BaseLoadBalancer DynamicServerListLoadBala ...

  8. dfmea文件_技术干货合集「失效分析、PFMEA DFMEA关系、文件结果化」

    失效分析 根据过程步骤,导出失效并从功能分析中创建失效链(即失效结构/失效树/失效网)-[详情见过程FMEA步骤三:功能分析] 失效结构的关注要素被称为失效模式,失效模式存在相应的失效影响和失效起因. ...

  9. 差速齿轮原理_减速箱差速器行星轮圆柱销失效分析

    点击上方右侧"EDC电驱未来"可订阅哦! [摘要]通过分析差速器的工作原理,对行星轮圆柱销及行星轮的连接关系进行简化,并简化为滑动轴承的连接关系,这种连接关系符合滑动轴承的承载能力 ...

最新文章

  1. Android性能优化面试题集锦,终局之战
  2. 框架:SpringMVC常用注解总结
  3. cmake / add_compile_options、CMAKE_CXX_FLAGS 和 add_definitions 区别
  4. HarmonyOS之深入解析WLAN的功能和使用
  5. Mybatis中jdbcType和javaType的对应关系
  6. android gif转jpg格式文件,android使用多张图片合成gif文件
  7. Linux下Redis的安装和部署
  8. 【研报分享】华为鸿蒙深度研究.pdf(附下载链接)
  9. 微信小程序之页面跳转
  10. Python关键点常识
  11. python-31:然而我发现结果并不是我想要的
  12. IIS配置aspnet常见为题
  13. 2017.8.22坐标问题
  14. Atitit 减少财政支出----普通人如何蹭政府补贴措施 attilax大总结.docx
  15. mysql中的like查询能否用的到索引
  16. opencv ffmpeg推流
  17. 思维正好,何不踏歌之“丑数”
  18. 平行四边形图案c语言,使用scratch绘制各种图案-平行四边形【解说】
  19. android 电子签名证书,android 电子签名实现
  20. 电商网上购物成为非洲人喜欢的一种新颖购物方式

热门文章

  1. 更改销售订单客户 20230421OK
  2. 移动端调试工具vConsole与Eruda
  3. 大学计算机基础 学年教学计划,大学计算机基础教学计划.doc
  4. android ble和ios ble 对比,低功耗蓝牙的坑对比,低功耗蓝牙的总结
  5. 三国志战略版改进建议
  6. Git系列之删除文件
  7. SolidWorks安装后别着急用,这八个重要SolidWorks设置可以提高你的画图效率
  8. 向量空间 列空间 零空间
  9. Nginx处理HTTP请求的11个阶段
  10. 深入学习 jQuery 选择器系列第三篇——过滤选择器之索引选择器 - 小火柴的蓝色理想 - 博客园...