SpringCloud Feign:使用ApacheHttpClient代替默认client

OpenFeign修改HttpClient为Apache HttpClient 5 OpenFeign中http client如果不做特殊配置,OpenFeign默认使用JDK自带的HttpURLConnection发送HTTP请求,由于默认HttpURLConnection没有连接池、性能和效率比较低。所以修改为Apache HttpClient 5。具体操作请往下看。 阅读详情

ApacheHttpClient和默认实现的比较

  • Feign在默认情况下使用的是JDK原生的URLConnection发送HTTP请求,没有连接池,但是对每个地址会保持一个长连接,即利用HTTP的persistence connection。
  • ApacheHttpClient实现了连接池,同时它封装了访问http的请求头,参数,内容体,响应等等,使客户端发送 HTTP 请求变得容易。

ApacheHttpClient 使用

maven 依赖


    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.7</version>
    </dependency>
    <dependency>
        <groupId>io.github.openfeign</groupId>
        <artifactId>feign-httpclient</artifactId>
        <version>10.1.0</version>
    </dependency>


配置文件的修改


feign:
  httpclient:
    enabled: true

创建ApacheHttpClient客户端


import javax.net.ssl.SSLContext;

import lombok.extern.slf4j.Slf4j;

import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.ssl.SSLContexts;
import org.springframework.util.ResourceUtils;

import feign.httpclient.ApacheHttpClient;

@Slf4j
public class FeignClientBuilder {

  private boolean enabled;

  private String keyPassword;
  private String keyStore;
  private String keyStorePassword;
  private String trustStore;
  private String trustStorePassword;

  private int maxConnTotal = 2048;

  private int maxConnPerRoute = 512;

  public FeignClientBuilder(boolean enabled, String keyPassword, String keyStore, String keyStorePassword, String trustStore, String trustStorePassword, int maxConnTotal, int maxConnPerRoute) {
    this.enabled = enabled;
    this.keyPassword = keyPassword;
    this.keyStore = keyStore;
    this.keyStorePassword = keyStorePassword;
    this.trustStore = trustStore;
    this.trustStorePassword = trustStorePassword;

    /**
     * maxConnTotal是同时间正在使用的最多的连接数
     */
    this.maxConnTotal = maxConnTotal;
    /**
     * maxConnPerRoute是针对一个域名同时间正在使用的最多的连接数
     */
    this.maxConnPerRoute = maxConnPerRoute;
  }

  public ApacheHttpClient apacheHttpClient() {

    CloseableHttpClient defaultHttpClient = HttpClients.custom()
            .setMaxConnTotal(maxConnTotal)
            .setMaxConnPerRoute(maxConnPerRoute)
            .build();
    ApacheHttpClient defaultApacheHttpClient = new ApacheHttpClient(defaultHttpClient);

    if (!enabled) {
      return defaultApacheHttpClient;
    }

    SSLContextBuilder sslContextBuilder = SSLContexts.custom();

    // 如果 服务端启用了 TLS 客户端验证,则需要指定 keyStore
    if (keyStore == null || keyStore.isEmpty()) {
      return new ApacheHttpClient();
    } else {
      try {
        sslContextBuilder
                .loadKeyMaterial(
                        ResourceUtils.getFile(keyStore),
                        keyStorePassword.toCharArray(),
                        keyPassword.toCharArray());
      } catch (Exception e) {
        e.printStackTrace();
      }
    }

    // 如果 https 使用自签名证书,则需要指定 trustStore
    if (trustStore == null || trustStore.isEmpty()) {
    } else {
      try {
        sslContextBuilder
//        .loadTrustMaterial(TrustAllStrategy.INSTANCE)
                .loadTrustMaterial(
                        ResourceUtils.getFile(trustStore),
                        trustStorePassword.toCharArray()
                );
      } catch (Exception e) {
        e.printStackTrace();
      }
    }

    try {
      SSLContext sslContext = sslContextBuilder.build();

      SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
              sslContext,
              SSLConnectionSocketFactory.getDefaultHostnameVerifier());

      CloseableHttpClient httpClient = HttpClients.custom()
              .setMaxConnTotal(maxConnTotal)
              .setMaxConnPerRoute(maxConnPerRoute)
              .setSSLSocketFactory(sslsf)
              .build();

      ApacheHttpClient apacheHttpClient = new ApacheHttpClient(httpClient);
      log.info("feign Client load with ssl.");
      return apacheHttpClient;
    } catch (Exception e) {
      e.printStackTrace();
    }

    return defaultApacheHttpClient;
  }


  public static FeignClientBuilderBuilder builder() {
    return new FeignClientBuilderBuilder();
  }

  public static class FeignClientBuilderBuilder {

    private boolean enabled;

    private String keyPassword;
    private String keyStore;
    private String keyStorePassword;
    private String trustStore;
    private String trustStorePassword;

    private int maxConnTotal = 2048;

    private int maxConnPerRoute = 512;

    public FeignClientBuilderBuilder enabled(boolean enabled) {
      this.enabled = enabled;

      return this;
    }

    public FeignClientBuilderBuilder keyPassword(String keyPassword) {
      this.keyPassword = keyPassword;

      return this;
    }
    public FeignClientBuilderBuilder keyStore(String keyStore) {
      this.keyStore = keyStore;

      return this;
    }
    public FeignClientBuilderBuilder keyStorePassword(String keyStorePassword) {
      this.keyStorePassword = keyStorePassword;

      return this;
    }
    public FeignClientBuilderBuilder trustStore(String trustStore) {
      this.trustStore = trustStore;

      return this;
    }
    public FeignClientBuilderBuilder trustStorePassword(String trustStorePassword) {
      this.trustStorePassword = trustStorePassword;

      return this;
    }

    public FeignClientBuilderBuilder maxConnTotal(int maxConnTotal) {
      this.maxConnTotal = maxConnTotal;

      return this;
    }
    public FeignClientBuilderBuilder maxConnPerRoute(int maxConnPerRoute) {
      this.maxConnPerRoute = maxConnPerRoute;

      return this;
    }

    public FeignClientBuilder build() {
      return new FeignClientBuilder(
              this.enabled,
              this.keyPassword,
              this.keyStore,
              this.keyStorePassword,
              this.trustStore,
              this.trustStorePassword,
              this.maxConnTotal,
              this.maxConnPerRoute
      );
    }

  }

}

使用时可以直接使用builder来创建ApacheHttpClient。

微信聊天记录解密,必须是root的手机 手机上安装x-plore软件,将/data/data目录的相关EnMicroMsg.db auth_info_key_prefs.xml拷贝到/storge/emulated/0目录后才可以拷贝到电脑。路径:/data/data/com.tencent.mm/shared_prefs/auth_info_key_prefs.xml。但是是加密过的 需要解密 解密密码生成规则是手机IMEI+微信UIN md5(32位小写)后的前7位。安卓手机要root测试版本微信要7或者8版本都可以。选择message表。 阅读详情

相关推荐

信奥编程启蒙 3068:【例13.3】时间差

现在给出一个时间,单位是秒,要求按照电子表格式输出,输出保证不会超过 2424 小时。3067:【例13.2】 电子表。把时间转化成电子表格式输出。电子表上的时间显示方法形如。

900

SpringCloud4-Feign负载均衡

1.Feign是什么 Feign是一个声明式WebService客户端。使用Feign能让编写Web Service客户端更加简单, 它的使用方法是定义一个接口,然后在上面添加注解。 Spring Cloud对Feign进行了封装,使其支持了Spring MVC标准注解和HttpMessageConverters。Feign可以与Eureka和Ribbon组合使用以支持负载均衡。 2.Feign能...

liang 630

李宏毅机器学习hw3

Homework 3 - Convolutional Neural Network 1作业概述 在food_11文件中有三个文件分别是training、validation、testing,打开training和validation可以看见总共有11种食物(0-10的类别编号),而testing是没有类别编号的。 然后用卷积神经网络对食物图片进行分类。 2导入用到的库 torch库 这个我弄了半天,直接pip总是timeout,用镜像源下下来又出现OSError: [WinError..

老问题的博客 4188

Feign,Apache Http Client,OkHttp的区别

一、在Java中可以使用的HTTP客户端组件主要有3个,如下: (1)HttpURLConnection,JDK自带 (2)Apache HttpComponents,独立的HTTP客户端实现,使用广泛,目前已发展到5.x版本,详见:https://hc.apache.org/index.html (3)OkHttp,一个新出现的HTTP客户端,详见:https://square.github.io/okhttp/ 为什么已经存在了如Apache HTTPClient和OkHttp这样优秀HTTP客

cristianoxm的博客 4445

从ORCAP-1589警告看Cadence ORCAD的DRC设置:如何避免‘网络别名’引发的潜在短路风险

本文深入解析Cadence ORCAD中ORCAP-1589警告的深层含义,探讨网络别名可能引发的短路风险及DRC设置优化方案。通过分析网络别名的设计意图、DRC规则配置及最佳实践,帮助工程师有效规避设计风险,提升电路设计的可靠性和规范性。

weixin_34194829的博客 297

团队管理中最棘手的6个问题

研发团队的管理棘手问题,大多集中在。

xiaolyuh的专栏 743

Spring Cloud Feign 使用Apache的HTTP Client替换Feign原生httpclient

Feign在默认情况下使用的是JDK原生的URLConnection发送HTTP请求,没有连接池,但是对每个地址会保持一个长连接,即利用HTTP的persistence connection 。我们可以用Apache的HTTP Client替换Feign原始的http client, 从而获取连接池、超时时间等与性能息息相关的控制能力。Spring Cloud从Brixtion.SR5版本开始支持

Daniel的博客 1万+

数据资产目录(SailCatalog)和数据地图(SailMap)

笔者接下来准备开发大数据平台(XSailboat)中的数据资产目录(SailCatalog)和数据地图(SailMap)相关的功能,本文用以记录笔者关于此部分功能的概念梳理和主体功能设计。

OkGogooXSailboat的博客 2326

SpringCloud 中Feign原理(图解)

SpringCloud 中Feign原理(图解)

kongkongyanan的博客 3872

OpenCL编译环境配置

在 Linux 系统上配置 OpenCL 开发环境需要安装适当的驱动、运行时和开发工具。

深之JohnChen的专栏 2003

POST 接口,将参数拼接到 URL 上,而不是将其作为表单数据发送

POST 接口,将参数拼接到 URL 上,而不是将其作为表单数据发送

pig_ning的博客 3144

SpringCloudRPC远程调用核心原理:feign.Client客户端容器实例

feign.Client客户端容器实例 前面介绍了常用的Feign客户端实现类,大致如下: (1)Client.Default类:默认的实现类,使用JDK的HttpURLConnnection类提交HTTP请求。 (2)ApacheHttpClient类:该客户端类在内部使用ApacheHttpClient开源组件提交HTTP请求。 (3)OkHttpClient类:该客户端类在内部使用OkHttp3开源组件提交HTTP请求。 (4)LoadBalancerFeignClient类:内部使用Rib

m0_63213529的博客 279

Python 爬虫实战:分析 AJAX 请求抓取搜狐新闻数据

在Web 2.0时代,大量网站采用AJAX技术实现动态内容加载。传统基于静态HTML解析的爬虫技术(如BeautifulSoup)已无法应对这类场景。本文将以搜狐新闻为实战目标,详解如何通过分析AJAX请求接口实现动态新闻数据的精准抓取。

yansideyucsdn的博客 1750

SpringCloud 中 Feign 核心原理

1SpringCloud 中 Feign 核心原理 如果不了解 SpringCloud 中 Feign 核心原理,不会真正的了解 SpringCloud 的性能优化和配置优化,也就不可能做到真正掌握 SpringCloud。 本章从Feign 远程调用的重要组件开始,图文并茂的介绍 Feigh 远程调用的执行流程、Feign 本地 JDK Proxy 实例的创建流程,彻底的为大家解读 SpringCloud 的核心知识。使得广大的工程师不光做到知其然,更能知其所以然。 1.1 简介:Feign远程调用的基本

qq_40971668的博客 501

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Feign 默认 Client 替换

文章目录使用 HTTP Client 替换掉 Feign 默认 Client使用 OKHttp 替换掉 Feign 默认 Client   Feign 在默认情况下使用的是 JDK 原生的 URLConnection 发送HTTP请求,没有连接池,但是对每个地址会保持一个长连接,即利用 HTTP 的 persistence connection。我们可以用 Apache 的 HttpClient...

大漠知秋的加油站 8582

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

SpringCloud 中 Feign介绍

SpringCloud 中 Feign 核心原理 如果不了解 SpringCloud 中 Feign 核心原理,不会真正的了解 SpringCloud 的性能优化和配置优化,也就不可能做到真正掌握 SpringCloud。 本章从Feign 远程调用的重要组件开始,图文并茂的介绍 Feigh 远程调用的执行流程、Feign 本地 JDK Proxy 实例的创建流程,彻底的为大家解读

ThatsThePrice的博客 1205

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

SpringCloud学习--基础--5.4--Feign--原理

从上图可以看到Feign通过处理注解,将请求模板化,当实际调用的时候,传入参数,根据参数再应用到请求上,进而转化成真正的 Request 请求。通过Feign以及JAVA的动态代理机制,使得Java 开发人员,可以不用通过HTTP框架去封装HTTP请求报文的方式,完成远程服务的HTTP调用。

zhou920786312的博客 267

Feign源码分析(五) - spring对Feign的扩展

@Author:zxw @Email:502513206@qq.com 目录 Feign源码分析(一) - 初探Feign Feign源码分析(二) - builder构建 Feign源码分析(三) - Client调用 Feign源码分析(四) - 自定义扩展点​ 1.前言 在上一篇文章中已经分析了Feign有哪些常见的扩展点供我们使用,其中比较关键的几个点有如下 对Client的封装,整合ribbon和hytrix contract解析接口注解 2.扩展 2.1 Client 通过之前的分析了

V_zxw的博客 510

深入讲解Feign

Feign是Netflix开源的声明式HTTP客户端feign默认是不打印任何日志的,但是我们希望打印一些日志信息。比如调用的时间。级别打印日志内容NONE(默认值)不记录任何日志BASIC仅记录请求方法、URL、响应状态代码以及执行时间HEADERS记录BASIC级别的基础上,记录请求和响应的headerFULL记录请求和响应的header、body和元数据方式一:让父子上下文ComponentScan重叠(强烈不建议使用)/*** 日志级别。

qq_64912062的博客 638

SpringCloud

SpringCloud1.什么是微服务?2.微服务架构的优点?3.微服务架构的缺点?4.SpringCloud和SpringBoot的关系?5.SpringCloud和Dubbo的区别? 1.什么是微服务? 微服务化的核心就是将传统的一站式应用,根据业务拆分成一个一个服务,彻底的解耦,每一个微服务提供单个业务功能的服务,一个服务做一件事,从技术角度看就是一种小而独立的处理过程,类似进程的概念,能...................................................

weixin_43766298的博客 356

SpringCloudRPC远程调用核心原理:Feign弹性RPC客户端的重要组件,腾讯java面试有几轮

*/ @RequestMapping(value = “/echo/{word}/v1”, method = RequestMethod.GET) RestOut echo( @PathVariable(value = “word”) String word); } 注意,DemoClient远程调用接口加有@FeignClient注解,Feign在启动时会为带有@FeignClient注解的接口创建一个动态代理RPC客户端实例,并注册到Spring IOC容器,如图3-12所示。 图3-12 远程调用接

m0_64384202的博客 292

Java HttpClient FeignClient

介绍:借用github上对Feign介绍的一句话——用Feign写HTTP客户端更轻松 Feign的入门可以完全参考github上的介绍 https://github.com/OpenFeign/feign Feign的内部机制是使用RestTemplate来实现 本文主要介绍SpringCloud项目里Feign作为客户端使用的一些知识点 需要注意的是单独使用Feign和Sprin

王树伦的博客 1万+

SpringBoot整合Gateway与Feign的踩坑指南与高可用实践

Spring Cloud Gateway是微服务架构中的响应式API网关,基于WebFlux和Netty实现高性能路由;Feign则是声明式HTTP客户端,用于服务间通信。二者协同工作时,因线程模型差异(EventLoop vs 阻塞IO)、上下文传递断裂、自动配置隐式耦合及版本兼容性问题,极易引发静默失败、超时失准、TraceID丢失等典型故障。其技术价值在于支撑高并发、可观测、易治理的分布式调用链路,广泛应用于电商、IoT、中台等需统一入口与细粒度熔断的场景。本文聚焦SpringBoot 3.x + S

weixin_34414650的博客 988

Feign 系列(05)Spring Cloud OpenFeign 源码解析

Feign 系列(05)Spring Cloud OpenFeign 源码解析 文章目录Feign 系列(05)Spring Cloud OpenFeign 源码解析1. Spring Cloud OpenFeign 最简使用1.1 引入 maven1.2 @EnableFeignClients 注解扫描包1.3 @FeignClient 配置2. Feign 整体装配流程分析3. Feign 自...

binarylei的博客 421

2021-02-18实习日报

1. SpringCloud中Feign原理 1.1 Feign远程调用的基本流程 Feign远程调用,核心就是通过一系列的封装和处理,将以JAVA注解的方式定义的远程调用API接口,最终转换成HTTP的形式,然后将HTTP的请求的响应结果,解码成JAVA Bean,放回给调用者,Feign远程调用的基本流程 可以看到,Feign通过处理注解,将请求模板化,当实际调用的时候,传入参数,根据参数在应用到请求上,进而转换为真正的Request请求,通过Feign以及JAVA的动态代理机制,使得JAVA的开发人

qq_42337039的博客 248
上一篇: HTTP Basic Auth:使用和Postman 测试
下一篇: Spring中使用@Async来实现异步调用
过河的小卒子
博客等级 码龄10年 39粉丝 112原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值