Atitit httpclient feign使用总结RestTemplate

Httpclient重要的功能

重试与超时

  1. RedirectExec执行器的默认策略是,在接收到重定向错误码301与307时会继续访问重定向的地址

所以,HttpClient有默认的执行器RetryExec,其默认的重试策略是DefaultHttpRequestRetryHandler。

目录

1.1. HttpClient有默认的执行器RetryExec 1

2. 五、重试策略对业务的影响  2

2.1. 5.1 我们的业务重试了吗? 2

3. 七、本文总结 3

3.1. Feign RestTemplate 4

3.2. RestTemplate  exchange  而不是getfor  postforxxx的优点 5

  1. HttpClient有默认的执行器RetryExec

关于RetryExec执行器的执行过程,做一个阶段小结:

  1. RetryExec在执行http请求的时候使用的是底层的基础代码MainClientExec,并记录了发送次数
  2. 当发生IOException的时候,判断是否要重试
    1.   首先是根据重试策略DefaultHttpRequestRetryHandler判断,如果可以重试就继续

      1. 判断当前request是否还可以再次发起
    2.   如果重试策略判断不可以重试了,就抛相应异常并退出

通过构造器可以看到,默认的重试策略是:

  1. 重试3次
  2. 如果请求被成功发送过,就不再重试了
  3. InterruptedIOException、UnknownHostException、ConnectException、SSLException,发生这4中异常不重试

关于默认的重试策略,做一个阶段小结:

  1. 如果重试超过3次,则不再重试
  2. 几种特殊异常及其子类,不进行重试
  3. 同一个请求在异步任务重已经被终止,则不进行重试
  4. 幂等的方法可以进行重试,比如Get
  5. 如果请求没有发送成功,可以进行重试。
  1. 五、重试策略对业务的影响 

    1. 5.1 我们的业务重试了吗?

  对于我们的场景应用中的get与post,可以总结为:

  1. 只有发生IOExecetion时才会发生重试
  2. InterruptedIOException、UnknownHostException、ConnectException、SSLException,发生这4中异常不重试
  3. get方法可以重试3次,post方法在socket对应的输出流没有被write并flush成功时可以重试3次。

首先分析下不重试的异常:

  1. InterruptedIOException,线程中断异常
  2. UnknownHostException,找不到对应host
  3. ConnectException,找到了host但是建立连接失败。
  4. SSLException,https认证异常

另外,我们还经常会提到两种超时,连接超时与读超时:

  1. java.net.SocketTimeoutException: Read timed out
  2. java.net.SocketTimeoutException: connect timed out

这两种超时都是SocketTimeoutException,继承自InterruptedIOException,属于上面的第1种线程中断异常,不会进行重试。

  1. 七、本文总结

通过本文分析,可以得知HttpClient默认是有重试机制的,其重试策略是:

  1.只有发生IOExecetion时才会发生重试

  2.InterruptedIOException、UnknownHostException、ConnectException、SSLException,发生这4中异常不重试

  3.get方法可以重试3次,post方法在socket对应的输出流没有被write并flush成功时可以重试3次。

  4.读/写超时不进行重试

  5.socket传输中被重置或关闭会进行重试

  6.以及一些其他的IOException,暂时分析不出来。

来的时候掉接口需要三次重试,由于对httpclient不是很了解。只能在for循环里面对异常经常处理并重新调接口。后来做http服务端的时候,有次debug偶然发现客户端调一次请求,服务端会跳多次debug,后来查阅资料发现httpclient有重试机制。

今天做了个通天塔接口重试的需求,便想起来了httpclient的重试机制。

查了很久资料,也测试了很多次。后来终于成功了。是通过设置httpclient 的retryHandler来实现。
不多说废话,直接贴代码,如下:

/**

     * @param isPooled 是否使用连接池

     */

public static CloseableHttpClient getClient(boolean isPooled) {

HttpRequestRetryHandler handler = new HttpRequestRetryHandler() {

  1. Feign RestTemplate  

package commxx;

import java.net.URI;

import java.net.URISyntaxException;

import feign.Client;

import feign.Feign;

import feign.RequestLine;

import feign.Retryer;

import feign.Target;

import feign.codec.Encoder;

import feign.codec.Encoder.Default;

import feign.codec.StringDecoder;

public class FeignTest {

public interface someItfs {

@RequestLine("GET")

String getx(URI baseUri);

}

public static void main(String[] args) throws URISyntaxException {

String url = "http://www.baidu.com/s?wd=ddd";  //ok..

someItfs someItfs1 = Feign.builder()

// .logger(new FeignInfoLogger()) // 自定义日志类,继承 feign.Logger

// .logLevel(Logger.Level.BASIC)// 日志级别

// Default(long period, long maxPeriod, int maxAttempts)

.client(new Client.Default(null, null))// 默认 http

.retryer(new Retryer.Default(5000, 5000, 1))// 5s超时,仅1次重试

// .encoder(Encoder)

// .decoder(new StringDecoder())

.target(Target.EmptyTarget.create(someItfs.class));

//  String url = "http://localhost:9104/";

//

System.out.println(someItfs1.getx(new URI(url)));

}

}

  1. RestTemplate  exchange  而不是getfor  postforxxx的优点

exchange

image

RestTempalte中定义很多重载的exchange()方法,如下
String|URL :请求路径
HttpMethod:Http的动作,如Get、delete等
requestEntity():在请求中发送资源,get可以为null
responseType(如果要获取状态码和header可使用ResponseEntity<T>):返回数据的类型
Map/Object... :填充Url的参数

exchange()利用HttpMethod这个参数,可以完成其他RestTemplate方法的工作,如上GET、POST、DELETE、PUT等。exchange()优于其他方法的点事它可以在发送给服务器的请求中加入头信息。

(400条消息) HttpClient重试机制 --- 自定义HttpRequestRetryHandler(自定义 重试次数以及重试的时候业务处理)_u010800970的专栏-CSDN博客_httpclient 重试

Atitit httpclient feign使用总结RestTemplate Httpclient重要的功能 重试与超时 1.RedirectExec执行器的默认策略是,在接收到重定向错误码3相关推荐

  1. springboot RestTemplate httpclient

    RestTemplate是spring支持的一个请求http rest服务的模板对象,性质上有点像jdbcTemplate RestTemplate底层还是使用的httpclient(org.apac ...

  2. HttpClient、OKhttp、RestTemplate对比

    一.三者的对比 HttpClient:代码复杂,还得操心资源回收等.代码很复杂,冗余代码多,不建议直接使用. RestTemplate: 是 Spring 提供的用于访问Rest服务的客户端, Res ...

  3. httpclient 调取接口_使用HttpClient调用接口的实例讲解

    一,编写返回对象 public class HttpResult { // 响应的状态码 private int code; // 响应的响应体 private String body; get/se ...

  4. Feign - 独立使用 - 替代HttpClient

    文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...

  5. RestTemplate HttpClient 加载 SSL/PKCS12/微信API证书

    版本:org.springframework:spring-web:5.1.8.RELEASE.org.apache.httpcomponents:httpclient:4.5.9 import or ...

  6. php httpclient.class.php,php实现httpclient类示例

    代码如下: httpClient::init($httpClient, $args = null); $httpClient->get($url, $data = null, $cookie = ...

  7. java httpclient put_[工具类-HttpClientUtils]HttpClient之GET PUT DELETE POST

    图片来自网络 发送http请求: get put delete post package com.zefun.common.utils; import java.io.IOException; imp ...

  8. java httpclient 关闭_java中使用httpclient如何关闭debug日志

    直接上代码,在http请求前加上下面的代码即可// 设置默认工厂类 system.setproperty("org.apache.commons.logging.logfactory&quo ...

  9. java httpclient 异步请求_java_java实现HttpClient异步请求资源的方法,本文实例讲述了java实现HttpClien - phpStudy...

    java实现HttpClient异步请求资源的方法 本文实例讲述了java实现HttpClient异步请求资源的方法.分享给大家供大家参考.具体实现方法如下: package demo; import ...

  10. java httpclient 跨域_13、HttpClient服务器跨域请求

    1 回调 1.1 回调函数 1.1.1 回调的原理图 说明:在架构设计中,回调的机制经常会被使用,课下自行学习. 1.2 JSON的数据结构 1.2.1 JSON官网介绍 1.2.2 Object格式 ...

最新文章

  1. JavaScript的时钟小程序
  2. 什么是死锁?死锁如何解决
  3. Vuex 入门前的小菜 - “Vue 中的简单状态共享机制实现”
  4. 5.5.3 per-connection time zone support
  5. 驱动下通过进程PID获得进程名 (动态获取ImageFileName在EPROCESS结构体中的相对偏移)...
  6. maven如何修改本地仓库与中央仓库
  7. RabbitMQ(三) HelloWorld 单生产者单消费者示例实现
  8. 用JS控制下拉菜单效果
  9. C#实现HttpUtility.UrlEncode输出大写字母
  10. 尽快更新!Chrome 修复两个已遭在野利用的 0day
  11. split用法与图像预处理
  12. thinkphp count distinct
  13. Java商城项目实战
  14. 山东大学机电信息学院计算机网络,山东大学机电与信息工程学院2021考研复试考核内容...
  15. 基于Markov区制转换模型的股票波动分析
  16. 三、 CSS3流星雨划过动画特效
  17. 域控组策略桌面壁纸设置问题
  18. 有益视力的食疗方法(转载)
  19. springboot配置logback
  20. @mysql数据库面试手册

热门文章

  1. 画出多项式的硬件编码_硬件工程师职业规划
  2. fpga电平约束有什么作用_FPGA开发全攻略——时序约束
  3. php跳转图片_HTML点击图片跳转到新页面怎么实现?(示例)
  4. python在材料方面的应用_Python数据科学(一)- python与数据科学应用(Ⅰ)
  5. socket状态不对是什么意思_无极状态,“太极状态”“无极生太极”都是什么意思?...
  6. iOS--利用Fastlane实现自动化打包
  7. 三、python环境的搭建之建建建
  8. thinkphp5中的where写法
  9. 为什么我离开了管理岗位
  10. asmack获取用户头像和设置昵称与获取好友昵称