SpringCloud实用-OpenFeign整合okHttp
文章目录
- 前言
- 正文
- 一、OkHttpFeignConfiguration 的启用
- 1.1 分析配置类
- 1.2 得出结论,需要增加配置
- 1.3 调试
- 二、OkHttpFeignLoadBalancerConfiguration 的启用
- 2.1 分析配置类
- 2.2 得出结论
- 2.3 测试
- 附录
- 附1:本系列文章链接
- 附2:OkHttpClient 增加拦截器配置
- 附2.1 新建配置类OkHttpConfig
- 附2.2 调试结果
前言
众所周知,我们在使用SpringCloud OpenFeign时,默认使用的是老旧的连接器HttpURLConnection。性能以及并发量方面都差强人意。
一般而言都会对其进行优化调整。本文采用OpenFeign整合okHttp的方式替换原有的Client,去做请求。
使用java 17,spring cloud 4.0.4,springboot 3.1.4
使用项目是本系列第一篇中的项目
本文介绍两种方式的配置,一个是LoadBalancer 的,都是默认带有连接池的。
OkHttpFeignConfigurationOkHttpFeignLoadBalancerConfiguration
正文
一、OkHttpFeignConfiguration 的启用
1.1 分析配置类
首先我们需要加入什么依赖配置呢?
依据 OkHttpFeignConfiguration 的配置内容,进行分析:
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(OkHttpClient.class)
@ConditionalOnMissingBean(okhttp3.OkHttpClient.class)
@ConditionalOnProperty("spring.cloud.openfeign.okhttp.enabled")
protected static class OkHttpFeignConfiguration {// 类路径下有连接池时,构建连接池@Bean@ConditionalOnMissingBean(ConnectionPool.class)public ConnectionPool httpClientConnectionPool(FeignHttpClientProperties httpClientProperties) {int maxTotalConnections = httpClientProperties.getMaxConnections();long timeToLive = httpClientProperties.getTimeToLive();TimeUnit ttlUnit = httpClientProperties.getTimeToLiveUnit();return new ConnectionPool(maxTotalConnections, timeToLive, ttlUnit);}// 构建OkHttpClient实例@Beanpublic okhttp3.OkHttpClient okHttpClient(okhttp3.OkHttpClient.Builder builder, ConnectionPool connectionPool,FeignHttpClientProperties httpClientProperties) {boolean followRedirects = httpClientProperties.isFollowRedirects();int connectTimeout = httpClientProperties.getConnectionTimeout();boolean disableSslValidation = httpClientProperties.isDisableSslValidation();Duration readTimeout = httpClientProperties.getOkHttp().getReadTimeout();List<Protocol> protocols = httpClientProperties.getOkHttp().getProtocols().stream().map(Protocol::valueOf).collect(Collectors.toList());if (disableSslValidation) {disableSsl(builder);}this.okHttpClient = builder.connectTimeout(connectTimeout, TimeUnit.MILLISECONDS).followRedirects(followRedirects).readTimeout(readTimeout).connectionPool(connectionPool).protocols(protocols).build();return this.okHttpClient;}
}
1.2 得出结论,需要增加配置
从配置类中观察到,它的启用条件有2个,一个是需要引入 okhttp的包,另一个需要一行启用配置:
<!-- https://mvnrepository.com/artifact/io.github.openfeign/feign-okhttp -->
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-okhttp</artifactId><version>13.1</version>
</dependency>
# 启用okhttp配置
spring.cloud.openfeign.okhttp.enabled=true
1.3 调试
正常请求,在SynchronousMethodHandler.executeAndDecode(...) 中打断点,调试观察client的类型:

发现已经不再是之前的Default 了,换成了OkHttpClient 类型。并且,也内置了连接池以及一些基本配置信息。
二、OkHttpFeignLoadBalancerConfiguration 的启用
2.1 分析配置类
依据 OkHttpFeignLoadBalancerConfiguration 中的配置项,分析:
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(OkHttpClient.class)
@ConditionalOnProperty("spring.cloud.openfeign.okhttp.enabled")
@ConditionalOnBean({ LoadBalancerClient.class, LoadBalancerClientFactory.class })
@EnableConfigurationProperties(LoadBalancerClientsProperties.class)
class OkHttpFeignLoadBalancerConfiguration {@Bean@ConditionalOnMissingBean@Conditional(OnRetryNotEnabledCondition.class)public Client feignClient(okhttp3.OkHttpClient okHttpClient, LoadBalancerClient loadBalancerClient,LoadBalancerClientFactory loadBalancerClientFactory,List<LoadBalancerFeignRequestTransformer> transformers) {OkHttpClient delegate = new OkHttpClient(okHttpClient);return new FeignBlockingLoadBalancerClient(delegate, loadBalancerClient, loadBalancerClientFactory,transformers);}// 省略其他配置
}
2.2 得出结论
想要让这个配置生效,需要满足OkHttpClient、LoadBalancerClient、OnRetryNotEnabledCondition。
也就是2个依赖项,2个配置:
<!-- https://mvnrepository.com/artifact/io.github.openfeign/feign-okhttp -->
<dependency><groupId>io.github.openfeign</groupId><artifactId>feign-okhttp</artifactId><version>13.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-loadbalancer -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId><version>4.0.4</version>
</dependency>
而配置方面需要增加:
# 启用okhttp配置
spring.cloud.openfeign.okhttp.enabled=true# 关闭负载重试
spring.cloud.loadbalancer.retry.enabled=false
2.3 测试
正常请求,在SynchronousMethodHandler.executeAndDecode(...) 中打断点,调试观察client的类型:

发现已经不再是之前的Default 了,换成了OkHttpClient 类型。
附录
附1:本系列文章链接
SpringCloud系列文章目录(总纲篇)
附2:OkHttpClient 增加拦截器配置
附2.1 新建配置类OkHttpConfig
增加以下拦截器配置,对请求和响应进行日志打印。
package org.feng.config;import lombok.extern.slf4j.Slf4j;
import okhttp3.Interceptor;
import okhttp3.Request;
import okhttp3.Response;
import org.jetbrains.annotations.NotNull;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.io.IOException;/*** okhttp配置** @author feng*/
@Slf4j
@Configuration
public class OkHttpConfig {@Beanpublic okhttp3.OkHttpClient.Builder okHttpClientBuilder() {return new okhttp3.OkHttpClient.Builder().addInterceptor(new LoggingInterceptor());}/*** okhttp3 请求日志拦截器*/static class LoggingInterceptor implements Interceptor {@NotNull@Overridepublic Response intercept(Chain chain) throws IOException {Request request = chain.request();long start = System.nanoTime();log.info(String.format("Sending request %s on %s%n%s",request.url(), chain.connection(), request.headers()));Response response = chain.proceed(request);long end = System.nanoTime();log.info(String.format("Received response for %s in %.1fms%n%s",response.request().url(), (end - start) / 1e6d, response.headers()));return response;}}
}
附2.2 调试结果
可以观察到日志中,打印出来了请求路径、请求头等信息。
2023-11-24T16:48:56.358+08:00 INFO 35987 --- [nio-8080-exec-1] org.feng.config.OkHttpConfig : Sending request http://localhost:10080/hello/post on null
Content-Length: 100
Accept: */*2023-11-24T16:48:56.713+08:00 INFO 35987 --- [nio-8080-exec-1] org.feng.config.OkHttpConfig : Received response for http://localhost:10080/hello/post in 347.4ms
Content-Type: application/json
Transfer-Encoding: chunked
Date: Fri, 24 Nov 2023 08:48:56 GMT
Keep-Alive: timeout=60
Connection: keep-alive
相关文章:
SpringCloud实用-OpenFeign整合okHttp
文章目录 前言正文一、OkHttpFeignConfiguration 的启用1.1 分析配置类1.2 得出结论,需要增加配置1.3 调试 二、OkHttpFeignLoadBalancerConfiguration 的启用2.1 分析配置类2.2 得出结论2.3 测试 附录附1:本系列文章链接附2:OkHttpClient 增…...
Python 异步套接字编程
异步套接字编程是异步编程在网络通信中的应用,它使用异步 IO 操作和事件循环来实现高并发的网络应用。Python 中的 asyncio 模块提供了对异步套接字编程的支持,以下是异步套接字编程的一些重要概念和使用方法: 1. 异步套接字服务器ÿ…...
今年的校招薪资真的让人咋舌!
秋招接近尾声,各大公司基本也陆续开奖了。这里整理了部分公司的薪资情况,数据来源于 OfferShow 和牛客网。 ps:爆料薪资的几乎都是 211 和 985 的,并不是刻意只选取学校好的。另外,无法保证数据的严格准确性。 淘天 …...
debian 设置系统默认以命令行方式启动,关闭x windows
debian 设置系统默认以命令行方式启动,关闭x windows 2021-01-02 tech linux 设置 grub启动设置在/etc/default/grub中,打开 default grub 配置: $ sudo vim /etc/default/grub修改以下配置: 更新grub,设置多用户启动: …...
AMEYA360:蔡司新能源汽车解决方案驱动产业未来
电动化正在重塑中国汽车工业。自中国汽车工业开始发展以来,在电动化和智能化的浪潮推动下,汽车行业从未面临着如此巨大的变革。得益于中国汽车产业尤其是新能源车过去十余年的激流勇进,消费者对新能源汽车的接受度也在发生转变。新能源汽车市…...
C#面试问题整理
sqlserver中视图和表的区别 在 SQL Server 中,视图(View)和表(Table)是不同的对象,它们有以下几点区别: 数据存储方式:表是一种实际存储数据的数据库对象,它包含列和行&…...
微信小程序 基于Android的共享付费自习室座位选座系统uniAPP
题目: 基于Android的共享自习室APP设计与实现 (学校要求:数据库不少于有逻辑关系的20个表,系统功能不少于60个功能点) 技术: 功能: 1. 用户端: 一、首页: (1&…...
Java中类的类型判断技巧以及没有无参构造函数时的应对策略。isInstance()方法解析
类的类型判断 基本数据类型的包装类中,例如Integer、Long这些类是没有无参构造方法的,因此在以下情况中,会出错 具体类型是未知的,只有全路径类名 String typeSte "java.lang.Integer"; Class<?> typeClass …...
基于微信小程序的员工宿舍报修系统
项目介绍 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时…...
机器学习探索计划——KNN算法流程的简易了解
文章目录 数据准备阶段KNN预测的过程1.计算新样本与已知样本点的距离2.按照举例排序3.确定k值4.距离最近的k个点投票 scikit-learn中的KNN算法 数据准备阶段 import matplotlib.pyplot as plt import numpy as np# 样本特征 data_X [[0.5, 2],[1.8, 3],[3.9, 1],[4.7, 4],[6.…...
ES6之class类
ES6提供了更接近传统语言的写法,引入了Class类这个概念,作为对象的模板。通过Class关键字,可以定义类,基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到,新…...
17 redis集群方案
1、RedisCluster分布式集群解决方案 为了解决单机内存,并发等瓶颈,可使用此方案解决问题. Redis-cluster是一种服务器Sharding技术,Redis3.0以后版本正式提供支持。 这里的集群是指多主多从,不是一主多从。 2、redis集群的目标…...
[数据结构]—栈和队列
💓作者简介🎉:在校大二迷茫大学生 💖个人主页🎉:小李很执着 💗系列专栏🎉:数据结构 每日分享✨:到头来,有意义的并不是结果,而是我们度…...
【GridSearch】 简单实现并记录运行效果
记录了使用for循环实现网格搜索的简单框架。 使用df_search记录每种超参数组合下的运行结果。 lgb_model.best_score返回模型的最佳得分 lgb_model.best_iteration_返回模型的最佳iteration也就是最佳n_extimator import numpy as np import pandas as pd import lightgbm as …...
SecureCRT出现Key exchange failed.No compatible key exchange method. 错误解决方法
SecureCRT出现Key exchange failed.No compatible key exchange method. 如下 Key exchange failed. No compatible key exchange method. The server supports these methods: curve25519-sha256,curve25519-sha256libssh.org,diffie-hellman-group-exchange-sha256解决方法&…...
Android RGB转YUV的算法
将 ARGB(Alpha-Red-Green-Blue)颜色空间转换为 YUV(亮度-色度)颜色空间的常用算法有以下几种: 矩阵转换法 使用预定义的转换矩阵将 RGB 值转换为 YUV 值。其中,Y 表示亮度,U 和 V 表示色度。这…...
Spring事务底层原理(待完善)
EnableTransactionManagement 我们经常使用EnableTransactionManagement开启事务, 这个注解导入一个类,Import(TransactionManagementConfigurationSelector.class), 会在spring容器增加两个bean, AutoProxyRegistrar和ProxyTransactionManagementConfiguration. AutoProxyRe…...
微信小程序 修改默认单选,多选按钮样式
微信小程序 修改默认单选,多选按钮样式 1.在微信开发者文档中复制一份单选或者多选的代码 <!--pages/index3/index.wxml--> <radio-group bindchange"radioChange"><label class"weui-cell weui-check__label" style"dis…...
「最优化基础知识2」一维搜索,以及python代码
最优化基础知识(2) 无约束优化问题,一维搜索 一、一维搜索 一维搜索的意思是在一个方向上找到最小点。 用数学语言描述,X*Xk tPk,从Xk沿着Pk方向行走t到达最小点X*。 1、收敛速度: 线性收敛࿱…...
工厂模式之抽象工厂模式(常用)
抽象工厂模式 工厂方法模式中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机、计算机软件学院只培养计算机软件专业的学生等。 同种类称为同等级,也就是说:工厂方法模式中只考虑生产同等级的产品,但是在现实生…...
如何快速掌握JSON编辑器:React开发者的终极指南
如何快速掌握JSON编辑器:React开发者的终极指南 【免费下载链接】jsoneditor-react react wrapper implementation for https://github.com/josdejong/jsoneditor 项目地址: https://gitcode.com/gh_mirrors/js/jsoneditor-react JSONEditor-React 是一个专门…...
别再只会用cv2.split()看单色图了!手把手教你玩转OpenCV通道分离与合并的3个实战场景
OpenCV通道操作实战:从滤镜设计到植物识别的创意应用 在图像处理领域,通道分离与合并看似基础,实则蕴含着巨大的创意潜力。许多开发者掌握了cv2.split()和cv2.merge()的基本用法后,往往止步于简单的通道查看操作,却忽…...
不只是hosts问题:Git clone失败背后的网络原理与安全风险(附Wireshark抓包分析)
Git Clone失败背后的网络协议全景解析:从DNS到TLS的安全实践 当你输入git clone https://github.com/example/repo.git后终端抛出"Could not resolve hostname"时,多数开发者会条件反射地修改hosts文件。但这个看似简单的报错背后,…...
Python音频信号处理:从基础到实战应用
1. Python音频信号处理基础与生态音频信号处理作为数字信号处理(DSP)的重要分支,涵盖了从基础的声音采集到复杂的音乐信息分析等广泛领域。作为一名长期从事音频算法开发的工程师,我见证了Python如何从最初的脚本语言成长为如今音频处理领域不可或缺的工…...
智能Fastboot可视化工具:如何一键管理Android设备刷机与分区
智能Fastboot可视化工具:如何一键管理Android设备刷机与分区 【免费下载链接】FastbootEnhance A user-friendly Fastboot ToolBox & Payload Dumper for Windows 项目地址: https://gitcode.com/gh_mirrors/fa/FastbootEnhance Fastboot Enhance是一款专…...
告别sudo!手把手教你在Linux服务器上为普通用户安装Node.js(含CentOS/Ubuntu保姆级教程)
告别sudo!Linux服务器非root用户部署Node.js全指南 在共享开发环境或企业级服务器中,开发者常面临一个典型困境:需要最新版Node.js环境但缺乏sudo权限。想象这样一个场景——你刚接手一个云服务器上的Node项目,发现系统预装的Node…...
从 *ngFor 到 Aggregation Binding,SAP UI5 里与循环渲染最接近的写法
问题: SAP UI5 里有类似下面这种 Angular template 的写法吗? <ul><li *ngFor="let promotion of promotions">{{ promotion.description }}</li<...
树莓派Pico玩转双核:用FreeRTOS创建两个独立任务(附代码分析)
树莓派Pico双核实战:FreeRTOS任务分配与核间协作全解析 当开发者第一次将FreeRTOS运行在树莓派Pico上时,往往只利用了RP2040芯片的一个核心——这就像只使用了汽车发动机的一半气缸。实际上,这款售价仅4美元的微控制器搭载了两个Arm Cortex-…...
vulhub系列-74-Hackable III(超详细)
免责声明:本文记录的是 Hackable III 渗透测试靶机 的解题过程,所有操作均在 本地授权环境 中进行。内容仅供 网络安全学习与防护研究 使用,请勿用于任何非法用途。读者应遵守《网络安全法》及相关法律法规,自觉维护网络空间安全。…...
打卡信奥刷题(3138)用C++实现信奥题 P7617 [COCI 2011/2012 #2] KOMPIĆI
P7617 [COCI 2011/2012 #2] KOMPIĆI 题目描述 给定 NNN 个正整数 A1,A2,...,ANA_1,A_2,...,A_NA1,A2,...,AN,求有多少整数对 (i,j)(i,j)(i,j),满足以下条件: 1≤i<j≤N1 \le i < j \le N1≤i<j≤NAiA_iAi 和 AjA_jAj 至…...
