Spring cloud系列十五 使用线程池优化feign的http请求组件

SpringCloud Alibaba - 基于 FeignClient 整合 Sentinel,实现“线程隔离”和“熔断降级” 熔断降级就是通过一个短路器取统计服务调用的时候 “异常比例、慢调用比例、异常数量”,比如说统计的是异常比例,那么如果异常比例过高,触发了阈值就会熔断该服务,这样就把故障的服务隔离开了.这就像是古代的武侠人士,手被毒蛇咬了,赶紧手起刀落,把手砍断,防止毒扩散到全身,但是这把手砍了算不了什么本事啊,能接回来才是真本事.而 Sentinel 就可以在服务恢复时,让熔断器放行访问该服务的请求. 阅读详情

1. 概述

在默认情况下 spring cloud feign在进行各个子服务之间的调用时,http组件使用的是jdk的HttpURLConnection,没有使用线程池。本文先从源码分析feign的http组件对象生成的过程,然后通过为feign配置http线程池优化调用效率。

2. 源码分析

我们分析源码spring cloud feign。在spring-cloud-netflix-core/META-INF/spring.factories中可以看到,在spring boot自动配置会初始化FeignRibbonClientAutoConfiguration,这个类会生成Ribbon的使用http组件。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.netflix.feign.ribbon.FeignRibbonClientAutoConfiguration,\
  • 1
  • 2

分析配置类是FeignRibbonClientAutoConfiguration 
下面分析此类import的3个类:HttpClientFeignLoadBalancedConfiguration,OkHttpFeignLoadBalancedConfiguration,DefaultFeignLoadBalancedConfiguration

@Import({ HttpClientFeignLoadBalancedConfiguration.class,
    OkHttpFeignLoadBalancedConfiguration.class,
    DefaultFeignLoadBalancedConfiguration.class })
public class FeignRibbonClientAutoConfiguration {
 …
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

HttpClientFeignLoadBalancedConfiguration 
为feigin配置appache client的线程池 
当引入ApacheHttpClient.class类时,会初始化这个配置类 
方法feignClient()中:根据@ConditionalOnMissingBean(Client.class)知道如果有HttpClient 对象,则创建的ApacheHttpClient使用自己定义的HttpClient 。如果没有,则使用默认值。最后生成LoadBalancerFeignClient对象

@Configuration
@ConditionalOnClass(ApacheHttpClient.class)
@ConditionalOnProperty(value = "feign.httpclient.enabled", matchIfMissing = true)
class HttpClientFeignLoadBalancedConfiguration {

    @Autowired(required = false)
    private HttpClient httpClient;

    @Bean
    @ConditionalOnMissingBean(Client.class)
    public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory,
          SpringClientFactory clientFactory) {
        ApacheHttpClient delegate;
        if (this.httpClient != null) {
            delegate = new ApacheHttpClient(this.httpClient);
        } else {
            delegate = new ApacheHttpClient();
        }
        return new LoadBalancerFeignClient(delegate, cachingFactory, clientFactory);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

OkHttpFeignLoadBalancedConfiguration 
为feigin配置OkHttp,类似apache httpclient, 这里略。 
DefaultFeignLoadBalancedConfiguration 
为feigin配置HttpURLConnection, 
方法feignClient():只有以上两个Client没有生产对象时,才在这个方法中使用Client.Default生成LoadBalancerFeignClient

@Configuration
class DefaultFeignLoadBalancedConfiguration {
    @Bean
    @ConditionalOnMissingBean
    public Client feignClient(CachingSpringLoadBalancerFactory cachingFactory,
          SpringClientFactory clientFactory) {
        return new LoadBalancerFeignClient(new Client.Default(null, null),
            cachingFactory, clientFactory);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

查看Client.Default的源码,Default 使用HttpURLConnection 建立连接且每次请求都建立一个新的连接

 public static class Default implements Client {
    @Override
    public Response execute(Request request, Options options) throws IOException {
      HttpURLConnection connection = convertAndSend(request, options);
      return convertResponse(connection).toBuilder().request(request).build();
    }
   ….
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

综上所述,在默认情况下,spring cloud 没有引入httpclient和okhttp的jar包,所有默认使用HttpURLConnection

3. 使用appach httpclient线程池

默认情况下,服务之间调用使用的HttpURLConnection,效率非常低。为了提高效率,可以通过连接池提高效率,本节我们使用appache httpclient做为连接池。配置OkHttpClient连接池,也是类似的方法,这里略。 
经过上节的分析,配置线程池方法:引入appache httpclient并启动对应配置,最后还需要生成HttpClient对象。

3.1. pom.xml中引入feign-httpclient.jar

<!-- 增加feign-httpclient -->
 <dependency>
     <groupId>io.github.openfeign</groupId>
     <artifactId>feign-httpclient</artifactId>
  </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

3.2. 配置参数application-hystrix-feign.yml启动httpclient

# feign配置
feign:
  hystrix:
    # 在feign中开启hystrix功能,默认情况下feign不开启hystrix功能
    enabled: true
  ## 配置httpclient线程池
  httpclient:
    enabled: true
  okhttp:
    enabled: false
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

3.3. 自定义配置类

使用配置类,生成HttpClient 对象。因为使用PoolingHttpClientConnectionManager连接池,我们需要启动定时器,定时回收过期的连接。配置定时回收连接池的原因,见问题备忘: httpclient连接池异常引发的惨案

@Configuration
public class HttpPool {

    @Bean
    public HttpClient httpClient(){
        System.out.println("init feign httpclient configuration " );
        // 生成默认请求配置
        RequestConfig.Builder requestConfigBuilder = RequestConfig.custom();
        // 超时时间
        requestConfigBuilder.setSocketTimeout(5 * 1000);
        // 连接时间
        requestConfigBuilder.setConnectTimeout(5 * 1000);
        RequestConfig defaultRequestConfig = requestConfigBuilder.build();
        // 连接池配置
        // 长连接保持30秒
        final PoolingHttpClientConnectionManager pollingConnectionManager = new PoolingHttpClientConnectionManager(30, TimeUnit.MILLISECONDS);
        // 总连接数
        pollingConnectionManager.setMaxTotal(5000);
        // 同路由的并发数
        pollingConnectionManager.setDefaultMaxPerRoute(100);

        // httpclient 配置
        HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
        // 保持长连接配置,需要在头添加Keep-Alive
        httpClientBuilder.setKeepAliveStrategy(new DefaultConnectionKeepAliveStrategy());
        httpClientBuilder.setConnectionManager(pollingConnectionManager);
        httpClientBuilder.setDefaultRequestConfig(defaultRequestConfig);
        HttpClient client = httpClientBuilder.build();


        // 启动定时器,定时回收过期的连接
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            @Override
            public void run() {
                //        System.out.println("=====closeIdleConnections===");
                pollingConnectionManager.closeExpiredConnections();
                pollingConnectionManager.closeIdleConnections(5, TimeUnit.SECONDS);
            }
        }, 10 * 1000, 5 * 1000);
        System.out.println("===== Apache httpclient 初始化连接池===");

        return client;
    }


}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

3.4. 测试:

启动工程:cloud-registration-center、cloud-service-hystrix 
启动服务:HystrixFeignCloudConsumerApplication 
执行请求:http://127.0.0.1:12082/hystrix-feign/simple

配置日志为debug输出(设置logback-spring.xml为 level为DEBUG),如果日志有类似一下的输出(包含PoolingHttpClientConnectionManager ),则表示连接池配置成功

2018-04-09 23:11:49.017 [hystrix-cloud-hystrix-service-1] DEBUG o.a.h.i.c.PoolingHttpClientConnectionManager - Connection request: [route: {}->http://192.168.0.113:12081][total kept alive: 0; route allocated: 0 of 100; total allocated: 0 of 5000]
2018-04-09 23:11:49.020 [hystrix-cloud-hystrix-service-1] DEBUG o.a.h.i.c.PoolingHttpClientConnectionManager - Connection leased: [id: 0][route: {}->http://192.168.0.113:12081][total kept alive: 0; route allocated: 1 of 100; total allocated: 1 of 5000]
  • 1
  • 2

4. 代码

以上的详细的代码见下面 
github代码,请尽量使用tag v0.12,不要使用master,因为我不能保证master代码一直不变

 

https://blog.youkuaiyun.com/hry2015/article/details/79904815

 

 

 

Feign的基本使用、日志配置和连接池配置详解 阅读详情

相关推荐

Spring Cloud OpenFeign中基于线程池的Hystrix熔断传值问题

然而,在使用基于线程池的Hystrix熔断机制时,我们可能会遇到传值问题,即在服务降级时无法正确传递参数。线程隔离是Hystrix的核心机制之一,它使用线程池来隔离服务调用,以防止失败的服务调用对其他服务调用产生影响。这里我们需要注意的是,在使用基于线程池的Hystrix熔断时,Hystrix会使用不同的线程来处理降级逻辑,导致无法直接传递参数。通过以上的代码和解释,我们解决了在使用Spring Cloud OpenFeign和基于线程池的Hystrix熔断时的传值问题。在上述代码中,我们定义了一个名为。

CyberNerdX的博客 303

feign 线程池数设置

1, feign默认的线程池大小为10个, 并发请求时, feign调用会报错,需要将线程池调高 hystrix.threadpool.default.coreSize=80 2, 设置从调用线程允许HystrixCommand.getFallback()方法的最大请求数。 SEMAPHORE模式有效默认值:10 fallback.isolation.semaphore.maxConcurren...

sinat_36454672的博客 8076

从贝塞尔曲线到FFD变形

贝塞尔曲线的性质到FFD变形 与Hermite曲线通过始末两点和亮点的方向来绘制曲线不同,贝塞尔样条曲线是通过多个关键控制点构成曲线,曲线有如下良好的性质,这些性质决定了FFD最终使用贝塞尔样条曲线而非Hermite曲线。 对于给定关键点的贝塞尔曲线,曲线穿过最开始和最后的关键点 曲线的大致趋势与关键点相契合 曲线在关键点的包围之中,不会伸出到关键点以外现提出两个问题:为什么说这样的性质很契合FFD

雨诺寒雪的博客 2149

本博客文章汇总

Spring

weixin_37862824的博客 953

Android布局基础与UI设计入门:打造精美应用界面

恭喜你!现在你已经掌握了Android UI开发的基础知识,包括各种布局类型、常用控件的使用以及一些UI优化技巧。这些知识将帮助你设计出既美观又实用的Android应用界面。

m0_65382359的博客 2056

树莓派4B:控制步进电机

文章目录准备阶段接线阶段树莓派程序 准备阶段 准备以下物品,淘宝都可以买到: 57步进电机 电源开关(220v转24v,3A,72W) 步进电机驱动器 电源线 电线 杜邦线 树莓派4B一套 具体型号如下: 接线阶段 整体:接线效果如下图 电源开关起220v转24v作用,很好接线,输出24v接入步进电机驱动器 步进电机驱动器的 A+ A- B+ B- 按提示接步进电机四线,步进电机上就会有说...

学习路上的鸭子的博客 1万+

Sentinel总结

Sentinel 是阿里巴巴开源的面向分布式服务架构的流量控制组件,以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来保护服务的稳定性。核心定位:流量控制:限制 QPS / 并发线程数,防止流量把服务压垮熔断降级:当调用链路中某个资源不稳定时,自动熔断,防止级联故障系统自适应保护:根据系统负载(CPU、Load、RT)自动限流,防止雪崩热点参数限流:针对热点商品、热点用户单独限流授权规则:黑白名单控制访问来源// 白名单// 黑名单// 应用列表通过实现// 加载配置。

mmsyyxkmnew的博客 153

BambuStudio学习笔记:GCode 类

关键成员解析 核心配置组件 状态跟踪系统 功能模块集成 核心方法剖析 主输出管道 实现多阶段处理: 分层处理流程: 实现智能路径规划: 关键特性: 实现模板故障检测: 采用三级流水线: 支持扩展类型: 实现多通道输出: 采用: 实现: 支持: 支持模块化编译: 典型流程: 实现功能:

zzzkk2009的专栏 930

2026年AI编程工具实战指南:选型、集成与避坑

AI编程工具已从代码补全进化为开发者副驾驶,其核心价值在于缓解人脑带宽瓶颈、理解上下文语义、适配私有领域知识。原理上依赖大模型对百万级开源代码与本地代码库的联合建模,结合RAG增强和上下文感知推理;技术价值体现在提升调试效率、自动生成合规文档、嵌入CI/CD实现语义级质量门禁;典型应用场景覆盖Java微服务开发、Python数据脚本调试、跨环境版本一致性治理等工程痛点。尤其在Spring Boot 3.4响应式配置、pandas环境漂移、API文档缺失等高频问题中,Claude Code等支持中文语境理解与

chunchan1381的博客 400

【OpenClaw企业级智能体实战】第11篇:制造业设备预测性维护实战——OpenClaw+DeepSeek+Prometheus从零搭建(附完整代码)

本文聚焦制造业设备预测性维护的核心痛点,基于OpenClaw v2026.2.1、DeepSeek智能诊断、Prometheus监控等工具,拆解“设备状态监控→智能故障诊断→预测性维护”三大核心场景。从技术原理、算法构建、实操流程到完整代码实现,提供“数据采集→模型训练→智能调度→自动处置”的全链路方案。方案遵循工业安全规范,采用“只读优先、权限最小化”原则,适配中小制造企业落地需求。通过虚拟案例验证,可使设备非计划停机时间下降65%、平均修复时间缩短47%,既适合新手快速入门,也为进阶读者提供架构优化思路

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 606

PR工具timing report中setup time的计算过程

然后去pr工具里报告report_delay_calculation/reportDelayCalculation -from related_pin -to constraint_pin。这里constraint pin就是D pin (D0 D1 D2 D3),related pin就是 CK pin。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 455

SSO审计日志工程实践:从链路追踪到主动告警的四道纪律

在分布式系统和微服务架构中,可观测性是保障系统稳定与安全的核心能力,它通过日志、指标和追踪三大支柱,让系统的内部运行状态变得透明可视。其原理在于,通过标准化的数据采集、上下文传递和关联分析,将散落在各处的运行信息串联成完整的业务链路。这一技术价值巨大,不仅能实现快速故障定位,更能支撑主动式的安全威胁发现与性能优化。尤其在单点登录(SSO)这类关键身份认证场景下,构建一套高标准的审计日志体系,是实现有效可观测性的具体实践。本文聚焦于SSO审计日志,深入阐述了确保其效能的四道关键工程纪律,其中,利用 `trac

weixin_34280237的博客 416

OSG三维渲染引擎编程学习之一百:“第十一章:OSG粒子” 之 “11.1 粒子的主要模块”

OSG;三维渲染引擎编程学习;第十一章:OSG粒子;11.1 粒子的主要模块

LuckyHanMo的博客 799

feign(hystrix)-基础使用及配置(2)

1. Hystrix 的禁用 问题:项目中有需求是不使用熔断机制的,例如退款请求;熔断的禁用可以有以下几种方式: 关闭熔断配置,这个配置就导致整个模块全部不可用 feign: hystrix: enabled: false fallback/fallbackFactory 注释掉:这个方法会抛出 No fallback for HystrixCommand 异常 ,不是好的选择 官方的局部禁用 @Configuration public class FeignDisableHys

dingdongsnow的博客 1531

单智能体篇:Prompt工程艺术

模型在接收到 Prompt 时会自动扮演“角色”,角色定义的好坏直接影响智能体输出的风格和专业性。角色定义的重要性让智能体具备明确身份,例如“你是一位专业理财顾问”或“你是一个幽默的文案创作助手”。角色限定了模型知识输出的范围,使回答更专业、更贴合预期。实战示例模糊Prompt给我一些投资建议。你可以投资股票或者基金。优化Prompt你是一位具有10年经验的专业理财顾问,请给我针对30岁男性,年收入20万,风险偏中等的投资组合建议。

公众号:AI前沿侦探 1304

SAP B1中文培訓教材_SDK

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

springcloud-openfeign-hystrix 实现不同openfeign客户端使用不同线程池

私有线程池配置,customerFeign客户端的contextId。// 从配置文件获取配置信息,判断是否定义私有线程池配置。

jieshe0265的博客 575

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Spring Cloud框架学习-Spring Cloud OpenFeign

Spring Cloud OpenFeign 是声明式的服务调用组件,它整合了 Ribbon 和 Hystrix,拥有负载均衡和服务容错的功能。一开始这个组件不叫这个名字,一开始就叫 Feign,但是 Netflix 中的组件现在已经停止开源工作,OpenFeign 是 Spring Cloud 团队在 Netflix Feign 的基础上开发出来的声明式服务调用组件。...

huangjhai的博客 1490

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Spring Cloud Feign--常用的配置

客户端类型 其他网址 使用Spring Cloud Feign作为HTTP客户端调用远程HTTP服务-Okeeper's BlogSpring Cloud 学习(8) --- Feign(三) http client 替换、GET 方式传递 POJO等 - 简书 简介 Feign是对普通HTTP客户端的一层封装,其目的是降低集成成本、提升可靠性。Feign支持三种HTTP客户端,如下: HttpURLConnection:JDK自带的,不支持线程池,性能差。(Feign默认客户端) H

IT利刃出鞘的博客 4135

线程池Feign调用内部服务异常定位

某业务计划发布后,异步初始化积分业务,异步线程池中线程Feign调用内部服务出现异常。

zbw237798856的博客 1910

如何解决线程池Feign调用失败的

如何解决线程池Feign调用失败的问题

dyk121的博客 875

spring cloud Feign 通过注解配置线程池等 Hystrix 属性

package com.sande.order.accountApi; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.cloud.netflix.ribbon.RibbonClient; import...

lixiaxin200319的博客 4770

openFeign配置okhttp

openFeign配置okhttp

Crzep的博客 1611

OpenFeign 与 Feign 的深度剖析(二):进阶配置与实践篇

配置超时时间:Feign 默认的超时时间可能无法满足某些服务调用场景的需求。可以通过创建一个配置类来自定义 Feign 的超时时间。在上述代码中,我们通过配置 OkHttpClient 的连接超时时间(connectTimeout)、读取超时时间(readTimeout)和写入超时时间(writeTimeout)都为 10 秒,来满足对服务调用超时时间的自定义需求。自定义重试机制。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 1608
上一篇: Linux性能分析工具top命令详解
下一篇: JVM调优命令-jstat
JIESA
博客等级 码龄16年 212粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值