栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

面试系列——OkHttp使用和原理分析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

面试系列——OkHttp使用和原理分析

OkHttp 框架分析

基于OkHttp 3.4.0.

支持的协议

HTTP 1.1 HTTP2 SPDY_3

重要类 OkHttpClient

构造Call 请求 , 用来发送Http请求 和 读取返回内容。

Request 和 Response

request 代表一个请求,不可变
response 代表一个响应 可变

Call 和 RealCall

负责请求的调度(同步的话走当前线程发送请求,异步的话则使用OkHttp内部的线程池进行);同时负责构造内部逻辑责任链,并执行责任链相关的逻辑,直到获取结果。虽然OkHttpClient是整个OkHttp的核心管理类,但是真正发出请求并且组织逻辑的是RealCall类,它同时肩负了调度和责任链组织的两大重任。

Dispatcher

请求调度类,管理异步请求的调度策略
最大并发数 64 单个host 最大并发数 5
异步请求执行队列
异步请求等待队列
同步请求执行队列

优势

调度线程池Disptcher实现了高并发,低阻塞的实现采用Deque作为缓存,先进先出的顺序执行任务在try/finally中调用了finished函数,控制任务队列的执行顺序,而不是采用锁,减少了编码复杂性提高性能 ConnectionPool

请求连接池,Address相同 则可以复用连接,目的是复用socket网络连接 提升网络请求效率;

拦截器

client.Interceptors-用户自定义拦截器retryAndFollowUpInterceptor——失败和重定向拦截器BridgeInterceptor——封装request和response拦截器CacheInterceptor——缓存相关的过滤器,负责读取缓存直接返回、更新缓存ConnectInterceptor——连接服务,负责和服务器建立连接 这里才是真正的请求网络CallServerInterceptor——执行流操作(写出请求体、获得响应数据) 负责向服务器发送请求数据、从服务器读取响应数据 进行http请求报文的封装与请求报文的解析 关于 OKIO

OkHttp 内部采用 OKIO 来实现 网络IO 磁盘IO 操作,OKIO 是在Java IO 的基础上 进行二次封装,并不是重新构造了一套新的IO方法

原生IO存在的问题:

原生IO API 不够简洁,buffer缓存无法复用 不够高效,无超时机制,通过超时机制来实现socket的释放;

OKIO 解决的问题;
    易于使用,抽象sink (输出流)source(输入流) 方法优化buffer缓存,采用SegmentPool 优化内存缓存,避免频繁内存copy超时机制,AsyncTimeout ,通过WatchDog 守护线程 触发超时;封装了Gzip 流解压缩的细节,供OkHttp 调用;
设计模式 单例模式

平台的Platform.get()

构造者模式

OkHttpClient 构造,Request 请求的构造;

外观模式

仅通过 OkHttpClient 来封装框架内部细节 ,对外只保留对外核心API;

策略模式

不同的HttpStream 策略

责任链模式

采用拦截器建立网络连接 和管理请求响应等;

享元模式

利用连接池连接复用。;

观察者模式

HTTP 2.0 PushObserver 等。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/749499.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号