最近项目中 spring cloud 用到http请求,使用feign,配置okhttp,打算配置一下就直接使用,不过在压测与调优过程中遇到一些没有预测到的问题,附上排查与解析结

yml、pom配置

feign:
client:
config:
default:
connectTimeout: 2000
readTimeout: 3000
loggerLevel: FULL
httpclient:
enabled: false # 关闭 httpclient
okhttp:
enabled: true # 开启 okhttp
<!-- feign-okhttp -->
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
<version>4.2.2</version>
<!-- <exclusions> -->
<!-- 根据情况 -->
<!-- </exclusions> -->
</dependency>

配置后,http请求没问题

但在并发量100的场景下压测时,出现每个http请求相应时间达到100ms的情况,排查下游服务的反应时间很快,推测大量时间消耗在feign发起http请求

怀疑okHttp的负载均衡可能有问题,我的服务发现使用consul,也很好奇okhttp是怎么实现的负载均衡,继续排查:

配置feign配置类

@Bean
@ConditionalOnMissingBean
public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory,
SpringClientFactory clientFactory) throws NoSuchAlgorithmException, KeyManagementException {
SSLContext ctx = SSLContext.getInstance("SSL");
X509TrustManager tm = new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
@Override
public void checkServerTrusted(X509Certificate[] chain,
String authType) throws CertificateException {
}
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
ctx.init(null, new TrustManager[]{tm}, null);
return new LoadBalancerFeignClient(new Client.Default(ctx.getSocketFactory(),
(hostname, session) -> {
// TODO Auto-generated method stub
return true;
}) ,
cachingFactory, clientFactory);
}

这里配置使用 LoadBalancerFeignClient,配置后,100并发下效果仍然不佳

经排查,代码中调用feign就耗费了100ms左右,只能深入看代码查原因,找一条响应时间长的case,看feign内部时间具体消耗在哪里:

这里clientName为consul配置的服务发现名,比如配置里

feign:
service:
order: test-name
在feignClient里配置解析后,这里直接拿到的就是"test-name",然后通过lbClient去请求consul集群,获取到ip+port

到这里,响应时间都很长,还需要继续深入

FeignLoadbalancer,在这里可以看出是否世纪使用了okhttp:

继续排查,发现发送http请求很快,但最简单的encode,decode出现时间长的情况

org.springframework.cloud.openfeign.support.SpringDecoder

问题在这里,每次使用http请求,都new HttpMessageConverterExtractor,费时费力,导致并发量高时load、响应时间都高了

解决方案

在feign配置类里,指定decoder,不要每次new

@Bean
public Decoder feignDecoder() {
ObjectMapper mapper = new ObjectMapper()
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.registerModule(new Jdk8Module())
//fix LocalDateTime 无法序列化问题
.registerModule(new JavaTimeModule());
return new JacksonDecoder(mapper);
}

重新验证,100并发下响应时间降低到20ms,接近下游服务响应时间,http请求已不是瓶颈

feign使用okHttpClient,调用原理的更多相关文章

  1. 2019.12.4 Hystix熔断&Feign进行远程调用&Zuul

    0.学习目标 会配置Hystix熔断 会使用Feign进行远程调用 能独立搭建Zuul网关 能编写Zuul的过滤器 1.Hystrix 1.1.简介 Hystrix,英文意思是豪猪,全身是刺,看起来就 ...

  2. ecshop中ajax的调用原理 1

    ecshop中ajax的调用原理   1:首先ecshop是如何定义ajax对象的. ecshop中的ajax对象是在js/transport.js文件中定义的.里面是ajax对象文件.声明了一个va ...

  3. ECSHOP中ajax的调用原理

    ECSHOP中ajax的调用原理 ecshop中ajax的调用原理. 1.首先ecshop是如何定义ajax对象的. ecshop中的ajax对象是在js/transport.js文件中定义的.里面是 ...

  4. Spring异步调用原理及SpringAop拦截器链原理

    一.Spring异步调用底层原理 开启异步调用只需一个注解@EnableAsync @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTI ...

  5. SpringCloud初体验:三、Feign 服务间调用(FeignClient)、负载均衡(Ribbon)、容错/降级处理(Hystrix)

    FeignOpenFeign Feign是一种声明式.模板化的HTTP客户端. 看了解释过后,可以理解为他是一种 客户端 配置实现的策略,它实现 服务间调用(FeignClient).负载均衡(Rib ...

  6. C语言与汇编语言相互调用原理以及实例

    C语言与汇编语言相互调用原理以及实例 1.原理 其实不管是C语言还是汇编语言想要执行都是最终编译链接成为二进制文件. 这里一定要明确编译和链接是两个步骤,生成的文件格式也是不一样的. 编译生成的文件是 ...

  7. JAVA的List接口的remove重载方法调用原理

    前言 说真的,平常看源码都是自己看完自己懂,很少有写出来的冲动. 但是在写算法的时候,经常用到java中各种集合,其中也比较常用到remove方法. remove有重载函数,分别传入参数是索引inde ...

  8. 小D课堂 - 新版本微服务springcloud+Docker教程_4-05 微服务调用方式之feign 实战 订单调用商品服务

    笔记 5.微服务调用方式之feign 实战 订单调用商品服务     简介:改造电商项目 订单服务 调用商品服务获取商品信息         Feign: 伪RPC客户端(本质还是用http)    ...

  9. 插件化框架解读之四大组件调用原理-Service(三)下篇

    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 本文将继续通过Service调用原理来解读Replugin插件化 ...

  10. 插件化框架解读之四大组件调用原理-Activity(三)上篇

    阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击:https://space.bilibili.com/474380680 本文通过Activity调用原理来解读Replugin插件化技术 ...

随机推荐

  1. 前端Firebug常见错误:SyntaxError:missing variable nam

    出现上面那个问题应该是 某个地方,分号写错了 检查一下是否由于应该写分号的地方写成了其他符号.

  2. 初级程序需要掌握的SQL(一)

    之前我也是,是一个看视频学习的小白,以前老是喜欢通宵看视频,一天10小时小时的学习量,一点效率都没有,就想写一个博客,来帮助大家回顾的SQL语句, 因为我也是初级,所以名字就叫初级程序员需要掌握的sq ...

  3. Geoserver 谷歌瓦片地图的使用 多级发布

    下面,我来介绍一下如何在离线的情况下,在Geoserver 中配置出如同谷歌地图般绚丽的效果. 为了让大家有动力看我我接下来写的东西,我先把结果图给大伙儿展现一下: 正如上图所示,该地图是谷歌第四级的 ...

  4. Mysql 中的MDL

    本文可以结合 MySQL中的事务原理和锁机制 查看. 首先简单了解一下 mysql 的 sql 类型: 1.数据定义语言 DDL:Create.Drop.Alter 操作.用于定义库和表结构的. 2. ...

  5. ASP.NET网站部署到服务器IIS上和本地局域网服务器

    控制面板>>>管理工具>>>打开Internet信息服务 2,如果找不到 可以控制面板>>>程序和功能>>>  打开或关闭win ...

  6. DotfuscatorPro防止反编译&ILSpy反编译

    DotfuscatorPro_4.9可以防止你的.NET软件被反编译,可以在一定程度上防止你的软件被反编译.现在很多软件都有被反编译的现象,虽然不能做到百分百的防范,但是你至少可以先做些技术上的处理, ...

  7. Autofac的基本使用---4、使用Config配置

    Autofac的基本使用---目录 准备 使用的表是Student,创建相关的IDAL.DAL.IBLL.BLL层. 使用EF,创建一个Model层,存放edmx文件. 创建一个Infrastruct ...

  8. 常用java自带命令概览

    ref:http://www.hollischuang.com/archives/308 一.常用命令 jps: 查看本机的Java中进程信息. jstack: 打印线程的执行栈信息. jmap: 打 ...

  9. sql模糊查询和根据日期筛选

    <!-- 查询统计列表 -->   >= 小于等于      <=大于等于 将字符类型转换成日期格式进行比较 select * from xy_platformMessage ...

  10. Redis主从复制getshell技巧

    Redis未授权漏洞常见的漏洞利用方式: Windows下,绝对路径写webshell .写入启动项. Linux下,绝对路径写webshell .公私钥认证获取root权限 .利用contrab计划 ...