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

    文章

    3941

    浏览量

    84948
  • HTTP
    +关注

    关注

    0

    文章

    468

    浏览量

    30476
收藏 人收藏

    评论

    相关推荐

    求助,关于ESP32C3 TCP客户端连接断线问题求解

    ESP32C3开启AP模式做TCP服务器,手机做客户端连接服务器;超过默认最大连接数(5)以后,即使部分客户端断开了,也无法再发起连接连接不上。一定需要服务器给客户端发送数据,确认
    发表于 06-27 07:54

    请问esp32能支持多个客户端同时连接吗?

    根据我现在的测试结果,esp32作为ble server时同时支持一个客户端连接,前一个客户端必须断开蓝牙连接,后一个才能连接。实际esp32能支持多个客户端同时连接吗?有没有相关例程?
    发表于 06-11 06:25

    AIROC客户端控制应用程序不起作用的原因?

    正常,但当启动客户端控制应用程序并打开串行端口时,却什么也没发生--所有控件都是灰色的。 然后,我还按照说明中的建议从 Windows 10 PC 上运行 BTSpy 并进行连接 - 客户端控制应用程序
    发表于 05-21 06:56

    使用FreeRTOS+LwIP开发版做客户端断开后不能够重新连接?

    请教下, 使用FreeRTOS+LwIP 开发版做客户端断开后不能够重新连接 ? 具体描述如下: 1、开发版作为客户端使用 2、初次上电能够正常通讯,也就是 开发板可以发送数据到服务器
    发表于 04-30 07:48

    stm32 +lwip1.3.1客户端异常导致网络ping不通怎么解决?

    stm32上运行lwip作为服务器,如果客户端异常了,发现在客户端再也ping不通 网络如果异常,交换机挂了,重启后,客户端怎么都ping不通stm32 有没有遇到同样的问题? 不是tcp的pcb被占用,ping都不能通,lw
    发表于 04-22 07:30

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

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

    在esp8266中内置客户端WEB,请问固件版本的要求吗?

    各位大神好!我想在8266中内置客户端WEB,请问固件版本的要求吗?WEB内容是不是可以自己定制?有没有相关方面的资料吗?我在上看到《esp8266从零快速开发教程》,但是链接已经失效了,有没有相关的资料推荐,谢谢!
    发表于 11-08 08:07

    如何使用ESP8266搭建MQTT客户端

    手头一块ESP8266的板子,想搭建一个MQTT客户端,该如何实现呢?
    发表于 11-07 06:36

    安信可Ai-WB2模组HTTP 客户端 POST请求方法

    文章目录 一、准备工作 二、连接路由器 三、HTTP客户端POST请求方法(适用于POST少量数据) 四、HTTP 客户端 POST 请求方法(推荐方式) 五、联系我们 01 准备工作
    的头像 发表于 10-30 17:27 417次阅读
    安信可Ai-WB2模组<b class='flag-5'>HTTP</b> <b class='flag-5'>客户端</b> POST请求方法

    AT32基于FreeRTOS的AWS MQTT客户端

    AT32基于FreeRTOS的AWS MQTT客户端建立一个MQTT客户端与 AWS IoT Core进行通讯,用户可以基于这个范例去开发属于自己的应用。
    发表于 10-26 06:03

    安信可Ai-WB2模组HTTP 客户端 HEAD和GET 请求方法

    文章目录 一、准备工作 二、连接路由器 三、HTTP客户端HEAD请求方法 四、HTTP 客户端 GET 请求方法 五、联系我们 01 准备工作 需要准备的软硬件:Ai-WB2系列模组
    的头像 发表于 10-23 17:41 390次阅读
    安信可Ai-WB2模组<b class='flag-5'>HTTP</b> <b class='flag-5'>客户端</b> HEAD和GET 请求方法

    服务器Server和客户端Client有哪些区别呢?

    例如在使用TCP通讯建立连接时采用客户端服务器模式,这种模式又常常被称为主从式架构,简称为C/S结构,属于一种网络通讯架构,将通讯的双方以客户端(Client )与服务器 (Serve
    的头像 发表于 09-06 16:14 1220次阅读
    服务器Server和<b class='flag-5'>客户端</b>Client有哪些区别呢?

    使用uIP TCP/IP堆叠的TCP客户端实例

    应用程序:使用 uIP TCP/IP 堆叠的 TCP 客户端实例 BSP 版本: M480系列 BSP CMSIS v3.03.001 硬件: NuMaker-PFM-M487 VER 3.0
    发表于 08-22 07:47

    MQTT中服务端和客户端

    MQTT 是一种基于客户端-服务端架构(C/S)的消息传输协议,所以在 MQTT 协议通信中,有两个最为重要的角色,它们便是服务端和客户端。 1)服务端 MQTT 服务端通常是一台
    的头像 发表于 07-30 14:55 1881次阅读

    HTTP客户端快速入门指南

    HTTP客户端快速入门指南
    发表于 07-03 18:38 0次下载
    <b class='flag-5'>HTTP</b><b class='flag-5'>客户端</b>快速入门指南