二、高并发治理:3、运行环境优化Feign通信

本文探讨了为什么需要优化Feign,分析了Feign在高并发下出现请求阻塞的问题,并推荐了使用HttpClient和OkHttp作为Feign的连接池技术,详细介绍了配置和验证这两者的方法。

一、为什么要优化Feign

1.1 什么是Feign

Feign是—个声明式、模板化的HTTP客户端

在HTTP协议中,发送请求的一方就是HTTP 客户端,在JAVA 中,有很多HTTP 客户端框架。

实际Feign 集成简化了其他HTTP 客户端框架,实际发送请求是由Feign 中的Client接口实现类去处理的,默认使用的是Defalut 类,该类使用的是HttpURLConnection。

1.2 为什么Feign需要优化

既然发送请求,是由Feign 中的Client接口实现类去处理的。

那么必然遵循HTTP通信过程:

在HTTP 通信的过程中,建立连接是一个很复杂的过程,涉及到多个数据包的交换,很耗时间。

而且HTTP连接需要3次握手和4次挥手开销都很大。

如果没有连接池那么将会反复创建与销毁,在请求量上来的时候,将会导致接口响应变慢,整体时间变长。
所以采用HTTP连接池,节约大量的3次握手4次挥手时间,提升吞吐量。

1.3 skywalking 查看feign阻塞

如下图1,通过skywalking 观察

高并发压测流量突增时,请求阻塞在feign上,业务逻辑其实并未执行,self耗时特别长

1.4 选择哪一种池化技术

  • HttpURLConnection 不推荐
    • Feign默认的HttpURLConnection是JDK自带的,并不支持连接池。
    • 如果要实现连接池的机制,还需要自己来管理连接对象。
  • HttpClient 推荐
    • HttpClient 相比JDK自带的HttpURLConnection,它封装了访问HTTP的请求头,参数,内容体,响应等等。
    • 它不仅使客户端发送HTTP请求变得容易,而且也方便了开发人员测试接口(基于HTTP协议的),既提高了开发的效率,又提高了代码的健壮性。
    • 另外高并发大量的请求网络的时候,也是用"连接池"提升吞吐量。
  • OkHttp 推荐
    • OkHttp作为后期之秀,功能和性能上,可能稍优于HttpClient ,但是几乎没多大区别,实际使用时都可以

二、Feign使用httpclient

  • 第一步:验证配置类,在idea中双击“SHift”中输入 HttpClientFeignLoadBalancedConfiguration

  • 第二步:检查是否缺少ApacheHttpClient
    • 如果缺少的话,feign 连接池也不会生效,同时“feign.httpclient.enabled=true” 才能生效
  • 第三步:引包
    • SpringBoot 1.* 引入如下包
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
    • SpringBoot 2.* 引入如下包
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
    • 如果ApacheHttpClient类还在报红,引入下面的包 推荐9.6.0以上版本 如10.10.1
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-httpclient</artifactId>
</dependency>
  • 第四步:启动,确认启用
    • 定位到HttpClientFeignLoadBalancedConfiguration 的connectionManager方法,打一个断点,启动的时候进来,说明生效了

  • 第五步:配置,feignClient 的配置如下
    • 这个配置完了即可生效
feign.httpclient.enabled = true #httpClient 启用开关
feign.httpclient.maxConnections = 1000   #最大连接数
feign.httpclient.maxConnectionsPerRoute = 300   #feign单个路径的最大连接数
feign.httpclient.connectionTimeout = 3000  #超时时间

三、Feign使用Okhttp

  • 第一步:在idea中双击“SHift”中输入 OkHttpFeignLoadBalancedConfiguration

  • 第二步:检查是否缺少OkHttpClient
    • 如果缺少的话,feign 连接池也不会生效,同时“feign.okhttp.enabled=true” 才能生效

  • 第三步:引包
    • SpringBoot 1.* 引入如下包
      • feign-okhttp 推荐使用9.6.0以上版本 如10.10.1
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-okhttp</artifactId>
</dependency>
  • SpringBoot 2.* 引入如下包
    • feign-okhttp 推荐使用9.6.0以上版本 如10.10.1
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
    <groupId>io.github.openfeign</groupId>
    <artifactId>feign-okhttp</artifactId>
</dependency>
  • 第四步:启动,确认生效
    • 定位到OkHttpFeignLoadBalancedConfiguration 的httpClientConnectionPool方法,打一个断点,启动的时候进来,说明生效了

 

  • 第五步:配置,feignClient 的配置如下
    • 配置完成即可生效
feign.httpclient.enabled = false #httpClient 关闭
feign.okhttp.enabled = true #okHttpClient 启用
feign.httpclient.maxConnections = 1000   #最大连接数
feign.httpclient.maxConnectionsPerRoute = 300   #feign单个路径的最大连接数
feign.httpclient.connectionTimeout = 3000  #超时时间
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

米灵君的架构思维

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值