0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

架构分析高效HTTP客户端OkHttp有什么优势

汽车玩家 来源:IT知识课堂 作者:IT知识课堂 2020-05-05 23:13 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

精髓

在OkHttp3中,其灵活性很大程度上体现在,可以拦截其任意一个环节,而这个优势便是okhttp3整个请求响应架构体系的精髓所在:

架构分析高效HTTP客户端OkHttp有什么优势

Okhttp请求流程

在OkHttp3中,每一个请求任务都封装为一个Call,其实现为RealCall。

而所有的策略几乎都可以通过OkHttpClient传入

所有全局策略与数据,除了存储在允许上层访问的OkHttpClient实例以外,还有一部分是存储在只允许包可见的Internal.instance中(如连接池、路由黑名单等)

OkHttp中用户可传入的interceptor分为两类,一类是全局interceptor,该类interceptor在请求开始之前最早被调用,另外一类为非网页请求的networkInterceptor,这类interceptor只有在非网页请求中会被调用,并且是在组装完成请求之后,真正发起请求之前被调用(这块具体可以参看RealCall#getResponseWithInterceptorChain()方法)

整个请求过程通过RealInterceptorChain#proceed来连接,在每个interceptor中调用下一个interceptor来完成整个请求流程,并且在回到当前interceptor后完成响应处理

在异步请求中,我们通过Callback来获得简单清晰的请求回调(onFailure、onResponse)

在OkHttpClient中,我们可以传入EventListener的工厂方法,为每一个请求创建一个EventListener,来接收非常细的事件回调

架构分析高效HTTP客户端OkHttp有什么优势

完整interceptor-chain

OkHttp3中的线程池

OkHttp 中的对所有的任务采用 NamedRunnable,约束每个执行单元给出对应的业务名称,以便于线程维护。

1.异步请求线程池-OkHttp Dispatcher

架构分析高效HTTP客户端OkHttp有什么优势

该线程池与Android下的 Executors.newCachedThreadPool() 比较类似;

无任务上限,自动回收闲置60s的线程,适用于大量耗时较短的任务;

虽然线程池无任务上限,但是Dispatcher对入口enqueue()进行了把关,最大的异步任务数默认是64,同一个主机默认是5,当然这两个默认值是可以修改的,Dispatcher提供的修改接口

架构分析高效HTTP客户端OkHttp有什么优势

通过两个双端队列来维护准备执行的任务和正在执行的任务:Deque readyAsyncCalls, Deque runningAsyncCalls;

在每个任务结束时,都会检查 readyAsyncCalls 是否有任务,在条件满足的情况下,按照先进先出的原则将任务移动到 runningAsyncCalls中,并在线程池中执行;

架构分析高效HTTP客户端OkHttp有什么优势

异步请求线程池

2.连接池清理线程池-OkHttp ConnectionPool

架构分析高效HTTP客户端OkHttp有什么优势

该线程池用来清理长时间闲置的和泄漏的连接;

该线程池本身无任务上限,线程闲置60s自动回收;

虽然任务无上限,但其通过 cleanupRunning 标记来控制只有一个线程在运行,当连接池中没有连接后才会被重新设置为 false;

架构分析高效HTTP客户端OkHttp有什么优势

次工作线程会不断地清理,当清理完一遍后超时连接后,根据当前连接池中最近的下一个空闲超时连接计算出一个阻塞时间并阻塞,直到连接池中没有任何连接才结束,并将 cleanupRunning 设为 false;

在每次有连接加入连接池时,如果当前没有清理任务运行,会加入一个清理任务到到线程池中执行;

架构分析高效HTTP客户端OkHttp有什么优势

架构分析高效HTTP客户端OkHttp有什么优势

连接池清理线程池

3. 缓存整理线程池-OkHttp DiskLruCache

架构分析高效HTTP客户端OkHttp有什么优势

该线程池用于整理本地请求缓存数据;

缓存的整理包含: 达到阀值大小的文件,删除最近最少使用的记录,在有关操作达到一定数量以后对记录进行重建;

最大运行线程数1,无需考虑线程安全问题,自动回收闲置60s的线程;

4. HTTP2异步事务线程池-OkHttp Http2Connection

HTTP2采用了多路复用,因此需要维护连接有效性,本线程池就是用于维护相关的各类HTTP2事务;

线程池本身无任务上限,自动回收闲置60s的线程;

每一个HTTP2连接都有这么一个线程池存在;

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 存储
    +关注

    关注

    13

    文章

    4883

    浏览量

    90251
  • HTTP
    +关注

    关注

    0

    文章

    538

    浏览量

    35550
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Yearning+客户端+手工EXPLAIN,NineData社区版能作为替代方案?

    Yearning 核心聚焦 SQL 审核与发布流程,慢 SQL 治理需搭配客户端和手工分析,链路割裂。NineData 社区版以数据库 DevOps 为底座,打通慢日志采集、模板聚合、诊断优化
    的头像 发表于 03-26 10:52 101次阅读
    Yearning+<b class='flag-5'>客户端</b>+手工EXPLAIN,NineData社区版能作为替代方案?

    EtherCAT FOE工作原理揭秘:客户端-服务器模型如何运转?

    上期我们聊了EtherCATFOE的五大应用场景,本期深入解析其底层工作机制。FOE究竟是如何实现文件传输的?答案藏在客户端-服务器模型中。核心架构:一客户端多服务器在EtherCAT网络中,FOE
    的头像 发表于 03-02 11:50 205次阅读
    EtherCAT FOE工作原理揭秘:<b class='flag-5'>客户端</b>-服务器模型如何运转?

    HTTP通信网关是什么?什么功能?

    的详细说明: 核心功能 协议转换(核心角色) 场景 :当客户端使用HTTP协议请求非HTTP服务(如FTP、数据库查询)时,网关作为“翻译器”将HTTP请求转换为目标协议(如FTP命令
    的头像 发表于 12-23 11:14 605次阅读

    agile_ftp传输文件时客户端报错误怎么解决?

    ]客户端使用的filezilla [size=21.3333px] [size=21.3333px]现象: [size=21.3333px]filezilla客户端可以正常上传文件,但传输完毕时客户端会报
    发表于 11-05 10:49

    libmodbus库问题:TCP模式下客户端超时断开后无法再次重连怎么解决?

    情况1 :用libmodbus的TCP demo,发现用客户端软件连接收发如果超时后在启动连接就无法连接上libmodbus服务器了,声明:客户端此时不会主动断开连接。 情况2:客户端用短连接
    发表于 10-14 08:17

    OrangePi Zero 3,轻量级客户端的完美选择

    千兆以太网端口用于充电的USB-C接口我很喜欢在较小的单板计算机(SBC)上看到以太网端口,因为这使它们作为瘦客户端更有用,而且对于这种尺寸的单板计算机来说,充裕的
    的头像 发表于 09-12 13:44 1532次阅读
    OrangePi Zero 3,轻量级<b class='flag-5'>客户端</b>的完美选择

    SOLIDWORKS PDM Professional安装部署指南:从服务器到客户端的详细步骤

    一份详尽的SOLIDWORKS PDM Professional安装指南,面向IT管理员,涵盖从SQL Server配置、服务器安装到客户端设置的全过程,确保您高效、正确地完成PDM系统部署
    的头像 发表于 09-11 17:37 1955次阅读

    Python modbus-tk如何获得客户端信息?

    Python modbus-tk如何获得客户端信息
    发表于 08-07 06:01

    请问IG502网关如何配置open vpn客户端

    网上找的教程配置open vpn,服务端正常,小图标已经变绿。IG502网关做客户端的话需要怎么配置?需要注意哪里?
    发表于 08-05 07:59

    是否可以将客户端控件与CYW920706WCDEVAL一起使用?

    是否可以将客户端控件与CYW920706WCDEVAL一起使用? 我想用它来发现蓝牙 BR/EDR,然后将其与其他设备配对。 客户端控制的下载链接或文档吗? 另外,你 AIROC
    发表于 07-04 07:50

    极简教程:快速在树莓派上运行OpenVPN客户端

    这两样东西后,你需要:1.准备服务器2.配置客户端3.测试连接准备服务器:假设你已经了OpenVPN服务器,你需要:提供客户端配置为树莓派设置静态IP地址1.提
    的头像 发表于 06-25 18:00 1634次阅读
    极简教程:快速在树莓派上运行OpenVPN<b class='flag-5'>客户端</b>!

    Modbus TCP连接多个客户端解决方法-深圳市振鑫通信科技

    ZP-MBS008多主站模块是实现Modbus-TCP连接多个客户端或者服务器通讯设备
    的头像 发表于 06-25 11:07 1954次阅读
    Modbus TCP连接多个<b class='flag-5'>客户端</b>解决方法-深圳市振鑫通信科技

    请问Phy DLE Max TX Octets 由客户端还是服务器控制?

    Phy DLE Max TX Octets 由客户端还是服务器控制?
    发表于 06-25 08:28

    客户端解决方案:树莓派电脑助力企业实现碳中和目标!

    Losingthewires通过帮助企业转向RaspberryPi管理的瘦客户端,减少对台式电脑的依赖,使商业世界更加可持续,并助力企业实现碳中和目标
    的头像 发表于 06-22 20:33 778次阅读
    瘦<b class='flag-5'>客户端</b>解决方案:树莓派电脑助力企业实现碳中和目标!

    不用联网不用编程,PLC通过智能网关快速实现HTTP协议JSON格式与MES等系统平台双向数据通讯

    智能网关IGT-DSER支持POST/GET/PUT等多种方法,可同时作为HTTP协议的客户端和服务。作为客户端通讯时将JSON文件提交给HTTP
    的头像 发表于 05-13 14:40 1381次阅读
    不用联网不用编程,PLC通过智能网关快速实现<b class='flag-5'>HTTP</b>协议JSON格式与MES等系统平台双向数据通讯