来源:https://www.cnblogs.com/mufeng3421/p/11442412.html
提示:如果只看如何解决问题,请看文章的末尾如何解决这个问题
1. 场景描述
最近项目中使用了feign当做http请求工具来使用、相对于httpclient、resttemplate来说,fegin用起来方便很多。然后项目有httptrace的需求,需要输出请求日志。
(资料图片)
所以就开启了feign自己的日志,发现它自带的日志是debug级别才能打印。而且是逐行打印的,看日志非常的不方便。所以需要输出json格式的日志最好。
2.解决步骤
2.1 引入feign依赖
org.springframework.cloud spring-cloud-starter-openfeign org.springframework.cloud spring-cloud-dependencies ${自行选择适合项目的版本} pom import
这里使用了spring-cloud-openfeing来避免自己手工实现feign的注入,用法上和feign一样
推荐一个开源免费的 Spring Boot 实战项目:
https://github.com/javastacks/spring-boot-best-practice
2.2 配置feign
在入口类上添加 @EnableFeignClients
注解
@SpringBootApplication@EnableFeignClientspublic class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); }}
使用feing自己的Contract,方便使用feign自己的注解来声明http接口。这里使用了一个配置类
@Configurationpublic class FeignConfig { @Bean public Contract feignContract() { return new feign.Contract.Default(); }}
2.3 声明接口
只需要声明一个带有@FeignClient注解的接口,就声明好了一个Feign的http请求接口
@FeignClient(name = "accessPlatform", url = "${url.access-platform}")public interface AccessPlatformFeignClient { @RequestLine("GET /access-platform/resource") List queryResourceList(@QueryMap Map query);}
3.切换Feign的客户端为OkHttp
由于feign自带的http客户端实现是HttpURLConnection,没有连接池功能,可配置能力也比较差,因此我们使用okhttp作为底层的http客户端的具体实现。
3.1 引入okhttp的依赖
io.github.openfeign feign-okhttp ${feign-okhttp.version}
3.2 修改之前的FeignConfig配置类
问题就出在这里、不过先不急,我们继续
@Configuration@ConditionalOnClass(Feign.class)@AutoConfigureBefore(FeignAutoConfiguration.class)public class FeignConfig { // 注入feignContract @Bean public Contract feignContract() { return new feign.Contract.Default(); } // 注入自定义的okHttpClient @Bean public okhttp3.OkHttpClient okHttpClient(){ return new okhttp3.OkHttpClient.Builder() .readTimeout(60, TimeUnit.SECONDS) .connectTimeout(60, TimeUnit.SECONDS) .writeTimeout(120, TimeUnit.SECONDS) .connectionPool(new ConnectionPool()) .build(); }}
开启okhttp作为feign的客户端
# application.ymlfeign: okhttp: enabled: true
一切完美、网上的许多博客也都是这么写的。然后它们告诉你已经配置完了?呵呵,你们到底自己试过没有??
3.3 试着请求一下
当然这里出问题了,发出的请求并非来自okhttp,还是默认的JDK的HttpURLConnection,问题出在哪里呢?接着看
4.找出问题所在
我怀疑是feing在注入配置的时候,根本就没有运行关于okhttp的配置
4.1 查看服务启动时feign配置过程
1.将服务根日志级别调整为debug级别
logging: level: root: debug
2.启动服务、查看控制台输出
看到没,okhttp的配置不符合配置运行条件。
3.查询 FeignAutoConfiguration
这个配置类的细节
@Configuration@ConditionalOnClass({Feign.class})@EnableConfigurationProperties({FeignClientProperties.class, FeignHttpClientProperties.class})public class FeignAutoConfiguration {// .....其他的配置 @Configuration @ConditionalOnClass({OkHttpClient.class}) @ConditionalOnMissingClass({"com.netflix.loadbalancer.ILoadBalancer"}) @ConditionalOnMissingBean({okhttp3.OkHttpClient.class}) @ConditionalOnProperty({"feign.okhttp.enabled"}) protected static class OkHttpFeignConfiguration { // ...okhttp的配置 } // .....其他的配置}
就是这个自动配置类搞的鬼、当我看到 @ConditionalOnMissingBean({okhttp3.OkHttpClient.class})
这个注解时,我就明白了。翻成白话就是,只有当容器中没有OkHttpClient的实例时。他才会运行。如果在 FeignAutoConfiguration之前注入了我们自己定义的OkHttpClient实例,那不好意思,我不干了?无不注入。
5.解决问题
既然自动配置不干,那我们自己动手干。拷贝 FeignAutoConfiguration
配置类中的配置过程,粘贴在FeignConfig配置类中手动注入feign的client。Ok!完美解决。
@Configuration@ConditionalOnClass(Feign.class)@AutoConfigureAfter(FeignAutoConfiguration.class)public class FeignConfig {// private okhttp3.OkHttpClient okHttpClient; @Bean public Contract feignContract() { return new feign.Contract.Default(); } @Bean @ConditionalOnMissingBean({Client.class}) public Client feignClient(okhttp3.OkHttpClient client) { return new feign.okhttp.OkHttpClient(client); } @Bean @ConditionalOnMissingBean({ConnectionPool.class}) public ConnectionPool httpClientConnectionPool(FeignHttpClientProperties httpClientProperties, OkHttpClientConnectionPoolFactory connectionPoolFactory) { Integer maxTotalConnections = httpClientProperties.getMaxConnections(); Long timeToLive = httpClientProperties.getTimeToLive(); TimeUnit ttlUnit = httpClientProperties.getTimeToLiveUnit(); return connectionPoolFactory.create(maxTotalConnections, timeToLive, ttlUnit); } @Bean public OkHttpClient client(OkHttpClientFactory httpClientFactory, ConnectionPool connectionPool, FeignHttpClientProperties httpClientProperties) { Boolean followRedirects = httpClientProperties.isFollowRedirects(); Integer connectTimeout = httpClientProperties.getConnectionTimeout(); Boolean disableSslValidation = httpClientProperties.isDisableSslValidation(); return httpClientFactory.createBuilder(disableSslValidation) .connectTimeout((long)connectTimeout, TimeUnit.MILLISECONDS) .followRedirects(followRedirects) .connectionPool(connectionPool) .addInterceptor(new OkHttpLogInterceptor()) // 自定义请求日志拦截器 .build(); }}
6.小结
如果你没有耐心看完所有的过程的话。就记住一句话:用自己手动注入Feign的Client实现,来代替 Feign的自动配置所做的过程就好了。具体的配置请看第5点。
近期热文推荐:
1.1,000+ 道 Java面试题及答案整理(2022最新版)
2.劲爆!Java 协程要来了。。。
3.Spring Boot 2.x 教程,太全了!
4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!
5.《Java开发手册(嵩山版)》最新发布,速速下载!
觉得不错,别忘了随手点赞+转发哦!
-
真实案例:Feign 切换 okhttp 无法生效,被老大骂的有点慌! 天天热文来源:https: www cnblogs com mufeng3421 p 11442412 html提示:如果
-
世界讯息:预算948万元 北京市禁毒科技中心采购液质联用仪等仪器设备在毒品治理体系进程中,科技支撑的重要性日益凸显。近年来,面对严峻的
-
象棋大师柳大华的精彩对局首战闯关2019年中国象棋联赛第5轮,柳大华率领的天津队迎战广州队。首
-
邮政银行可以兑换外币吗 可以兑换美元吗 快资讯打算出国旅游或者是留学,都会提前做好相关准备,大部分人会选择兑换一
-
甘肃省全力推动中医药产业高质量发展纪实甘肃省全力推动中医药产业高质量发展纪实
-
全球关注:规范从业者身份 不让陪伴经济成为法外之地“学生,陪玩游戏,周末接单”“线下陪玩,超短裙、黑丝,你想让我怎么
-
美商务部再将31家中国公司列入“实体清单” 全球热资讯美国商务部工业与安全局当地时间周一在《联邦公报》刊登了一份定于6月1
-
深圳分级诊疗初步形成,市民看病更加方便 逾九成市民10分钟内可达最近医疗点深圳新闻网2023年6月14日讯(深圳特区报记者李舒瑜)近年来,我市的医
-
当前资讯!6月西瓜批发价创13年来新高 小型西瓜销量占比3年间上涨近10个百分点今年西瓜有多贵?6月全国西瓜批发均价为2 22元 斤,创13年同期新高。但
-
畅言魏婴虽然极力安抚,可蓝湛还是很不安。晚上休息时,将魏婴紧紧抱住。魏
-
焦点要闻:合生创展集团(00754.HK):6月13日南向资金减持15.06万股6月13日北向资金减持15 06万股合生创展集团(00754 HK)。近5个交易日
-
天天新消息丨paypal手续费计算_paypal手续费怎么算1、如果你是支付,你不需要承担手续费。2、如果你是收款,你需要被收取
-
节目策划案范本_节目策划案-当前动态1、全面定位:要求在大制作的前提下规范广播电视节目的制作流程,在节
-
[快讯]宇邦新材850万限售股6月21日解禁CFi CN讯:宇邦新材(股票代码:301266)在2023年06月21日新增可售A股8
-
跨城最快4小时!江苏6市开通“高铁急送”服务近日,中国国家铁路集团有限公司(国铁集团)旗下中铁快运股份有限公司
-
东山县气象台发布雷电黄色预警信号【2023-06-13】-全球球精选东山县气象台发布雷电黄色预警信号【2023-06-13】东山县气象台2023年06
-
赵明剑炮轰石家庄主帅!大连队即便开窗,谢晖敢要他?球迷:搞不好对喷 环球热点评某度上资料显示,赵明剑现年35岁,其实并不真实。赵明剑前不久在直播中
-
美硕科技:发行价格为37.4元/股 6月15日网上、网下申购 热点评美硕科技6月13日晚间披露发行公告:本次公开发行股票数量为1800万股,
-
企业文化管理的心得体会_企业文化管理1、从企业文化管理角度来看,企业文化主要包括第一,企业创新文化创新
-
当前看点!丽水云和崇头镇:送戏下乡,让群众在家门口乐享“文化大餐”为在全县形成关注档案、走进档案、理解档案、支持档案工作的良好氛围,
-
蔚来号召员工为车主献血 称“伙伴们都在积极报名” 全球今热点蔚来号召员工为车主献血称“伙伴们都在积极报名”
-
每日资讯:近日,有印度海军前中校桑迪普·达万在媒体上公开发表言论近日,有印度海军前中校桑迪普·达万在媒体上公开发表言论,中校,军队,
-
【新视野】深圳邮局海关查获大麻2531.9克人民网北京6月13日电(记者王震)据海关总署办公厅官方微博@海关发布消息
-
厦门失业保险缴费基数是多少2023厦门失业保险缴费基数是多少2023社保网小编整理了最新资讯一起来了解一
-
每日关注!中国银行焦作分行:行长进万企活动取得显著成效自“行长进万企”活动开展以来,中国银行焦作分行主动承担社会责任,充
-
天天实时:开业大吉祝福语大全朋友之间怎么说(开业大吉祝福语大全朋友之间)来为大家解答以上问题。开业大吉祝福语大全朋友之间怎么说,开业大吉祝
-
厂字头解析_厂字头|焦点1、“厂”字头的字有:厄ě厅tīng。2、厃wēi。3、厉lì。4、厈hàn。
-
双柏公安“四强化”助力治安乱点排查整治提升原标题:双柏公安“四强化”助力治安乱点排查整治提升近日,双柏县公安
-
全球百事通!手机单机游戏盒子推荐 单机游戏合集手机单机游戏盒子是很多的玩家很喜欢的游戏的类型之一,在手机单机游戏
-
岚图汽车CFO沈军:会进行B轮融资,有IPO规划转自:上海证券报上证报中国证券网讯(记者俞立严)6月13日,岚图汽车C