Atitit httpclient feign使用总结RestTemplate Httpclient重要的功能 重试与超时 1.RedirectExec执行器的默认策略是,在接收到重定向错误码3
Atitit httpclient feign使用总结RestTemplate
Httpclient重要的功能
重试与超时
- 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
- HttpClient有默认的执行器RetryExec
关于RetryExec执行器的执行过程,做一个阶段小结:
- RetryExec在执行http请求的时候使用的是底层的基础代码MainClientExec,并记录了发送次数
- 当发生IOException的时候,判断是否要重试
- 首先是根据重试策略DefaultHttpRequestRetryHandler判断,如果可以重试就继续
- 判断当前request是否还可以再次发起
- 如果重试策略判断不可以重试了,就抛相应异常并退出
- 首先是根据重试策略DefaultHttpRequestRetryHandler判断,如果可以重试就继续
通过构造器可以看到,默认的重试策略是:
- 重试3次
- 如果请求被成功发送过,就不再重试了
- InterruptedIOException、UnknownHostException、ConnectException、SSLException,发生这4中异常不重试
关于默认的重试策略,做一个阶段小结:
- 如果重试超过3次,则不再重试
- 几种特殊异常及其子类,不进行重试
- 同一个请求在异步任务重已经被终止,则不进行重试
- 幂等的方法可以进行重试,比如Get
- 如果请求没有发送成功,可以进行重试。
- 五、重试策略对业务的影响
- 5.1 我们的业务重试了吗?
对于我们的场景应用中的get与post,可以总结为:
- 只有发生IOExecetion时才会发生重试
- InterruptedIOException、UnknownHostException、ConnectException、SSLException,发生这4中异常不重试
- get方法可以重试3次,post方法在socket对应的输出流没有被write并flush成功时可以重试3次。
首先分析下不重试的异常:
- InterruptedIOException,线程中断异常
- UnknownHostException,找不到对应host
- ConnectException,找到了host但是建立连接失败。
- SSLException,https认证异常
另外,我们还经常会提到两种超时,连接超时与读超时:
- java.net.SocketTimeoutException: Read timed out
- java.net.SocketTimeoutException: connect timed out
这两种超时都是SocketTimeoutException,继承自InterruptedIOException,属于上面的第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() {
- 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)));
}
}
- 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相关推荐
- springboot RestTemplate httpclient
RestTemplate是spring支持的一个请求http rest服务的模板对象,性质上有点像jdbcTemplate RestTemplate底层还是使用的httpclient(org.apac ...
- HttpClient、OKhttp、RestTemplate对比
一.三者的对比 HttpClient:代码复杂,还得操心资源回收等.代码很复杂,冗余代码多,不建议直接使用. RestTemplate: 是 Spring 提供的用于访问Rest服务的客户端, Res ...
- httpclient 调取接口_使用HttpClient调用接口的实例讲解
一,编写返回对象 public class HttpResult { // 响应的状态码 private int code; // 响应的响应体 private String body; get/se ...
- Feign - 独立使用 - 替代HttpClient
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 ...
- RestTemplate HttpClient 加载 SSL/PKCS12/微信API证书
版本:org.springframework:spring-web:5.1.8.RELEASE.org.apache.httpcomponents:httpclient:4.5.9 import or ...
- php httpclient.class.php,php实现httpclient类示例
代码如下: httpClient::init($httpClient, $args = null); $httpClient->get($url, $data = null, $cookie = ...
- java httpclient put_[工具类-HttpClientUtils]HttpClient之GET PUT DELETE POST
图片来自网络 发送http请求: get put delete post package com.zefun.common.utils; import java.io.IOException; imp ...
- java httpclient 关闭_java中使用httpclient如何关闭debug日志
直接上代码,在http请求前加上下面的代码即可// 设置默认工厂类 system.setproperty("org.apache.commons.logging.logfactory&quo ...
- java httpclient 异步请求_java_java实现HttpClient异步请求资源的方法,本文实例讲述了java实现HttpClien - phpStudy...
java实现HttpClient异步请求资源的方法 本文实例讲述了java实现HttpClient异步请求资源的方法.分享给大家供大家参考.具体实现方法如下: package demo; import ...
- java httpclient 跨域_13、HttpClient服务器跨域请求
1 回调 1.1 回调函数 1.1.1 回调的原理图 说明:在架构设计中,回调的机制经常会被使用,课下自行学习. 1.2 JSON的数据结构 1.2.1 JSON官网介绍 1.2.2 Object格式 ...
最新文章
- JavaScript的时钟小程序
- 什么是死锁?死锁如何解决
- Vuex 入门前的小菜 - “Vue 中的简单状态共享机制实现”
- 5.5.3 per-connection time zone support
- 驱动下通过进程PID获得进程名 (动态获取ImageFileName在EPROCESS结构体中的相对偏移)...
- maven如何修改本地仓库与中央仓库
- RabbitMQ(三) HelloWorld 单生产者单消费者示例实现
- 用JS控制下拉菜单效果
- C#实现HttpUtility.UrlEncode输出大写字母
- 尽快更新!Chrome 修复两个已遭在野利用的 0day
- split用法与图像预处理
- thinkphp count distinct
- Java商城项目实战
- 山东大学机电信息学院计算机网络,山东大学机电与信息工程学院2021考研复试考核内容...
- 基于Markov区制转换模型的股票波动分析
- 三、 CSS3流星雨划过动画特效
- 域控组策略桌面壁纸设置问题
- 有益视力的食疗方法(转载)
- springboot配置logback
- @mysql数据库面试手册
热门文章
- 画出多项式的硬件编码_硬件工程师职业规划
- fpga电平约束有什么作用_FPGA开发全攻略——时序约束
- php跳转图片_HTML点击图片跳转到新页面怎么实现?(示例)
- python在材料方面的应用_Python数据科学(一)- python与数据科学应用(Ⅰ)
- socket状态不对是什么意思_无极状态,“太极状态”“无极生太极”都是什么意思?...
- iOS--利用Fastlane实现自动化打包
- 三、python环境的搭建之建建建
- thinkphp5中的where写法
- 为什么我离开了管理岗位
- asmack获取用户头像和设置昵称与获取好友昵称