当前位置: 首页 > news >正文

httpclient连接池

HttpClient4.5.2 连接池原理及注意事项

 

随着微服务的流行,服务之间的http调用越来越多,遇到的问题也比较多,写这边文章的目的也是将自己遇到的坑和解决方案跟大家分享

一、为什么要用Http连接池

1、降低延迟:如果不采用连接池,每次连接发起Http请求的时候都会重新建立TCP连接(经历3次握手),用完就会关闭连接(4次挥手),如果采用连接池则减少了这部分时间损耗,别小看这几次握手,本人经过测试发现,基本上3倍的时间延迟

2、支持更大的并发:如果不采用连接池,每次连接都会打开一个端口,在大并发的情况下系统的端口资源很快就会被用完,导致无法建立新的连接

二、代码

1、HttpConnectionManager.java连接池管理类,支持https协议

@Component

public class HttpConnectionManager {

    PoolingHttpClientConnectionManager cm = null;
    
    @PostConstruct
    public void init() {
        LayeredConnectionSocketFactory sslsf = null;
        try {
            sslsf = new SSLConnectionSocketFactory(SSLContext.getDefault());
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }

        
        Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory> create()
                .register("https", sslsf)
                .register("http", new PlainConnectionSocketFactory())
                .build();
        cm =new PoolingHttpClientConnectionManager(socketFactoryRegistry);
        cm.setMaxTotal(200);
        cm.setDefaultMaxPerRoute(20);
    }

    public CloseableHttpClient getHttpClient() {       
        CloseableHttpClient httpClient = HttpClients.custom()
                .setConnectionManager(cm)
                .build();          
        
        /*CloseableHttpClient httpClient = HttpClients.createDefault();//如果不采用连接池就是这种方式获取连接*/
        return httpClient;
    }
}

2、连接池消费类:HaoMaiClient.java

@Component
public class HaoMaiClient {
    @Autowired
    HttpConnectionManager connManager;
    
    public <T> T get(String path,Class<T> clazz){
        CloseableHttpClient httpClient=connManager.getHttpClient();
        HttpGet httpget = new HttpGet(path);
        String json=null;        
        CloseableHttpResponse response=null;
        try {
            response = httpClient.execute(httpget);
            InputStream in=response.getEntity().getContent();
            json=IOUtils.toString(in);
            in.close();
        } catch (UnsupportedOperationException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {            
            if(response!=null){
            try {
                response.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            }            
        }                
        return JSON.parseObject(json, clazz);
    }

}

三、原理及注意事项

连接池中连接都是在发起请求的时候建立,并且都是长连接

HaoMaiClient.java中的in.close();作用就是将用完的连接释放,下次请求可以复用,这里特别注意的是,如果不使用in.close();而仅仅使用response.close();结果就是连接会被关闭,并且不能被复用,这样就失去了采用连接池的意义。

连接池释放连接的时候,并不会直接对TCP连接的状态有任何改变,只是维护了两个Set,leased和avaliabled,leased代表被占用的连接集合,avaliabled代表可用的连接的集合,释放连接的时候仅仅是将连接从leased中remove掉了,并把连接放到avaliabled集合中

本着人人为我,我为人人的思想,第一次写技术博客,欢迎大家提出有建设性的意见。

转载于:https://www.cnblogs.com/panxuejun/p/7650385.html

相关文章:

  • JS判断键盘是否按的回车键并触发指定按钮点击操作
  • 根据ip抓 包
  • Mac下Tomcat安装配置80默认端口设置
  • Jzoj4699 Password
  • (十)T检验-第一部分
  • [Bzoj4722]由乃(线段树好题)(倍增处理模数小快速幂)
  • JAVA-JSP内置对象之request对象的其他方法
  • SVN冲突解决
  • JavaScript table动态生成数据
  • python-爬虫day1
  • 调用自定义验证码出现的问题
  • 程序媛,坚持这几个好习惯让你越来越美
  • 从零开始学习springBoot3(自定义json解析框架)
  • unity ugui图片自适应文字内容大小
  • Maven学习总结(四)——Maven核心概念
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Android优雅地处理按钮重复点击
  • AngularJS指令开发(1)——参数详解
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Java的Interrupt与线程中断
  • Java读取Properties文件的六种方法
  • jquery cookie
  • js学习笔记
  • oldjun 检测网站的经验
  • PHP变量
  • Spring Cloud中负载均衡器概览
  • SQLServer之索引简介
  • 编写高质量JavaScript代码之并发
  • 大数据与云计算学习:数据分析(二)
  • 翻译:Hystrix - How To Use
  • 记一次用 NodeJs 实现模拟登录的思路
  • 嵌入式文件系统
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 我的业余项目总结
  • 自定义函数
  • AI算硅基生命吗,为什么?
  • scrapy中间件源码分析及常用中间件大全
  • 移动端高清、多屏适配方案
  • # Panda3d 碰撞检测系统介绍
  • #define
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #vue3 实现前端下载excel文件模板功能
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (33)STM32——485实验笔记
  • (二)windows配置JDK环境
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • .net core Swagger 过滤部分Api
  • .Net CoreRabbitMQ消息存储可靠机制
  • .Net7 环境安装配置