Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【连载 29】HttpClient详解之客户端

【连载 29】HttpClient详解之客户端

作者头像
FunTester
发布于 2025-04-06 14:06:04
发布于 2025-04-06 14:06:04
19900
代码可运行
举报
文章被收录于专栏:FunTesterFunTester
运行总次数:0
代码可运行

在当今高性能、高并发的网络应用开发中,HTTP客户端作为系统间通信的核心组件,其配置优化直接影响着整体性能表现。Apache HttpClient作为Java生态中最成熟、功能最丰富的HTTP客户端工具库,为开发者提供了高度可定制的连接管理、请求控制和异常处理机制。本节将深入剖析HttpClient的核心配置项,从连接池管理、SSL安全策略到超时控制、重试机制,全面讲解如何构建一个高性能、高可靠的HTTP客户端实例。通过精细调节连接数、路由策略、报文约束等参数,开发者能够有效提升系统吞吐量,避免资源浪费,同时掌握多用户并发场景下的Cookie管理技巧和异常请求的智能重试策略,为构建企业级应用通信框架奠定坚实基础。

4.1节我们学习了HTTP协议的基础知识以及对应的Java HttpClient中的类,下面讲解HttpClient中这些类和对象的详细使用语法和常见功能的代码实现。本节的代码内容均包含在org.funtester.performance.books.chapter04.section2包中。

4.2.1 请求客户端

在上文中我用到了org.apache.http.impl.client.HttpClients#createDefault创建了一个默认的CloseableHttpClient的请求客户端。但实际上CloseableHttpClient类的设置细节非常多,对于实际的性能测试影响也不尽相同。下面我们来逐一介绍几个重量级的设置项。

1. HttpClientConnectionManager

HTTP请求客户端最重要的是连接管理器org.apache.http.conn.HttpClientConnectionManager,在性能测试场景下,我们选择连接池管理器PoolingHttpClientConnectionManager作为该接口的实现类。有关于池化这个概念,在性能测试中会经常遇到,我在后面章节会详细讲解。

要创建连接池管理器,首先要创建一个连接工厂(ConnectionSocketFactory)的注册表(Registry),用于处理 HTTP 和 HTTPS 连接。代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create() // 创建套接字注册器  
        .register("http", PlainConnectionSocketFactory.INSTANCE) // 注册http套接字工厂  
        .register("https", new SSLConnectionSocketFactory(createIgnoreVerifySSL(), NoopHostnameVerifier.INSTANCE)) // 注册https套接字工厂  
        .build(); // 创建套接字注册器  

其中两次调用了register()方法分别创建了httphttps套接字连接工厂,用于创建非加密和加密的HTTP连接。在注册https套接字工厂类时用到了createIgnoreVerifySSL()方法来创建自定义的SSL配置,并且使用NoopHostnameVerifier.INSTANCE当作主机验证对象,创建了SSLConnectionSocketFactory对象。该方法不进行主机名验证,有一定的安全风险,通常在测试或不需要主机名验证的情况使用。在实际应用中,处理 SSL/TLS 连接时需要谨慎并正确验证证书,确保连接的安全性。

createIgnoreVerifySSL()方法内容如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**  
 * 获取SSL套接字对象 重点重点:设置tls协议的版本  
 * @return  
 */  
private static SSLContext createIgnoreVerifySSL() {  
    SSLContext sslContext = null; // 创建套接字对象  
    try {  
        sslContext = SSLContext.getInstance(SSL_VERSION); // 指定TLS版本  
    } catch (NoSuchAlgorithmException e) {  
        e.printStackTrace();  
    }  
    // 实现X509TrustManager接口,用于绕过验证  
    X509TrustManager trustManager = new X509TrustManager() {  
        @Override
        public void checkClientTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate, String paramString) {}  
        @Override
        public void checkServerTrusted(java.security.cert.X509Certificate[] paramArrayOfX509Certificate, String paramString) {}  
        @Override
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {  
            returnnull;  
        }  
    };  
    try {  
        sslContext.init(null, new TrustManager[]{trustManager}, null); // 初始化sslContext对象  
    } catch (KeyManagementException e) {  
        e.printStackTrace();  
    }  
    return sslContext;  
}  

下面创建一个PoolingHttpClientConnectionManager对象,并且对其中重要参数进行配置,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry, getDnsResolver()); // 创建连接池管理器  
MessageConstraints messageConstraints = MessageConstraints.custom().setMaxHeaderCount(MAX_HEADER_COUNT).setMaxLineLength(MAX_LINE_LENGTH).build();  
ConnectionConfig connectionConfig = ConnectionConfig.custom()  
        .setMalformedInputAction(CodingErrorAction.IGNORE)  
        .setUnmappableInputAction(CodingErrorAction.IGNORE)  
        .setCharset(DEFAULT_CHARSET)  
        .setMessageConstraints(messageConstraints)  
        .build(); // 创建连接配置  
connManager.setDefaultConnectionConfig(connectionConfig); // 设置默认连接配置  
connManager.setMaxTotal(MAX_TOTAL_CONNECTION); // 设置最大连接数  
connManager.setDefaultMaxPerRoute(MAX_PER_ROUTE_CONNECTION); // 设置每个路由最大连接数  

第一行构造方法中,用到了第二个参数DnsResolver,本地自定义DNS解析器,通常用来将主机名/域名解析到对应的IP地址上。在HttpClient中,自定义的DNS解析器可以在特定主机名/域名进行解析时,按照自定义的逻辑进行。通常用于进行DNS解析结果的保存,减少查询DNS查询次数,提升程序整体性能,另外还可以用来实现本地负载均衡策略和对特定域名的解析。 其他代码均为配置功能,其中一类是连接数量的配比限制,另外一类则是单个连接的属性设置。唯一例外的就是默认字符集的配置。在实际性能测试当中,这些配置的值均需要根据实际情况而定,而且不会频繁改动,可以使用配置文件或者写到常量类中。下面是常量的默认配置以及含义:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**  
 * 默认字符集,用于请求体和响应体的解析  
 */  
publicstatic Charset DEFAULT_CHARSET = Charset.forName("UTF-8");  

/**  
 * 最大连接数,连接池最大连接数,单位个  
 */
publicstaticint MAX_TOTAL_CONNECTION = 8000;  

/**  
 * 每个路由最大连接数,路由是对maxTotal的细分,例如:一个域名对应一个路由,一个ip对应一个路由  
 */
publicstaticint MAX_PER_ROUTE_CONNECTION = 1000;  

/**  
 * 最大请求头数量,单位个  
 */
publicstaticint MAX_HEADER_COUNT = 100;  

/**  
 * 最大请求行长度,单位字符  
 */
publicstaticint MAX_LINE_LENGTH = 10000;  

/**  
 * SSL版本,默认TLSv1.2  
 */
publicstatic String SSL_VERSION = "TLSv1.2";  
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-04-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C#开发BIMFACE系列50 Web网页中使用jQuery加载模型与图纸
在前一篇博客《C#开发BIMFACE系列49 Web网页集成BIMFACE应用的技术方案》中介绍了目前市场主流的Web开发技术与应用框架,其中前端脚本的应用在国内分2大派系 jQuery 与 Vue.js。
张传宁IT讲堂
2021/10/21
8680
C#开发BIMFACE系列37 网页集成开发1:审图系统中加载模型或图纸
在之前的《C#开发BIMFACE系列》中主要介绍了BIMFACE平台提供的服务端API接口的封装开发与测试过程。
张传宁IT讲堂
2020/03/18
8030
C#开发BIMFACE系列37 网页集成开发1:审图系统中加载模型或图纸
C#开发BIMFACE系列42 服务端API之图纸对比
在我的前一篇博客《C#开发BIMFACE系列41 服务端API之模型对比》中详细介绍了BIMFACE服务端接口模型对比的功能。 BIMFACE官方文档提供的三维模型对比接口同样也适用于二维CAD图纸对比。下图中是官方提供的对比示例程序。
张传宁IT讲堂
2021/10/13
6110
C#开发BIMFACE系列46 服务端API之离线数据包下载及结构详解
在前一篇博客《C#开发BIMFACE系列45 服务端API之创建离线数据包》中通过调用接口成功的创建一个离线数据包
张传宁IT讲堂
2021/10/18
6850
C#开发BIMFACE系列38 网页集成开发2:审图系统中的模型或图纸批注
在运维或协同的场景中,经常需要对模型或图纸进行批注,及时记录已发现的问题并交给相关负责的人员。
张传宁IT讲堂
2020/03/18
9840
C#开发BIMFACE系列38 网页集成开发2:审图系统中的模型或图纸批注
C#开发BIMFACE系列39 网页集成开发3:审图系统中三维模型比对
  在建筑施工图审查系统中,设计单位提交设计完成的模型/图纸,审查专家审查模型/图纸。审查过程中如果发现不符合规范的地方,则流程退回到设计单位,设计单位人员根据审查意见重新调整设计,调整完成后再次提交到审查专家。此时为了便于专家审查,需要知道当前轮次的模型/图纸与上一轮次的模型/图纸发生了哪些异动,针对异动情况进行审查即可。
张传宁IT讲堂
2020/04/30
4340
C#开发BIMFACE系列39 网页集成开发3:审图系统中三维模型比对
C#开发BIMFACE系列15 服务端API之获取模型的View token
在《C#开发BIMFACE系列3 服务端API之获取应用访问凭证AccessToken》中详细介绍了应用程序访问API的令牌凭证。我们知道 Access token 代表自身应用的身份,使用应用的 appkey, secret,通过调用/oauth2/token接口获取。BIMFACE所有的接口调用都需要传递 Access token 。
张传宁IT讲堂
2019/09/18
6480
C#开发BIMFACE系列49 Web网页中加载模型与图纸的技术方案
C#开发BIMFACE系列3 服务端API之获取应用访问凭证AccessToken
张传宁IT讲堂
2021/10/20
1.9K0
C#开发BIMFACE系列45 服务端API之创建离线数据包
BIMFACE的常规应用方式有公有云与私有化部署两种方式,并且浏览模型或者图纸需要使用ViewToken,ViewToken 有效期为12小时,过期后需要调用接口重新生成。该过程稍微有点麻烦且性能可能受到网络等环境的影响。本文介绍第三种更加便捷高效的方式。
张传宁IT讲堂
2021/10/18
3660
C#开发BIMFACE系列29 服务端API之获取模型数据14:获取图纸列表
一个三维模型中可能包含对应多张二维图纸列表,本篇主要介绍如何获取模型文件对应的图纸列表。
张传宁IT讲堂
2019/09/18
5430
C#开发BIMFACE系列29 服务端API之获取模型数据14:获取图纸列表
C#开发BIMFACE系列43 服务端API之图纸拆分
在上一篇博客《C#开发BIMFACE系列42 服务端API之图纸对比》的最后留了一个问题,在常规业务场景下,一个.dwg文件中包含多个图框,如下图
张传宁IT讲堂
2021/10/15
4010
C#开发BIMFACE系列26 服务端API之获取模型数据11:获取单个面积分区信息
在《C#开发BIMFACE系列25 服务端API之获取模型数据9:获取楼层对应面积分区列表》一文中介绍了如何获取单个模型中单个楼层包含的面积分区列表。有了面积分区列表之后,即可查询单个面积分区的具体信息。
张传宁IT讲堂
2019/09/18
4290
C#开发BIMFACE系列26 服务端API之获取模型数据11:获取单个面积分区信息
C#开发BIMFACE系列41 服务端API之模型对比
  在建筑施工图审查系统中,设计单位提交设计完成的模型/图纸,审查专家审查模型/图纸。审查过程中如果发现不符合规范的地方,则流程退回到设计单位,设计单位人员根据审查意见重新调整设计,调整完成后再次提交到审查专家。此时为了便于专家审查,需要知道当前轮次的模型/图纸与上一轮次的模型/图纸发生了哪些异动,针对异动情况进行审查即可。
张传宁IT讲堂
2021/10/13
3700
C#开发BIMFACE系列18 服务端API之获取模型数据3:获取构件属性
请求地址:GET https://api.bimface.com/data/v2/files/{fileId}/elements/{elementId}
张传宁IT讲堂
2019/09/18
6340
C#开发BIMFACE系列18 服务端API之获取模型数据3:获取构件属性
C#开发BIMFACE系列27 服务端API之获取模型数据12:获取构件分类树
BIMFACE官方示例中,加载三维模型后,模型浏览器中左上角默认提供了“目录树”的功能,清晰地展示了模型的完整构成及上下级关系。
张传宁IT讲堂
2019/09/18
9240
C#开发BIMFACE系列27 服务端API之获取模型数据12:获取构件分类树
C#开发BIMFACE系列1 BIMFACE 简介
BIMFACE 是广联达公司旗下的一款具有完全自主知识产权的BIM轻量化引擎,建筑行业的软件开发者可在BIMFACE所提供的基础功能上进行二次开发,为终端用户提供更加丰富、更有价值的BIM应用。
张传宁IT讲堂
2019/09/18
1.4K0
C#开发BIMFACE系列1 BIMFACE 简介
C#开发BIMFACE系列30 服务端API之模型对比1:发起模型对比
  在实际项目中,由于需求变更经常需要对模型文件进行修改。为了便于用户了解模型在修改前后发生的变化,BIMFACE提供了模型在线对比功能,可以利用在线的模型对比接口,通过简单的四个步骤实现模型在线对比。模型对比可以对两个文件/模型进行差异性分析,确定两个文件/模型之间构件的几何和属性差异,包括增加的构件、删除的构件和修改的构件。 模型对应可以用于进行文件/模型的版本对比。
张传宁IT讲堂
2020/03/18
4630
C#开发BIMFACE系列11 服务端API之源文件删除
通过BIMFACE控制台或者调用服务接口上传文件成功后,如果不再需要该文件,则可以通过BIMFACE平台提供的“源文件删除”服务接口删除具体的文件。下面详细介绍其使用方法。
张传宁IT讲堂
2019/09/18
4580
C#开发BIMFACE系列11 服务端API之源文件删除
C#开发BIMFACE系列40 服务端API之模型集成
  随着建筑信息化模型技术的发展,越来越多的人选择在云端浏览建筑模型。现阶段的云端模型浏览大多是基于文件级别,一次只可以浏览一个模型文件中的内容。而在工程项目模型设计的过程中,通常由多个设计师协同设计,不同的设计师负责不同的专业领域(例如建筑、结构、水电等)。如果想要在云端浏览整个项目工程,就需要把这些组成部分集成起来一起展示。更近一步,如果要在集成的模型之上进行业务集成的话,就要求在集成过程中对构件按单体,楼层,专业,构件分类,系统类型等进行分类或映射。
张传宁IT讲堂
2021/10/13
5790
C#开发BIMFACE系列19 服务端API之获取模型数据4:获取多个构件的共同属性
在前几篇博客中介绍了一个三维文件/模型包含多个构建,每个构建又是由多种材质组成,每个构建都有很多属性。不同的构建也有可能包含相同的属性。
张传宁IT讲堂
2019/09/18
6650
C#开发BIMFACE系列19 服务端API之获取模型数据4:获取多个构件的共同属性
推荐阅读
相关推荐
C#开发BIMFACE系列50 Web网页中使用jQuery加载模型与图纸
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验