技术标签: httpclient请求超时 线上问题排查 closenHtttpclient默认配置
最近线上出现一个问题,外部请求过来后一直没有响应给调用方,看日志没有报错,可以复现。
想到的就可能是五个原因:
排查思路由易到难:
针对可能的原因2,项目重启后看日志发现数据库有返回,但是仍然无响应,排除数据库连接问题。
想到如果是原因4或者5的话,日志里面应该有死锁堆栈信息或者内存溢出的异常信息,又这种问题不易排查解决,暂时搁置,看看原因2
针对外部请求的httputil工具类如下:
public class HttpUtil {
private static Logger logger= LoggerFactory.getLogger(HttpUtil.class);
public static String postJson(String url, String body) throws Exception {
return post(url, body, "application/json");
}
public static String postForm(String url, String body) throws Exception {
return post(url, body, "application/x-www-form-urlencoded");
}
public static String post(String url, String body, String contentType) throws Exception {
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(url);
httpPost.addHeader("Content-Type", contentType);
httpPost.setEntity(new StringEntity(body, Charset.forName("UTF-8")));
CloseableHttpResponse response = httpClient.execute(httpPost);
HttpEntity entity = response.getEntity();
String responseContent = EntityUtils.toString(entity, "UTF-8");
response.close();
httpClient.close();
return responseContent;
}
}
乍一看不觉得有啥问题,很正常的http请求,突然想到那么针对http请求的超时时间,处理时间之类的配置是在哪里设置的呢?这个默认配置是什么呢?
跟踪代码
这边用了设计模式的建造者模式,这个方法体很长,就不全贴出来了,具体可自己debug查看,这里贴出关键内容
public CloseableHttpClient build() {
PublicSuffixMatcher publicSuffixMatcherCopy = this.publicSuffixMatcher;
if (publicSuffixMatcherCopy == null) {
publicSuffixMatcherCopy = PublicSuffixMatcherLoader.getDefault();
}
//中间逻辑=========
return new InternalHttpClient((ClientExecChain)execChain, (HttpClientConnectionManager)connManagerCopy, (HttpRoutePlanner)routePlannerCopy, cookieSpecRegistryCopy, (Lookup)authSchemeRegistryCopy, (CookieStore)defaultCookieStore, (CredentialsProvider)defaultCredentialsProvider, this.defaultRequestConfig != null ? this.defaultRequestConfig : RequestConfig.DEFAULT, closeablesCopy);
}
方法最后返回http请求client的时候,会做一个判断有没有设置自定义的请求配置requestconfig,如果设置了用自定义的,如果没设置,用工具类默认的,那么默认的配置到底是什么呢?
问题到现在基本很明了了,这种client的默认配置如果请求一直没响应会一直等待,外部请求过来我们请求其他数据源外部数据,但因为其他数据源异常没有及时返回数据给我们导致整个服务卡死,知道原因后解决方法就比较简单了。修改后的http工具类如下:
public class HttpUtil {
private static Logger logger= LoggerFactory.getLogger(HttpUtil.class);
public static String postJson(String url, String body) throws Exception {
return post(url, body, "application/json");
}
public static String postForm(String url, String body) throws Exception {
return post(url, body, "application/x-www-form-urlencoded");
}
public static String post(String url, String body, String contentType) throws Exception {
RequestConfig defaultRequestConfig = RequestConfig.custom()
.setConnectTimeout(5000) //连接时间
.setSocketTimeout(5000) //请求处理时间
.setConnectionRequestTimeout(3000) //从连接池获取连接超时时间
.build();
CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(defaultRequestConfig).build();
HttpPost httpPost = new HttpPost(url);
httpPost.addHeader("Content-Type", contentType);
httpPost.setEntity(new StringEntity(body, Charset.forName("UTF-8")));
CloseableHttpResponse response = httpClient.execute(httpPost);
HttpEntity entity = response.getEntity();
String responseContent = EntityUtils.toString(entity, "UTF-8");
response.close();
httpClient.close();
return responseContent;
}
}
注:关于超时时间的参数具体设置值需要根据自己的业务需求自定义修改,不必照搬
至此,问题解决,针对这个问题有如下反思:
1、每次用一个不熟悉的技术,需要熟悉这个技术相关api,不能单纯会用就好,需要考虑到后续的扩展,稳定性等因素
2、排查问题有优先级,先排除容易排除的因素,然后再针对性排查
纹理合成的需求UE4材质常常需要合成不同的纹理。常用的合成运算,有好几种选择,下面单独介绍。下面这两种图片,是合成之前的图片。UE4材质中的乘法乘法是最常用的合成运算。下面是这两张图用乘法合成的效果。乘法合成很简单,取值范围在运算之后仍然是0~1。但是合成之后会变暗,这是因为两个0~1的数相乘,会变得更小,所以更暗。下图是材质节点。UE4材质中的加法...
ArchLinux安装(BIOS)说在前头:在经历过无数次的失败尝试过后总结出的可用的安装过程(比官方的简单一点)官方安装指导一.连接网络1.连接# wifi-menu2.检查是否联通(ctrl+c停止)# ping www.baidu.com3.远程安装注:连接上网络之后可以通过远程链接(同一个网络下)在另一台电脑上进行安装操作(可方便复制代码),如不想这么做请忽略这一步骤...
背景项目中经常遇到C++和C语言混编的情况,例如性能要求必须使用C语言实现功能,开发要求使用C++实现界面。这种情况下,会出现很多C++和C混编问题,下面就我自己的项目经验谈谈可能遇到的问题和解决方法,如果有误或不当之处还请海涵并请不吝指教。问题及解决原因出现问题的根源主要包含以下两方面:C++和C使用不同的编译器,而编译器对变量和函数有不同的符号表示方法;C++是C的升级
抖音小程序基础之 如何设置navigationBar背景颜色和标题 (教程含源码)字节宿主小程序的每一个页面的窗口表现也可以通过页面目录下的.json文件进行配置,这个页面的独立配置会比 app.json 要简单;如果 app.json 的 window 字段里面配置了某个页面的窗口样式,同时该页面也在自己的 .json文件中做了对应字段的配置的话,框架会优先采用页面里面的 .json 相应配置项。例如:{ "navigationBarBackg
参考https://blog.csdn.net/baidu_39447417/article/details/78284122在实际做一个项目的时候,上位机跟下位机相互配合,就离不开定时器Timer.// 首先我们要新建一个定时器System.Timers.Timer timer1 = new System.Timers.Timer(1000); // 1s的定时器 private ...
1. 用异步通信方式传送字符"A"和"8",数据有7位,偶校验1 位。起始位1位,停止位l位,请分别画出波形图。2.同步通信之所以比异步通信具有较高的传输频率,是因为同步通信___C_。A.不需要应答信号; B.总线长度较短;C.用一个公共时钟信号进行同步;D.各部件存取时间比较接近。3. 在集中式总线仲裁中,__B__方式响应时间最快,__A__方式对__C__最敏感。A.菊花链方式 B.独立请求方式 C.电路故障 D.计数器定时查询方式4. 采用串行接口进行7位A..
在解释Shell脚本这个名词之前,我们先来看看到底什么是shell?什么是Shell ?shell是一个命令解释器,它的作用就是负责解释执行用户输入的每条命令及应用程序等,用户每输入一条命令,Shell就去解释执行一条。这种从键盘一输入命令,就可以立即得到回应的对话方式,我们称之为交互的方式。shell存在于操作系统的最外层,负责与用户直接对话,把用户的输入解释给操作系...
文章目录经典并发同步模式:生产者-消费者设计模式什么是生产者-消费者模式为什么要使用生产者消费者模式生产者-消费者模式的特点生产者-消费者模式的应用场景生产者-消费者模式的优点生产者-消费者模式的实现1、利用内部线程之间的通信:Object的wait() / notify()方法创建Container容器类创建生产者类创建消费者类测试类2、利用信号量实现生产者-消费者模型思路代码实现3、基于阻塞队...
/****************第一步添加createdump.h*********************************添加一个头文件:createdump.h#pragma once#include <windows.h>#include <imagehlp.h>#include <stdlib.h>#pragma com...
首先引入zxing用于生成二维码 <!-- https://mvnrepository.com/artifact/com.google.zxing/core --> <dependency> <groupId>com.google.zxing</groupId> <artifactId&
密码学实验课的题目,分享一下自己的代码,可能不够完美,供参考~自己动手才是王道哦!一、实验目的掌握椭圆曲线上的加法定律;熟练求解椭圆曲线上的离散对数问题。二、实验原理(1)有限域GF§上的椭圆曲线:对于固定的a和b,满足形如方程y2≡x3+ax+b(mod p) ( a,b,x,yGF§且4a3+27b2(mod p)≠0).(2)椭圆曲线Ep(a,b)上的加法定义如下:设P,...