Feign-使用HttpClient和OkHttp

OkHttp的高级封装Feign学习(一): Feign注解的使用 说明 在项目开发中,避免不了通过HTTP请求进行对第三方服务的调用,在之前的两遍博文《OkHttp使用踩坑记录总结(一):OkHttpClient单例和长连接Connection Keep-Alive 》和《OkHttp使用踩坑记录总结(二):OkHttp同步异步请求和连接池线程池》中,我对OkHttp使用过程中遇到的一些问题进行了总结记录。在微服务架构体系中,我们通常使用netflix开源的sp... 阅读详情

        在Feign中,Client是一个非常重要的组件,Feign最终发送Request请求以及接收Response响应都是由Client组件来完成的。Client在Feign源码中是一个接口,在默认情况下,Client的实现类是Client.Default。Client.Default是由HttpURLConnection来实现网络请求的。另外,Client还支持HttpClient和OkHttp来进行网络请求。

        首先查看FeignRibbonClient的自动配置类FeignRibbonClientAutoConfiguration,该类在程序启动的时候注入一些Bean,其中注入了一个BeanName为feignClient的Client类型的Bean。在省缺配置BeanName为FeignClient的Bean的情况下,会自动注入Client.Default这个对象,跟踪Client.Default源码,Client.Default使用的网络请求框架是HttpURLConnection,代码如下:

  1. public static class Default implements Client {
  2. private final SSLSocketFactory sslContextFactory;
  3. private final HostnameVerifier hostnameVerifier;
  4. public Default(SSLSocketFactory sslContextFactory, HostnameVerifier hostnameVerifier) {
  5. this.sslContextFactory = sslContextFactory;
  6. this.hostnameVerifier = hostnameVerifier;
  7. }
  8. public Response execute(Request request, Options options) throws IOException {
  9. HttpURLConnection connection = this.convertAndSend(request, options);
  10. return this.convertResponse(connection, request);
  11. }
  12. ......//代码省略
  13. }

        这种情况下,由于缺乏连接池的支持,在达到一定流量的后服务肯定会出问题 。    

使用HttpClient

        那么如何在Feign中使用HttpClient的框架呢?我们查看FeignAutoConfiguration.HttpClientFeignConfiguration的源码:

  1. @Configuration
  2. @ConditionalOnClass({ApacheHttpClient.class})
  3. @ConditionalOnMissingClass({"com.netflix.loadbalancer.ILoadBalancer"})
  4. @ConditionalOnMissingBean({CloseableHttpClient.class})
  5. @ConditionalOnProperty(
  6. value = {"feign.httpclient.enabled"},
  7. matchIfMissing = true
  8. )
  9. protected static class HttpClientFeignConfiguration {
  10. private final Timer connectionManagerTimer = new Timer("FeignApacheHttpClientConfiguration.connectionManagerTimer", true);
  11. @Autowired(
  12. required = false
  13. )
  14. private RegistryBuilder registryBuilder;
  15. private CloseableHttpClient httpClient;
  16. protected HttpClientFeignConfiguration() {
  17. }
  18. @Bean
  19. @ConditionalOnMissingBean({HttpClientConnectionManager.class})
  20. public HttpClientConnectionManager connectionManager(ApacheHttpClientConnectionManagerFactory connectionManagerFactory, FeignHttpClientProperties httpClientProperties) {
  21. final HttpClientConnectionManager connectionManager = connectionManagerFactory.newConnectionManager(httpClientProperties.isDisableSslValidation(), httpClientProperties.getMaxConnections(), httpClientProperties.getMaxConnectionsPerRoute(), httpClientProperties.getTimeToLive(), httpClientProperties.getTimeToLiveUnit(), this.registryBuilder);
  22. this.connectionManagerTimer.schedule(new TimerTask() {
  23. public void run() {
  24. connectionManager.closeExpiredConnections();
  25. }
  26. }, 30000L, (long)httpClientProperties.getConnectionTimerRepeat());
  27. return connectionManager;
  28. }
  29. @Bean
  30. public CloseableHttpClient httpClient(ApacheHttpClientFactory httpClientFactory, HttpClientConnectionManager httpClientConnectionManager, FeignHttpClientProperties httpClientProperties) {
  31. RequestConfig defaultRequestConfig = RequestConfig.custom().setConnectTimeout(httpClientProperties.getConnectionTimeout()).setRedirectsEnabled(httpClientProperties.isFollowRedirects()).build();
  32. this.httpClient = httpClientFactory.createBuilder().setConnectionManager(httpClientConnectionManager).setDefaultRequestConfig(defaultRequestConfig).build();
  33. return this.httpClient;
  34. }
  35. @Bean
  36. @ConditionalOnMissingBean({Client.class})
  37. public Client feignClient(HttpClient httpClient) {
  38. return new ApacheHttpClient(httpClient);
  39. }
  40. @PreDestroy
  41. public void destroy() throws Exception {
  42. this.connectionManagerTimer.cancel();
  43. if (this.httpClient != null) {
  44. this.httpClient.close();
  45. }
  46. }
  47. }

        从代码@ConditionalOnClass({ApacheHttpClient.class})注解可知,只需要在pom文件上加上HttpClient依赖即可。另外需要在配置文件中配置feign.httpclient.enabled为true,从@ConditionalOnProperty注解可知,这个配置可以不写,因为在默认情况下就为true:

  1. <dependency>
  2. <groupId>io.github.openfeign</groupId>
  3. <artifactId>feign-httpclient</artifactId>
  4. <version>9.4.0</version>
  5. </dependency>

 

使用OkHttp

       查看FeignAutoConfiguration.HttpClientFeignConfiguration的源码:

  1. @Configuration
  2. @ConditionalOnClass({OkHttpClient.class})
  3. @ConditionalOnMissingClass({"com.netflix.loadbalancer.ILoadBalancer"})
  4. @ConditionalOnMissingBean({okhttp3.OkHttpClient.class})
  5. @ConditionalOnProperty({"feign.okhttp.enabled"})
  6. protected static class OkHttpFeignConfiguration {
  7. private okhttp3.OkHttpClient okHttpClient;
  8. protected OkHttpFeignConfiguration() {
  9. }
  10. @Bean
  11. @ConditionalOnMissingBean({ConnectionPool.class})
  12. public ConnectionPool httpClientConnectionPool(FeignHttpClientProperties httpClientProperties, OkHttpClientConnectionPoolFactory connectionPoolFactory) {
  13. Integer maxTotalConnections = httpClientProperties.getMaxConnections();
  14. Long timeToLive = httpClientProperties.getTimeToLive();
  15. TimeUnit ttlUnit = httpClientProperties.getTimeToLiveUnit();
  16. return connectionPoolFactory.create(maxTotalConnections, timeToLive, ttlUnit);
  17. }
  18. @Bean
  19. public okhttp3.OkHttpClient client(OkHttpClientFactory httpClientFactory, ConnectionPool connectionPool, FeignHttpClientProperties httpClientProperties) {
  20. Boolean followRedirects = httpClientProperties.isFollowRedirects();
  21. Integer connectTimeout = httpClientProperties.getConnectionTimeout();
  22. Boolean disableSslValidation = httpClientProperties.isDisableSslValidation();
  23. this.okHttpClient = httpClientFactory.createBuilder(disableSslValidation).connectTimeout((long)connectTimeout, TimeUnit.MILLISECONDS).followRedirects(followRedirects).connectionPool(connectionPool).build();
  24. return this.okHttpClient;
  25. }
  26. @PreDestroy
  27. public void destroy() {
  28. if (this.okHttpClient != null) {
  29. this.okHttpClient.dispatcher().executorService().shutdown();
  30. this.okHttpClient.connectionPool().evictAll();
  31. }
  32. }
  33. @Bean
  34. @ConditionalOnMissingBean({Client.class})
  35. public Client feignClient(okhttp3.OkHttpClient client) {
  36. return new OkHttpClient(client);
  37. }
  38. }

       同理,如果想要在Feign中使用OkHttp作为网络请求框架,则只需要在pom文件中加上feign-okhttp的依赖,代码如下:

  1. <dependency>
  2. <groupId>io.github.openfeign</groupId>
  3. <artifactId>feign-okhttp</artifactId>
  4. <version>10.2.0</version>
  5. </dependency>

 

[享学Feign] 九、Feign + OkHttp和Feign + Apache HttpClient哪个更香? 前八篇文章介绍完了feign-core核心内容,从本篇开始将介绍它的“其它模块”。其实核心模块可以独立的work,但是不免它的能力偏弱,比如只能编码字符串类型、只能解码字符串类型,默认使用`java.net.HttpURLConnection`作为HC... 本篇将介绍它的第一个模块:Client相关模块。我们知道,流行的开源Http库的性能均远高于JDK源生的`HttpURLConnection`,因此实际生产中**肯定是**用的三方库来发送Http请求。 Feign它提供了`feign.Client 阅读详情

相关推荐

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

Feign是—个声明式、模板化的HTTP客户端在HTTP协议中,发送请求的一方就是HTTP 客户端,在JAVA 中,有很多HTTP 客户端框架。实际Feign 集成简化了其他HTTP 客户端框架,实际发送请求是由Feign 中的Client接口实现类去处理的,默认使用的是Defalut 类,该类使用的是HttpURLConnection。

讲透电商店铺、商品、营销、订单架构设计,高并发实战分享 503

Feign 如何使用 Okhttp 完成 HTTP URL 请求

背景 最近在使用 Feign 的时候碰到了请求超时的问题,借着这个事儿好好的梳理下与 Feign 相关的客户端,以及客户端的配置,下文将主要通过配置 Okhttp 的过程来意义讲一下。 1、Feign 支持的客户端类型 Feign 主要支持 3 种客户端,另外 1 个客户端作为对这 3 种客户端的包装,如下: Client.Default 如果没有特别指定使用哪个客户端,则 Feign 将使用这...

cab5的博客 1万+

MobaXterm破解14个会话限制的保姆级教程(附Python环境配置指南)

本文提供了MobaXterm破解14个会话限制的详细教程,并深入讲解了如何配置稳定的Python环境以支持相关脚本运行。通过理解软件授权机制、安全实践步骤以及许可文件的应用,帮助用户解除会话数量限制,实现高效的远程服务器管理与自动化运维。

weixin_29211309的博客 1663

Java中httpclient的单例工厂类示例

在 Java 中经常会有要发送 http 请求并解析响应的场景,此时用的最多的两个类库分别是 Apache 的 HttpClient 类库和 OkHttp 的 OkHttpClient 类库。在使用这两个类库的时候,

frankingly的专栏 820

STM32 HAL 模拟I2C从机实战:软件实现与多设备通信优化

本文详细介绍了STM32 HAL库下软件模拟I2C从机的实现方法,包括GPIO开漏配置、基础信号实现、数据收发函数编写和多设备通信优化策略。通过灵活的软件模拟方案,解决了硬件I2C接口数量限制和稳定性问题,为多传感器数据采集等应用提供了可靠的通信保障。

motor的博客 921

Skiplist,B,B+tree,LSM tree

SkipList 理解(如何实现): 即使是有序的链表,查找的时间复杂度也是O(n),但链表不能随机访问所以不适用于二分查找,使得查找的时间复杂度为O(logn)。 于是将有序链表和二分查找结合得到了SkipList,类似于二叉搜索树,这是一种以空间换时间的算法,通过在每个节点中增加向前的指针,从而提升查找效率(如下图所示)。 一开始如a所示,是一个有序的链表,时间复杂度O(n)。随后建立了e所示的SkipList,从最顶层往下查找,可以跳过许多元素,减少查找次数。 ​

weixin_45875458的博客 947

SpringCloud OpenFeign使用OkHttp,添加响应拦截器

前言 SpringCloud微服务之间的请求一般使用OpenFeign,有时候我们需要在请求或者响应的时候做一些额外的操作。比如请求的时候添加请求头,响应的时候判断token是否过期等等。这时候拦截器就派上用场了!我们接下来就说一下怎么添加请求和响应拦截器。 一、修改OpenFeign的http客户端 OpenFeign默认的http客户端是javax.net.ssl.HttpsURLConnection,详细信息见feign-core:feign.Client,该http客户端不支持添加拦截器和连接

小哥哥的博客 8628

避坑指南:Zephyr RTOS与nRF Connect SDK环境搭建常见错误及解决方案

本文详细解析了Zephyr RTOS与nRF Connect SDK环境搭建过程中的常见错误及解决方案,涵盖网络问题、代理设置、SEGGER Embedded Studio配置、分支切换等关键环节。针对开发者实际遇到的痛点问题,提供了一系列实用技巧和深度排错方法,帮助高效完成NCS开发环境部署。

weixin_28685287的博客 172

[调优]-Feign配合Ok Http连接池

在HTTP 通信的过程中,建立连接是一个很复杂的过程,涉及到多个数据包的交换,很耗时间,而且HTTP连接需要3次握手和4次挥手开销都很大。这时可以采用HTTP连接池,节约大量的3次握手4次挥手时间,提升吞吐量。默认的HttpURLConnection是JDK自带的,并不支持连接池,如果要实现连接池的机制,还需要自己来管理连接对象。HttpClient 相比传统JDK自带的HttpURLConnection,它封装了访问HTTP的请求头,参数,内容体,响应等等。

listeningdu的博客 3403

合规批量下载美国上市公司年报数据的一些经验和总结

本文总结了使用Python脚本批量下载和处理美国上市公司SEC报告的技术经验。通过CIK代码查询SEC EDGAR系统,生成特定日期和报告类型的URL,并使用Selenium和Requests库下载报告内容。流程包括数据获取、文件下载、Excel处理和多线程优化,确保高效处理几百条数据。关键技术挑战包括SEC访问限制、动态网页内容和数据完整性,解决方案包括设置合规的User-Agent、使用Selenium模拟浏览器行为以及错误日志记录。最佳实践包括模块化设计、多线程优化和严格遵守SEC合规性。该自动化流程

jyfool的博客 1636

【论文笔记】LIME: low-light image enhancement via illumination map estimation

【论文笔记】LIME: low-light image enhancement via illumination map estimation 一篇低光图像增强,引用超1000次的经典论文

weixin_45565519的博客 1794

Feign中使用HttpClient和OKHttp、负载均衡实现

Feign中使用HttpClient和OKHttp 在Feign中,Client是一个非常重要的组件,Feign最终发送Request请求以及接收Response响应都是由Client 组件完成的。 Client 在Feign源码中是一个接口,在默认的情况下,Client的实现类是Client.Default, Client.Default 是由HttpURLConnnection来实现网络请求的。另外,Client还支持HttpClient和OkhHttp来进行网络请求。 首先查看FeignRibbonC

吴声子夜歌的博客 3109

【YOLOv11多模态融合改进】| CVPR2025 LCA轻量交叉注意力 双向模态交叉引导 + 双支路噪点抑制,兼顾纹理与热目标特征融合

可见光模态富含纹理、色彩、边缘细节,但夜间/低照度场景信噪比极低,暗区噪声泛滥;红外模态依靠热辐射凸显弱小目标、暗区物体轮廓,但缺失真实色彩与精细纹理。简单拼接/逐加融合仅做浅层特征叠加,无法建立可见光纹理、红外热特征的双向引导关联,两类模态互补信息无法精准互通;普通自注意力仅单模态内部建模,跨模态交互匮乏,红外热目标易被可见光暗噪声淹没,可见光有效纹理易被红外灰度信息覆盖;

Limiiiing的博客 120

微服系列之Feign使用HttpClient和OkHttp网络请求框架

Feign使用HttpClient和OkHttp网络请求框架

qq_38377525的博客 4774

一文让你轻松理解802.11ax RU的概念

RU

1042484520@qq.com(邮箱) 3368

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Spring Cloud与微服务构建(七)声明式调用Feign 7.5 在Feign中使用HttpClient和OkHttp

在Feign中,Client是一个非常重要的组件,Feign最终发送Request请求以及接收Response响应都是由Client组件完成的。Client在Feign源码中是一个接口,在默认的情况下,Client的实现类是Client。Default,Client.Default是由HttpURLConnection来实现网络请求的。另外Client还支持HttpClient和OkhHttp来进...

qq_40929047的博客 1173

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

HttpClient、OKhttp、RestTemplate接口调用对比( Java HTTP 客户端)

HttpClient、OKhttp、RestTemplate接口调用对比 HttpClient、OkHttp 和 RestTemplate 是三种常用的 Java HTTP 客户端库,它们都可以用于发送 HTTP 请求和接收 HTTP 响应,但在一些方面有所不同。下面是它们之间的一些对比: HttpClient: Apache HttpClient: ○ 成熟稳定: Apache HttpClient 是 Apache 软件基金会的一个项目,经过多年的发展,已经非常成熟和稳定。 ○ 灵活性: 提供了丰富的

刘皇叔说Java的博客 6454

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Spring Cloud使用Feign调用服务接口

JAVA 项目中接口调用怎么做?

unber的博客 1109

Zuul进阶篇-okhttp替换httpclient

前言 在当下微服务的场景下,HTTP请求方式成为了集成各服务的最佳方式。在 Java 平台上,Java 标准库提供了 HttpURLConnection 类来支持 HTTP 通讯。不过 HttpURLConnection 本身的 API 不够友好,所提供的功能也有限。大部分 Java 程序都选择使用 Apache 的开源项目 HttpClient 作为 HTTP 客户端。Apache Htt

海锋博客 3万+

Springboot整合Feign

Spring Cloud为Feign添加了Spring MVC的注解支持,并整合了Ribbon和Eureka来为使用Feign时提供负载均衡。 使用Feign 1. 添加依赖 <dependencies> <!--openfein的依赖--> <dependency> <groupId>org.springframework.cloud</groupId>

qq_43538925的博客 3007

插播之SpringCloud的Feign

文章目录官方说明理解一下常见的Java Http请求库HttpURLConnectionHttpClientOkHttpRestTemplateFeign的原理 官方说明 Feign是一个声明式的Web客户端,一个Http请求调用的轻量级框架,来让Rest服务调用更简单 Feign英文表意为“假装,伪装”,所以其提供了Http的请求模板,通过编写简单的接口和注解,就可以定义好Http请求的参数、格式、地址等信息 Feign完全代理了Http请求,让我们看起来是调用方法实际是发送服务请求的相关处理 同时Fe

Dean_xiu的博客 1230

Okhttp在springcloud中的应用

前言 在当下微服务的场景下,HTTP请求方式成为了集成各服务的最佳方式。在 Java 平台上,Java 标准库提供了 HttpURLConnection 类来支持 HTTP 通讯。不过 HttpURLConnection 本身的 API 不够友好,所提供的功能也有限。大部分 Java 程序都选择使用 Apache 的开源项目 HttpClient 作为 HTTP 客户端。Apache HttpCl...

很多时候犯错都是在不知情的情况下发生的 2863

微服务调用组件Feign详解

Httpclient HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 Http 协议的客户端编程工具包,并且它支持 HTTP 协议最新版本和建议。HttpClient 相比传统 JDK 自带URLConnection,提升了易用性和灵活性,使客户端发送 HTTP 请求变得容易,提高了开发的效率。(文末有惊喜哦!)Okhttp 一个处理网络请求的开源项目,是安卓端最火的轻量级框架,由 Square 公司贡献,用于替代HttpUrlCon

weixin_51702416的博客 2392

Spring Cloud Alibaba全家桶(四)——微服务调用组件Feign

本文为 微服务调用组件Feign 相关知识,下边将对什么是Feign,Spring Cloud Alibaba快速整合OpenFeign,Spring Cloud Feign的自定义配置及使用(包括:日志配置、契约配置、自定义拦截器实现认证逻辑、超时时间配置、客户端组件配置、GZIP 压缩配置)等进行详尽介绍~

小新要变强的博客 3815
上一篇: 什么是微服务,它有哪些优缺点,微服务中的代码框架spring cloud
下一篇: 深入理解token
BigDataMLApplication
博客等级 码龄11年 7363粉丝 565原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值