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、收敛速度: 线性收敛࿱…...
工厂模式之抽象工厂模式(常用)
抽象工厂模式 工厂方法模式中考虑的是一类产品的生产,如畜牧场只养动物、电视机厂只生产电视机、计算机软件学院只培养计算机软件专业的学生等。 同种类称为同等级,也就是说:工厂方法模式中只考虑生产同等级的产品,但是在现实生…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...
Unity VR/MR开发-VR开发与传统3D开发的差异
视频讲解链接:【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...
鸿蒙Navigation路由导航-基本使用介绍
1. Navigation介绍 Navigation组件是路由导航的根视图容器,一般作为Page页面的根容器使用,其内部默认包含了标题栏、内容区和工具栏,其中内容区默认首页显示导航内容(Navigation的子组件)或非首页显示(Nav…...
